diff --git a/frontend/public/locales/ar-AR/translation.json b/frontend/public/locales/ar-AR/translation.json index 4d7618d56..aa560e7a7 100644 --- a/frontend/public/locales/ar-AR/translation.json +++ b/frontend/public/locales/ar-AR/translation.json @@ -1,5 +1,35 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, "unsavedChanges": "لديك تغييرات غير محفوظة على ملف PDF. ماذا تريد أن تفعل؟", + "areYouSure": "Are you sure you want to leave?", "unsavedChangesTitle": "تغييرات غير محفوظة", "keepWorking": "واصل العمل", "discardChanges": "تجاهل التغييرات", @@ -24,8 +54,26 @@ "customTextDesc": "نص مخصص", "numberPagesDesc": "أي الصفحات المراد ترقيمها، الافتراضي 'الكل'، يقبل أيضًا 1-5 أو 2,5,9 إلخ", "customNumberDesc": "الافتراضي هو {n}، يقبل أيضًا 'الصفحة {n} من {total}'، 'نص-{n}'، '{filename}-{n}", - "submit": "إضافة أرقام الصفحات" + "submit": "إضافة أرقام الصفحات", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "اختيار الصفحات المخصص (أدخل قائمة بأرقام الصفحات مفصولة بفواصل 1،5،6 أو دوال مثل 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "اختر PDF", "multiPdfPrompt": "اختر ملفات PDF (2+)", "multiPdfDropPrompt": "حدد (أو اسحب وأفلت) جميع ملفات PDF التي تحتاجها", @@ -36,7 +84,6 @@ "uploadLimitExceededPlural": "كبيرة جدًا. الحد الأقصى المسموح به هو", "processTimeWarning": "تحذير: يمكن أن تستغرق هذه العملية ما يصل إلى دقيقة حسب حجم الملف", "pageOrderPrompt": "ترتيب الصفحات (أدخل قائمة بأرقام الصفحات مفصولة بفواصل):", - "pageSelectionPrompt": "اختيار الصفحات المخصص (أدخل قائمة بأرقام الصفحات مفصولة بفواصل 1،5،6 أو دوال مثل 2n+1):", "goToPage": "اذهب", "true": "صحيح", "false": "خطأ", @@ -47,11 +94,18 @@ "save": "حفظ", "saveToBrowser": "حفظ في المتصفح", "download": "تنزيل", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", "undoOperationTooltip": "انقر للتراجع عن آخر عملية واستعادة الملفات الأصلية", "undo": "تراجع", "moreOptions": "خيارات إضافية", "editYourNewFiles": "حرّر ملفاتك الجديدة", "close": "إغلاق", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "المحدد: {{filename}}", "chooseFile": "اختر ملفًا", "filesSelected": "الملفات المحددة", @@ -61,7 +115,9 @@ "uploadFiles": "تحميل ملفات", "addFiles": "إضافة ملفات", "selectFromWorkbench": "اختر ملفات من طاولة العمل أو ", - "selectMultipleFromWorkbench": "اختر على الأقل {{count}} ملفًا من طاولة العمل أو " + "selectMultipleFromWorkbench": "اختر على الأقل {{count}} ملفًا من طاولة العمل أو ", + "created": "Created", + "size": "File Size" }, "noFavourites": "لم تتم إضافة أي مفضلات", "downloadComplete": "إكتمل التحميل", @@ -194,6 +250,7 @@ "title": "هل تريد تحسين Stirling PDF؟", "paragraph1": "Stirling PDF يحتوي على إحصائيات مختصة للمساعدة في تحسين المنتج. لا نتبع أي معلومات شخصية أو محتوى الملفات.", "paragraph2": "يرجى مراعاة تفعيل الإحصائيات لمساعدتنا على نمو Stirling-PDF وتوفير فهم أفضل لمستخدمينا.", + "learnMore": "Learn more", "enable": "تفعيل الإحصائيات", "disable": "تعطيل الإحصائيات", "settings": "يمكنك تغيير إعدادات الإحصائيات في ملف config/settings.yml" @@ -237,6 +294,54 @@ "cacheInputs": { "name": "حفظ إدخالات النموذج", "help": "تمكين لتخزين الإدخالات المستخدمة سابقًا للتشغيلات المستقبلية" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -308,8 +413,10 @@ "top20": "أعلى 20", "all": "الكل", "refresh": "تحديث", - "includeHomepage": "تضمين الصفحة الرئيسية ('/')", - "includeLoginPage": "تضمين صفحة تسجيل الدخول ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "إجمالي المسارات", "totalVisits": "إجمالي الزيارات", "showing": "يعرض", @@ -324,7 +431,9 @@ "top": "الأعلى", "numberOfVisits": "عدد الزيارات", "visitsTooltip": "الزيارات: {0} ({1}% من الإجمالي)", - "retry": "إعادة المحاولة" + "retry": "إعادة المحاولة", + "includeHomepage": "تضمين الصفحة الرئيسية ('/')", + "includeLoginPage": "تضمين صفحة تسجيل الدخول ('/login')" }, "database": { "title": "استيراد/تصدير قاعدة البيانات", @@ -365,6 +474,16 @@ "alphabetical": "أبجدي", "globalPopularity": "الشعبية العالمية", "sortBy": "فرز حسب:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { "tags": "متعدد،أدوات", "title": "أداة متعددة PDF", @@ -550,11 +669,6 @@ "title": "Manual Redaction", "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" }, - "overlayPdfs": { - "tags": "تراكب،دمج،تكديس", - "title": "تراكب ملفات PDF", - "desc": "تراكب ملفات PDF فوق ملف PDF آخر" - }, "splitBySections": { "tags": "تقسيم،أقسام،تجزئة", "title": "تقسيم PDF حسب الأقسام", @@ -659,6 +773,15 @@ "tags": "سير عمل،تسلسل،أتمتة", "title": "أتمتة", "desc": "ابنِ تدفّقات عمل متعددة الخطوات بسلسلة إجراءات PDF. مثالي للمهام المتكررة." + }, + "overlay-pdfs": { + "desc": "Overlay one PDF on top of another", + "title": "Overlay PDFs" + }, + "overlayPdfs": { + "tags": "تراكب،دمج،تكديس", + "title": "تراكب ملفات PDF", + "desc": "تراكب ملفات PDF فوق ملف PDF آخر" } }, "landing": { @@ -698,13 +821,19 @@ "merge": { "tags": "دمج,عمليات الصفحة,الخلفية,جانب الخادم", "title": "دمج", - "removeDigitalSignature.tooltip": { - "title": "إزالة التوقيع الرقمي", - "description": "سيتم إبطال التواقيع الرقمية عند دمج الملفات. حدّد هذا لإزالتها من ملف PDF النهائي." + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "إزالة التوقيع الرقمي", + "description": "سيتم إبطال التواقيع الرقمية عند دمج الملفات. حدّد هذا لإزالتها من ملف PDF النهائي." + } }, - "generateTableOfContents.tooltip": { - "title": "إنشاء جدول المحتويات", - "description": "ينشئ تلقائيًا جدول محتويات قابلًا للنقر في PDF المدمج استنادًا إلى أسماء الملفات الأصلية وأرقام الصفحات." + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "إنشاء جدول المحتويات", + "description": "ينشئ تلقائيًا جدول محتويات قابلًا للنقر في PDF المدمج استنادًا إلى أسماء الملفات الأصلية وأرقام الصفحات." + } }, "submit": "دمج", "sortBy": { @@ -842,12 +971,50 @@ "bullet1": "مستوى الإشارة المرجعية: المستوى الذي سيتم التقسيم عنده (1 = المستوى الأعلى)", "bullet2": "تضمين البيانات الوصفية: الحفاظ على خصائص المستند", "bullet3": "السماح بالتكرارات: معالجة أسماء الإشارات المرجعية المكررة" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" } - } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method" }, "rotate": { "title": "تدوير PDF", "submit": "تدوير", + "selectRotation": "Select Rotation Angle (Clockwise)", "error": { "failed": "حدث خطأ أثناء تدوير PDF." }, @@ -935,7 +1102,8 @@ "imagesExt": "صور (JPG, PNG، إلخ.)", "markdown": "Markdown", "textRtf": "نص/RTF", - "grayscale": "تدرج الرمادي" + "grayscale": "تدرج الرمادي", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "تحويل,صورة,jpg,صورة,صورة فوتوغرافية" @@ -973,7 +1141,20 @@ "8": "إزالة الأخير", "9": "إزالة", "10": "دمج فردي-زوجي", - "11": "تكرار كل الصفحات" + "11": "تكرار كل الصفحات", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, "desc": { "CUSTOM": "استخدم تسلسلًا مخصصًا لأرقام الصفحات أو التعابير لتعريف ترتيب جديد.", @@ -1039,7 +1220,9 @@ "opacity": "الشفافية (%)", "spacing": { "horizontal": "التباعد الأفقي", - "vertical": "التباعد الرأسي" + "vertical": "التباعد الرأسي", + "height": "Height Spacing", + "width": "Width Spacing" }, "convertToImage": "تسطيح صفحات PDF إلى صور" }, @@ -1182,6 +1365,10 @@ "bullet4": "أفضل للمحتوى الحساس أو المحمي بحقوق" } } + }, + "type": { + "1": "Text", + "2": "Image" } }, "permissions": { @@ -1255,6 +1442,26 @@ }, "submit": "إزالة الصفحات" }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, "pageSelection": { "tooltip": { "header": { @@ -1295,10 +1502,43 @@ }, "examples": { "title": "أمثلة" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", "header": { "title": "دليل اختيار الصفحات" }, @@ -1604,6 +1844,9 @@ "text": "يعالج ملف PDF النهائي بإزالة شوائب OCR وتحسين طبقة النص لقراءة أفضل وحجم أصغر." } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1766,8 +2009,16 @@ "hint": "ارفع صورة PNG أو JPG لتوقيعك" }, "instructions": { - "title": "كيفية إضافة توقيع" + "title": "كيفية إضافة توقيع", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", "activate": "تفعيل وضع وضع التوقيع", "deactivate": "إيقاف وضع التوقيع", "results": { @@ -1792,7 +2043,10 @@ "options": { "stepTitle": "خيارات التسطيح", "title": "خيارات التسطيح", - "flattenOnlyForms.desc": "تسطيح حقول النماذج فقط مع إبقاء العناصر التفاعلية الأخرى كما هي", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "تسطيح حقول النماذج فقط مع إبقاء العناصر التفاعلية الأخرى كما هي" + }, "note": "التسطيح يزيل العناصر التفاعلية من PDF ويجعله غير قابل للتحرير." }, "results": { @@ -1882,7 +2136,13 @@ "bullet3": "يمكن تعطيله لتقليل حجم ملف الناتج" } }, - "submit": "إزالة الفراغات" + "submit": "إزالة الفراغات", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + } }, "removeAnnotations": { "tags": "تعليقات,تظليل,ملاحظات,علامات,إزالة", @@ -1984,7 +2244,12 @@ "bullet3": "اختر الصفحة التي يوضع فيها التوقيع", "bullet4": "يمكن تضمين شعار اختياري" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, "sign": { "submit": "توقيع PDF", @@ -2045,7 +2310,22 @@ "text": "حوّل ملفك إلى مخزن مفاتيح Java (.jks) باستخدام keytool، ثم اختر JKS." } } - } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Certificate Password", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo" }, "removeCertSign": { "tags": "مصادقة,PEM,P12,رسمي,فك التشفير", @@ -2071,7 +2351,17 @@ "header": "تخطيط متعدد الصفحات", "pagesPerSheet": "الصفحات لكل ورقة:", "addBorder": "إضافة حدود", - "submit": "إرسال" + "submit": "إرسال", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "كتيّب,ترتيب,طباعة,تجليد,تواقيع", @@ -2257,10 +2547,22 @@ "reset": "إعادة التعيين إلى كامل PDF", "coordinates": { "title": "الموضع والحجم", - "x": "موضع X", - "y": "موضع Y", - "width": "العرض", - "height": "الارتفاع" + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } }, "error": { "invalidArea": "منطقة القص تتجاوز حدود PDF", @@ -2278,6 +2580,10 @@ }, "results": { "title": "نتائج القص" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." } }, "autoSplitPDF": { @@ -2488,11 +2794,15 @@ "overlay-pdfs": { "tags": "تراكب", "header": "تراكب ملفات PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "اختر ملف PDF الأساسي" }, "overlayFiles": { - "label": "اختر ملفات PDF للتراكب" + "label": "اختر ملفات PDF للتراكب", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "اختر وضع التراكب", @@ -2502,14 +2812,53 @@ }, "counts": { "label": "عدد التراكبات (لوضع التكرار الثابت)", - "placeholder": "أدخل الأعداد مفصولة بفواصل (مثل 2,3,1)" + "placeholder": "أدخل الأعداد مفصولة بفواصل (مثل 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "اختر موضع التراكب", "foreground": "المقدمة", "background": "الخلفية" }, - "submit": "إرسال" + "submit": "إرسال", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "تقسيم القسم, تقسيم, تخصيص", @@ -2544,7 +2893,18 @@ "customMargin": "هامش مخصص", "customColor": "لون نص مخصص", "submit": "إرسال", - "noStampSelected": "لم يتم اختيار ختم. ارجع إلى الخطوة 1." + "noStampSelected": "لم يتم اختيار ختم. ارجع إلى الخطوة 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "إزالة الصورة,عمليات الصفحة,الخلفية,جانب الخادم" @@ -2562,7 +2922,8 @@ "status": { "_value": "الحالة", "valid": "صالح", - "invalid": "غير صالح" + "invalid": "غير صالح", + "complete": "Validation complete" }, "signer": "الموقّع", "date": "التاريخ", @@ -2589,17 +2950,115 @@ "version": "الإصدار", "keyUsage": "استخدام المفتاح", "selfSigned": "موقّعة ذاتيًا", - "bits": "بت" + "bits": "بت", + "details": "Certificate Details" }, "signature": { "info": "معلومات التوقيع", "_value": "التوقيع", "mathValid": "التوقيع صالح رياضيًا لكن:" }, - "selectCustomCert": "ملف شهادة X.509 مخصص (اختياري)" + "selectCustomCert": "ملف شهادة X.509 مخصص (اختياري)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" + }, + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, "replaceColor": { - "tags": "استبدال اللون،عمليات الصفحة،الواجهة الخلفية،جهة الخادم" + "tags": "استبدال اللون،عمليات الصفحة،الواجهة الخلفية،جهة الخادم", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "تسجيل الدخول", @@ -2632,6 +3091,11 @@ "enterEmail": "أدخل بريدك الإلكتروني", "enterPassword": "أدخل كلمة المرور", "loggingIn": "جارٍ تسجيل الدخول...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", "signingIn": "جارٍ تسجيل الدخول...", "login": "تسجيل الدخول", "or": "أو", @@ -2649,7 +3113,10 @@ "magicLinkSent": "تم إرسال الرابط السحري إلى {{email}}! تفقد بريدك واضغط الرابط لتسجيل الدخول.", "passwordResetSent": "تم إرسال رابط إعادة تعيين كلمة المرور إلى {{email}}! تفقد بريدك واتبع التعليمات.", "failedToSignIn": "فشل تسجيل الدخول بواسطة {{provider}}: {{message}}", - "unexpectedError": "خطأ غير متوقع: {{message}}" + "unexpectedError": "خطأ غير متوقع: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." }, "signup": { "title": "إنشاء حساب", @@ -2672,7 +3139,12 @@ "invalidEmail": "يرجى إدخال عنوان بريد إلكتروني صالح", "checkEmailConfirmation": "تحقّق من بريدك الإلكتروني للعثور على رابط التأكيد لإكمال التسجيل.", "accountCreatedSuccessfully": "تم إنشاء الحساب بنجاح! يمكنك الآن تسجيل الدخول.", - "unexpectedError": "خطأ غير متوقع: {{message}}" + "unexpectedError": "خطأ غير متوقع: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF إلى صفحة واحدة", @@ -2712,10 +3184,23 @@ "adjustContrast": { "title": "ضبط التباين", "header": "ضبط التباين", + "basic": "Basic Adjustments", "contrast": "التباين:", "brightness": "السطوع:", "saturation": "التشبع:", - "download": "تنزيل" + "download": "تنزيل", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "ضغط", @@ -2862,7 +3347,13 @@ "title": "إزالة الصورة", "header": "إزالة الصورة", "removeImage": "إزالة الصورة", - "submit": "إزالة الصورة" + "submit": "إزالة الصورة", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "تجزئة المستند حسب الفصول", @@ -2937,6 +3428,10 @@ "title": "التحليلات", "description": "تساعدنا هذه الملفات على فهم كيفية استخدام أدواتنا، كي نركّز على بناء الميزات الأكثر قيمة لمجتمعنا. كن مطمئنًا—Stirling PDF لا يمكنه ولن يتتبع محتوى المستندات التي تعمل عليها." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, "removeMetadata": { @@ -2998,11 +3493,18 @@ "panMode": "وضع السحب", "rotateLeft": "تدوير لليسار", "rotateRight": "تدوير لليمين", - "toggleSidebar": "تبديل الشريط الجانبي" + "toggleSidebar": "تبديل الشريط الجانبي", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" }, "search": { "title": "بحث PDF", - "placeholder": "أدخل مصطلح البحث..." + "placeholder": "أدخل مصطلح البحث...", + "noResults": "No results found", + "searching": "Searching..." }, "guestBanner": { "title": "أنت تستخدم Stirling PDF كضيف!", @@ -3040,9 +3542,597 @@ "automate": "أتمتة", "files": "الملفات", "activity": "النشاط", + "help": "Help", + "account": "Account", "config": "الإعداد", + "adminSettings": "Admin Settings", "allTools": "كل الأدوات" }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, "fileUpload": { "selectFile": "حدد ملفًا", "selectFiles": "حدد ملفات", @@ -3067,6 +4157,9 @@ "addFiles": "إضافة ملفات", "dragFilesInOrClick": "اسحب الملفات أو انقر \"إضافة ملفات\" للتصفّح" }, + "fileEditor": { + "addFiles": "Add Files" + }, "fileManager": { "title": "تحميل ملفات PDF", "subtitle": "أضف ملفاتك إلى التخزين للوصول إليها بسهولة عبر الأدوات", @@ -3095,6 +4188,7 @@ "lastModified": "آخر تعديل", "toolChain": "الأدوات المطبّقة", "restore": "استعادة", + "unzip": "Unzip", "searchFiles": "ابحث في الملفات...", "recent": "الأخيرة", "localFiles": "الملفات المحلية", @@ -3102,7 +4196,6 @@ "googleDriveShort": "Drive", "myFiles": "ملفاتي", "noRecentFiles": "لم يتم العثور على ملفات حديثة", - "dropFilesHint": "أسقط الملفات هنا للتحميل", "googleDriveNotAvailable": "تكامل Google Drive غير متاح", "openFiles": "فتح ملفات", "openFile": "فتح ملف", @@ -3120,7 +4213,18 @@ "selectedCount": "{{count}} محدد", "download": "تنزيل", "delete": "حذف", - "unsupported": "غير مدعوم" + "unsupported": "غير مدعوم", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "أسقط الملفات هنا للتحميل" }, "storage": { "temporaryNotice": "تُخزَّن الملفات مؤقتًا في متصفحك وقد تُمسح تلقائيًا", @@ -3136,8 +4240,10 @@ "desc": "إزالة العناصر المحتملة الضرر من ملفات PDF.", "submit": "تنظيف PDF", "completed": "اكتملت عملية التنقية بنجاح", - "error.generic": "فشلت عملية التنقية", - "error.failed": "حدث خطأ أثناء تنقية PDF.", + "error": { + "generic": "فشلت عملية التنقية", + "failed": "حدث خطأ أثناء تنقية PDF." + }, "filenamePrefix": "sanitised", "sanitizationResults": "نتائج التنقية", "steps": { @@ -3151,12 +4257,30 @@ "options": { "title": "خيارات التنقية", "note": "اختر العناصر التي تريد إزالتها من PDF. يجب اختيار خيار واحد على الأقل.", - "removeJavaScript.desc": "إزالة إجراءات JavaScript والسكريبتات من PDF", - "removeEmbeddedFiles.desc": "إزالة أي ملفات مضمّنة داخل PDF", - "removeXMPMetadata.desc": "إزالة بيانات XMP الوصفية من PDF", - "removeMetadata.desc": "إزالة معلومات بيانات المستند (العنوان، المؤلف، إلخ)", - "removeLinks.desc": "إزالة الروابط الخارجية وإجراءات التشغيل من PDF", - "removeFonts.desc": "إزالة الخطوط المضمّنة من PDF" + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "إزالة إجراءات JavaScript والسكريبتات من PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "إزالة أي ملفات مضمّنة داخل PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "إزالة بيانات XMP الوصفية من PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "إزالة معلومات بيانات المستند (العنوان، المؤلف، إلخ)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "إزالة الروابط الخارجية وإجراءات التشغيل من PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "إزالة الخطوط المضمّنة من PDF" + } } }, "addPassword": { @@ -3377,9 +4501,14 @@ "remaining": "متبقّي", "used": "مستخدم", "available": "متاح", - "cancel": "إلغاء" + "cancel": "إلغاء", + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { "title": "إعدادات الحساب", @@ -3435,8 +4564,570 @@ "submit": "إضافة المرفقات", "results": { "title": "نتائج المرفقات" + }, + "error": { + "failed": "Add attachments operation failed" } }, "termsAndConditions": "الشروط والأحكام", - "logOut": "تسجيل الخروج" -} \ No newline at end of file + "logOut": "تسجيل الخروج", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or invert colour options", + "2": "Default (preset high contrast colours)", + "3": "Custom (choose your own colours)", + "4": "Full invert (invert all colours)", + "5": "High contrast color options", + "6": "White text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + } +} diff --git a/frontend/public/locales/az-AZ/translation.json b/frontend/public/locales/az-AZ/translation.json index f16b1eecb..7aec771f3 100644 --- a/frontend/public/locales/az-AZ/translation.json +++ b/frontend/public/locales/az-AZ/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Fərdi Mətn", "numberPagesDesc": "Hansı səhifələrin nömrələnəcəyini seçin, default 'all', və ya 1-5, 2,5,9 kimi yazılış qəbul olunur", "customNumberDesc": "Defolt olaraq {n}, və ya 'Page {n} of {total}', 'Text-{n}', '{filename}-{n}", - "submit": "Səhifə Nömrələri əlavə edin" + "submit": "Səhifə Nömrələri əlavə edin", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Xüsusi Səhifə Seçimi (1, 5, 6 tərzində vergüllə ayrılmış səhifə nömrələri listini və ya 2n+1 tərzində Funksiyalar daxil edin) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "PDF(lər)i Seç", "multiPdfPrompt": "PDFləri Seç (2+)", "multiPdfDropPrompt": "Ehtiyacınız olan bütün PDFləri seçin (və ya sürükləyib buraxın)", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Xəbərdarlıq: Bu proses fayl ölçüsündən asılı olaraq bir dəqiqəyə qədər vaxt ala bilər", "pageOrderPrompt": "Xüsusi Səhifə Ardıcıllığı (Vergüllə ayrılmış səhifə nömrələri listini və ya 2n+1 tərzində Funksiyalar daxil edin) :", - "pageSelectionPrompt": "Xüsusi Səhifə Seçimi (1, 5, 6 tərzində vergüllə ayrılmış səhifə nömrələri listini və ya 2n+1 tərzində Funksiyalar daxil edin) :", "goToPage": "Get", "true": "Doğru", "false": "Yanlış", "unknown": "Bilinməyən", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Saxla", "saveToBrowser": "Brauzerdə Saxla", + "download": "Endir", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Bağla", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "seçilmiş fayllar", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Sevimlilər əlavə edilmədi", "downloadComplete": "Yükləmə Tamamlandı", "bored": "Gözləməkdən Sıxıldınız?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF sənədi şifrlənmişdir və şifr təmin edilməmişdir və ya yanlışdır.", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Xəta", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Problem üçün üzr istəyirik!", "needHelp": "Kömək lazımdır / Problem tapdınız?", "contactTip": "Əgər hələ də problem yaşayırsınızsa, kömək üçün bizə müraciət etməkdən çəkinməyin. GitHub səhifəmizdə bilet təqdim edə və ya Discord vasitəsilə bizimlə əlaqə saxlaya bilərsiniz:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Bilet təqdim edin", "discordSubmit": "Discord - Dəstək postunu göndərin" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Sil", "username": "İstifadəçi Adı", "password": "Şifr", @@ -82,6 +169,7 @@ "green": "Yaşıl", "blue": "Mavi", "custom": "Xüsusi...", + "comingSoon": "Coming soon", "WorkInProgess": "İş davam edir, İşləməyə bilər və ya xətalarla üzləşə bilərsiniz, Zəhmət olmasa problemləri bildirin!", "poweredBy": "Təchiz edilmişdir", "yes": "Bəli", @@ -115,12 +203,14 @@ "page": "Səhifə", "pages": "Səhifələr", "loading": "Yüklənir...", + "review": "Review", "addToDoc": "Sənədə Əlavə Et", "reset": "Sıfırla", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Məxfilik Siyasəti", + "iAgreeToThe": "I agree to all of the", "terms": "Qaydalar və Şərtlər", "accessibility": "Əlçatanlıq", "cookie": "Kuki Siyasəti", @@ -160,6 +250,7 @@ "title": "Stirling PDF-i daha yaxşı etmək istəyirsinizmi?", "paragraph1": "Stirling PDF bizə məhsulu inkişaf etdirməyə kömək etmək üçün analitikaya üstünlük verib. Biz heç bir şəxsi məlumatı və ya fayl məzmununu izləmirik.", "paragraph2": "Zəhmət olmasa, Stringling-PDF-ə inkişaf etməkdə və istifadəçilərimizi daha yaxşı anlamaqda yardım etmək üçün analitikanı aktivləşdirməyi nəzərə alın.", + "learnMore": "Learn more", "enable": "Analitikanı aktivləşdir", "disable": "Analitikanı deaktivləşdir", "settings": "Analitikanın parametrlərini config/settings.yml faylından dəyişə bilərsiniz." @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Formada daxil edilən bilgiləri yadda saxlayın", "help": "Gələcək əməliyyatlar üçün əvvəllər istifadə edilmiş daxil edilmiş bilgiləri saxlamağa imkan verin" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Verilənlər bazasını Daxil/Xaric Et", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Multi-alət", "desc": "Səhifələri Birləşdir, Çevir, Yenidən Sırala, Böl və Sil" }, "merge": { + "tags": "combine,join,unite", "title": "Birləşdir", "desc": "Bir neçə PDF-i asanlıqla bir PDF-də birləşdir." }, "split": { + "tags": "divide,separate,break", "title": "Böl", "desc": "PDF-ləri bir neçə sənədə böl" }, "rotate": { + "tags": "turn,flip,orient", "title": "Çevir", "desc": "PDF-lərinizi asanlıqla çevirin." }, + "convert": { + "tags": "transform,change", + "title": "Çevir", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Səhifələri Sırala", + "desc": "Səhifələri Sil/Sırasını Dəyiş" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Şəkil əlavə et", + "desc": "PDF-də təyin edilmiş yerə şəkil əlavə edir" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Watermark əlavə et", + "desc": "PDF sənədinə fərdi watermark əlavə et." + }, + "removePassword": { + "tags": "unlock", + "title": "Şifri Sil", + "desc": "PDF Sənədindən şifr qorumasını götür." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Sıx", + "desc": "PDF fayllarını sıxaraq onların ölçüsünü azalt." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Metadatanı Dəyiş", + "desc": "PDF sənədindəki Metadatanı Dəyiş/Sil/Əlavə et" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Skanları Təmizlə", + "desc": "Skanları təmizləyir və PDF-in içərisindəki şəkillərdəki yazını tapıb mətn olaraq əlavə edir." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Şəkilləri Xaric Et", + "desc": "PDF-dəki şəkilləri xaric edib onları zip faylında saxlayır" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "İmzala", + "desc": "Mətn, şəkil və ya əllə çəkmə üsulu ilə PDF-ə imza əlavə edir" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Sadələşdir", + "desc": "Bütün interaktiv elementləri və anketləri PDF-dən sil" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Sertifikat İlə İmzala", + "desc": "PDF-i Sertifikat/Açar (PEM/P12) ilə imzalayır" + }, + "repair": { + "tags": "fix,restore", + "title": "Bərpa Et", + "desc": "Pozulmuş PDF-i Bərpa Etməyə Çalışır" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Boş Səhifələri Sil", + "desc": "Sənəddə boş səhifələri tapır və silir" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Sitatları Sil", + "desc": "PDF-dən bütün şərhləri və sitatları silir" + }, + "compare": { + "tags": "difference", + "title": "Müqayisə Et", + "desc": "2 PDF Sənədini müqayisə edir və fərqləri göstərir" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Sertifikat İmzasını Sil", + "desc": "PDF-dən Sertifikat imzasını götür" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Çoxsəhifəli Tərtibat", + "desc": "PDF-in birdən çox səhifəsini bir səhifədə birləşdir" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Səhifə ölçüsünü/Miqyasını Dəyiş", + "desc": "Səhifənin və/və ya onun məzmununun ölçüsünü və miqyasını dəyiş" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Səhifələri Nömrələ", + "desc": "Sənədin səhifələrinə təyin edilmiş yerdə nömrələr əlavə edin" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Rəngləri/Kontrastı Tənzimlə", + "desc": "PDF-in kontrastını, parlaqlığını, rəng doyğunluğunu tənzimlə" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF-i Kəs", + "desc": "Ölçüsünü azaltmaq üçün PDF-i kəs (mətni saxlayır!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Səhifələri Avtomatik Ayır", + "desc": "Fiziki skan olunmuş səhifələri QR koda əsasən ayır" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "PDF-in Bütün Məlumatları", + "desc": "PDF barədə mümkün olan bütün məlumatları əldə edir" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF-dən 1 Böyük Səhifəyə", + "desc": "Bütün PDF səhifələrini bir böyük səhifəyə çevirir" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Javascript-i Göstər", + "desc": "PDF-in tərkibinə əlavə edilmiş JS-i axtarır və göstərir" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Şəkli Sil", + "desc": "Fayl ölçüsünü azaltmaq üçün PDF-dən şəkil sil" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "PDF-i Fəsillərə Əsasən Böl", + "desc": "Fəsil strukturuna əsasən PDF-i bir neçə fayla böl." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Səhifələri çıxar", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Sil", + "desc": "PDF Sənədindən istəmədiyin şəkilləri sil." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Say/Ölçüyə Əsasən Avtomatik Ayır", + "desc": "PDF-i ölçüyə, səhifə sayına və ya sənəd sayına əsasən bir neçə PDF-ə ayır." + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Şifr Əlavə Et", + "desc": "Sənədini şifr ilə kilidlə." + }, + "changePermissions": { + "title": "İcazələri Dəyişdir", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Bir PDF-i digərinin üstünə qoyur", + "title": "Üst-Üstə Qoy" + }, "imageToPDF": { "title": "Şəkildən PDF-ə", "desc": "Şəkli (PNG, JPEG, GIF) PDF-ə Çevir." @@ -355,18 +786,6 @@ "title": "PDF-dən Şəkilə", "desc": "PDF-i Şəkilə Çevir. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Səhifələri Sırala", - "desc": "Səhifələri Sil/Sırasını Dəyiş" - }, - "addImage": { - "title": "Şəkil əlavə et", - "desc": "PDF-də təyin edilmiş yerə şəkil əlavə edir" - }, - "watermark": { - "title": "Watermark əlavə et", - "desc": "PDF sənədinə fərdi watermark əlavə et." - }, "permissions": { "title": "İcazəni Dəyiş", "desc": "PDF Sənədinin icazələrini dəyiş" @@ -375,38 +794,10 @@ "title": "Sil", "desc": "PDF Sənədindən istəmədiyin şəkilləri sil." }, - "addPassword": { - "title": "Şifr Əlavə Et", - "desc": "Sənədini şifr ilə kilidlə." - }, - "removePassword": { - "title": "Şifri Sil", - "desc": "PDF Sənədindən şifr qorumasını götür." - }, - "compress": { - "title": "Sıx", - "desc": "PDF fayllarını sıxaraq onların ölçüsünü azalt." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Metadatanı Dəyiş", - "desc": "PDF sənədindəki Metadatanı Dəyiş/Sil/Əlavə et" - }, "fileToPDF": { "title": "Faylı PDF-ə Çevir", "desc": "Hardasa bütün faylları PDF-ə çevir (DOCX, PNG, XLS, PPT, TXT və daha çox)" }, - "ocr": { - "title": "OCR / Skanları Təmizlə", - "desc": "Skanları təmizləyir və PDF-in içərisindəki şəkillərdəki yazını tapıb mətn olaraq əlavə edir." - }, - "extractImages": { - "title": "Şəkilləri Xaric Et", - "desc": "PDF-dəki şəkilləri xaric edib onları zip faylında saxlayır" - }, "pdfToPDFA": { "title": "PDF-dən PDF/A-a", "desc": "PDF faylını uzunmüddətli saxlama üçün PDF/A-a çevir" @@ -435,70 +826,14 @@ "title": "Skan Edilmiş Şəkilləri Detektə et/Ayır", "desc": "Şəkil/PDF-dən çoxlu şəkilləri ayırır" }, - "sign": { - "title": "İmzala", - "desc": "Mətn, şəkil və ya əllə çəkmə üsulu ilə PDF-ə imza əlavə edir" - }, - "flatten": { - "title": "Sadələşdir", - "desc": "Bütün interaktiv elementləri və anketləri PDF-dən sil" - }, - "repair": { - "title": "Bərpa Et", - "desc": "Pozulmuş PDF-i Bərpa Etməyə Çalışır" - }, - "removeBlanks": { - "title": "Boş Səhifələri Sil", - "desc": "Sənəddə boş səhifələri tapır və silir" - }, - "removeAnnotations": { - "title": "Sitatları Sil", - "desc": "PDF-dən bütün şərhləri və sitatları silir" - }, - "compare": { - "title": "Müqayisə Et", - "desc": "2 PDF Sənədini müqayisə edir və fərqləri göstərir" - }, - "certSign": { - "title": "Sertifikat İlə İmzala", - "desc": "PDF-i Sertifikat/Açar (PEM/P12) ilə imzalayır" - }, - "removeCertSign": { - "title": "Sertifikat İmzasını Sil", - "desc": "PDF-dən Sertifikat imzasını götür" - }, - "pageLayout": { - "title": "Çoxsəhifəli Tərtibat", - "desc": "PDF-in birdən çox səhifəsini bir səhifədə birləşdir" - }, - "scalePages": { - "title": "Səhifə ölçüsünü/Miqyasını Dəyiş", - "desc": "Səhifənin və/və ya onun məzmununun ölçüsünü və miqyasını dəyiş" - }, "pipeline": { "title": "Pipeline", "desc": "Pipeline Skriptləri təyin edərək PDF-lər üzərində bir neçə prosesi eyni vaxtda reallaşdırın." }, - "addPageNumbers": { - "title": "Səhifələri Nömrələ", - "desc": "Sənədin səhifələrinə təyin edilmiş yerdə nömrələr əlavə edin" - }, "auto-rename": { "title": "PDF Faylını Avtomatik Yenidən Adlandır", "desc": "Tapılmış başlığa əsasən PDF faylının adını dəyişir" }, - "adjustContrast": { - "title": "Rəngləri/Kontrastı Tənzimlə", - "desc": "PDF-in kontrastını, parlaqlığını, rəng doyğunluğunu tənzimlə" - }, - "crop": { - "title": "PDF-i Kəs", - "desc": "Ölçüsünü azaltmaq üçün PDF-i kəs (mətni saxlayır!)" - }, - "autoSplitPDF": { - "title": "Səhifələri Avtomatik Ayır", - "desc": "Fiziki skan olunmuş səhifələri QR koda əsasən ayır" - }, "sanitizePDF": { "title": "Təmizlə", "desc": "Skriptləri və digər elementləri PDF faylından sil" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "PDF-in Bütün Məlumatları", - "desc": "PDF barədə mümkün olan bütün məlumatları əldə edir" - }, "pageExtracter": { "title": "Səhifə(lər)i xaric et", "desc": "Seçilmiş səhifələri PDF-dən xaric edərək əldə et" }, - "pdfToSinglePage": { - "title": "PDF-dən 1 Böyük Səhifəyə", - "desc": "Bütün PDF səhifələrini bir böyük səhifəyə çevirir" - }, - "showJS": { - "title": "Javascript-i Göstər", - "desc": "PDF-in tərkibinə əlavə edilmiş JS-i axtarır və göstərir" - }, "autoRedact": { "title": "Avtomatik Gizlətmə", "desc": "Daxil edilmiş data əsasında PDF-dəki müəyyən mətn hissəsini qara qutu ilə gizlədir" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF-dən CSV-ə", "desc": "PDF-dən cədvəlləri CSV-ə çevirərək xaric edir" @@ -551,10 +870,6 @@ "title": "Say/Ölçüyə Əsasən Avtomatik Ayır", "desc": "PDF-i ölçüyə, səhifə sayına və ya sənəd sayına əsasən bir neçə PDF-ə ayır." }, - "overlay-pdfs": { - "title": "Üst-Üstə Qoy", - "desc": "Bir PDF-i digərinin üstünə qoyur" - }, "split-by-sections": { "title": "PDF-i Hissələrə Əsasən Böl", "desc": "PDF-in hər səhifəsini daha kiçik üfuqi və şaquli hissələrə böl" @@ -563,43 +878,17 @@ "title": "PDF-i Möhürlə", "desc": "Təyin edilmiş hissələrə mətn və ya şəkil möhürləri əlavə edin" }, - "removeImage": { - "title": "Şəkli Sil", - "desc": "Fayl ölçüsünü azaltmaq üçün PDF-dən şəkil sil" - }, - "splitByChapters": { - "title": "PDF-i Fəsillərə Əsasən Böl", - "desc": "Fəsil strukturuna əsasən PDF-i bir neçə fayla böl." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Qabaqcıl Rəng Seçimləri", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" }, - "convert": { - "title": "Çevir" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Səhifələri çıxar" - }, - "removePages": { - "title": "Sil", - "desc": "PDF Sənədindən istəmədiyin şəkilləri sil." - }, "removeImagePdf": { "title": "Şəkli Sil", "desc": "Fayl ölçüsünü azaltmaq üçün PDF-dən şəkil sil" }, - "autoSizeSplitPDF": { - "title": "Say/Ölçüyə Əsasən Avtomatik Ayır", - "desc": "PDF-i ölçüyə, səhifə sayına və ya sənəd sayına əsasən bir neçə PDF-ə ayır." - }, "adjust-contrast": { "title": "Rəngləri/Kontrastı Tənzimlə", "desc": "PDF-in kontrastını, parlaqlığını, rəng doyğunluğunu tənzimlə" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Qabaqcıl Rəng Seçimləri", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" - }, - "changePermissions": { - "title": "İcazələri Dəyişdir" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "bax,oxu,sitat götür,mətn,şəkil", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "birləşdir,Səhifə əməliyyatları,Back end,server-tərəf", "title": "Birləşdirin", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Birləşdirin", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Fayl Adı", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Çoxsaylı PDF-ləri birləşdirin (2+)", "sortByName": "Ada görə çeşidləyin", "sortByDate": "Tarixə görə çeşidləyin", - "removeCertSign": "Birləşdirilmiş faylda rəqəmsal imza silinsin?", - "submit": "Birləşdirin", - "sortBy": { - "filename": "Fayl Adı" - } + "removeCertSign": "Birləşdirilmiş faylda rəqəmsal imza silinsin?" }, "split": { - "tags": "Səhifə əməliyyarları,böl,Çoxlu Səhifə,kəs,server-tərəf", "title": "PDF-i Bölün", "header": "PDF-i Bölün", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Bölünəcək Səhifələri Daxil Edin:", "submit": "Bölün", "steps": { + "chooseMethod": "Choose Method", "settings": "Parametrlər" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Fayl Ölçüsü" + "name": "Fayl Ölçüsü", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Fayl Ölçüsü" + "label": "Fayl Ölçüsü", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Səhifə əməliyyarları,böl,Çoxlu Səhifə,kəs,server-tərəf" }, "rotate": { - "tags": "server-tərəf", "title": "PDF fırladın", + "submit": "Fırladın", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "server-tərəf", "header": "PDF fırladın", - "selectAngle": "Fırlanma bucağını seçin (90 dərəcə ilə):", - "submit": "Fırladın" + "selectAngle": "Fırlanma bucağını seçin (90 dərəcə ilə):" + }, + "convert": { + "title": "Çevir", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Parametrlər", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Rəng", + "greyscale": "Boz Tonlama", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Səhifəni Doldur", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF Rəqəmsal İmza Ehtiva Edir.Bu, növbəti addımda silinəcək.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Boz Tonlama", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "çevirmə,şəkil,jpg,fotoşəkil,foto" @@ -727,7 +1263,33 @@ "8": "Sonuncunu Sil", "9": "Birinci və Sonuncunu Sil", "10": "Tək-Cüt Birləşdirmə", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(məs., 1,3,2 və ya 4-8,2,10-12 və ya 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Şəkli Əlavə Et", "submit": "Şəkli Əlavə Et" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Mətn,təkrarlanan,nişan,sahib olmaq,müəllif hüquqları,əmtəə nişanı,şəkil,jpg,fotoşəkil,foto", "title": "Watermark Əlavə Et", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Watermark Əlavə Et", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Yazı", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Şrift Ölçüsü", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Mətn", + "2": "Şəkil" + }, + "tags": "Mətn,təkrarlanan,nişan,sahib olmaq,müəllif hüquqları,əmtəə nişanı,şəkil,jpg,fotoşəkil,foto", "header": "Watermark Əlavə Et", "customColor": "Fərdi Mətn Rəngi", "selectText": { @@ -755,17 +1506,6 @@ "8": "Watermark Tipi:", "9": "Watermark Şəkili:", "10": "PDF-i PDF-Şəkil-ə çevir" - }, - "submit": "Watermark Əlavə Et", - "type": { - "1": "Mətn", - "2": "Şəkil" - }, - "watermarkType": { - "text": "Yazı" - }, - "settings": { - "fontSize": "Şrift Ölçüsü" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Səhifələri təmizlə,səhifələri sil", "title": "Sil", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Sil" }, - "addPassword": { - "tags": "təhlükəsiz,təhlükəsizlik", - "title": "Şifr Əlavə Et", - "header": "Şifr Əlavə Et (Şifrləmə)", - "selectText": { - "1": "Şifrlənəcək PDF-i seç", - "2": "İstifadəçi Şifri", - "3": "Şifrləmə Açarı Uzunluğu", - "4": "Böyük dəyərlər daha güclüdür, lakin kiçik dəyərlərin uyğunluğu yüksəkdir.", - "5": "Təyin olunacaq icazə (Sahib (Owner) Şifri ilə birgə istifadə olunması tövsiyə olunur.)", - "6": "Sənədin strukturunun dəyişilməsinin qarşısını al", - "7": "Məzmun xaric edilməsinin qarşısını al", - "8": "Əlçatanlıq üçün xaricetmənin qarşısını al", - "9": "Anketin doldurulmasının qarşısını al", - "10": "Modifikasiyanın qarşısını al", - "11": "Sitat modifikasiyasının qarşısını al", - "12": "Çap etmənin qarşısını al", - "13": "Müxtəlif formatların çap edilməsinin qarşısını al", - "14": "Sahib Şifri", - "15": "Sənəd açıldıqdan sonra onunla nə edilə biləcəyini limitləndir (Bütün oxuyucular dəstəkləmir)", - "16": "Sənədin özünün açılmağını limitləndirir" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Şifrlə", "tooltip": { - "permissions": { - "title": "İcazələri Dəyişdir" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "təhlükəsiz,deşifr,təhlükəsizlik,kodu aç,kodu sil", - "title": "Şifri Sil", - "header": "Şifri Sil (Deşifr)", - "selectText": { - "1": "Deşifr Üçün PDF-i Seç", - "2": "Şifr" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Sil", - "desc": "PDF Sənədindən şifr qorumasını götür.", - "password": { - "stepTitle": "Şifri Sil", - "label": "Cari Şifr" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Başlıq,müəllif,tarix,yaradılış,zaman,yayımçı,istehsalçı,statistika", - "title": "Metadata-nı Dəyiş", "header": "Metadata-nı Dəyiş", + "submit": "Dəyiş", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Başlıq,müəllif,tarix,yaradılış,zaman,yayımçı,istehsalçı,statistika", "selectText": { "1": "Dəyişmək istədiyiniz dəyişənləri redaktə edin", "2": "Bütün Metadata-nı Sil", @@ -856,15 +1877,7 @@ "4": "Digər Metadata:", "5": "Xüsusi Metadata girişi əlavə edin" }, - "author": "Müəllif:", - "creationDate": "Yaradılma Tarixi (yyyy/MM/dd HH:mm:ss):", - "creator": "Yaradıcı:", - "keywords": "Açar Sözlər:", - "modDate": "Dəyişiklik Tarixi (yyyy/MM/dd HH:mm:ss):", - "producer": "İstehsalçı:", - "subject": "Mövzu:", - "trapped": "Tələ:", - "submit": "Dəyiş" + "modDate": "Dəyişiklik Tarixi (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "çevirmə,format,sənəd,şəkil,slayd,mətn,çevirmə,ofis,docs,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "tanıma,mətn,şəkil,skan,oxu,tanı,təyin et,redaktəediləbilən", "title": "OST (OCR) / Skan Təmizləmə", + "desc": "Skanları təmizləyir və PDF-in içərisindəki şəkillərdəki yazını tapıb mətn olaraq əlavə edir.", "header": "Skanları Təmizlə / OST (Optik Simvol Tanınması)", "selectText": { "1": "PDF-də aşkar olunacaq dilləri seçin (Göstərilmiş dillər hazırda aşkar olunmuşlardır):", @@ -896,23 +1910,89 @@ "help": "Bunu digər dillər üçün necə istifadə etmək və/və ya docker-də istifadə etməmək üçün bu dokumentasiyanı oxuyun", "credit": "Bu servis OST (OCR) üçün \"OCRmyPDF\" və \"Tesseract\" istifadə edir.", "submit": "PDF-i OST ilə işlə", - "desc": "Skanları təmizləyir və PDF-in içərisindəki şəkillərdəki yazını tapıb mətn olaraq əlavə edir.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Parametrlər", "ocrMode": { - "label": "OST (OCR) Rejimi" + "label": "OST (OCR) Rejimi", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Dillər" + "label": "Dillər", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OST (OCR) Rejimi" + "title": "OST (OCR) Rejimi", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Dillər" + "title": "Dillər", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Şəkilləri çıxarın", "selectText": "Çıxarılan şəkilləri çevirmək üçün şəkil formatını seçin", "allowDuplicates": "Dublikat şəkilləri yadda saxlayın", - "submit": "Çıxarış" + "submit": "Çıxarış", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arxiv,uzunmüddətli,standard,çevirmə,yaddaş,saxlama", @@ -993,17 +2079,53 @@ }, "info": "Python yüklənməyib. İşə salmaq üçün Python lazımdır." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "təsdiqlə,baş hərflər,çəkilmiş-imza,mətn-imza,şəkil-imza", "title": "İmza", "header": "PDF sənədlərini imzalayın", "upload": "Şəkil Yüklə", - "draw": "İmza çəkmək", - "text": "Mətn daxil etmə", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Təmizləmək", "add": "Əlavə et", "saved": "Saxlanan İmzalar", "save": "İmzanı yadda Saxla", + "applySignatures": "Apply Signatures", "personalSigs": "Şəxsi İmzalar", "sharedSigs": "Paylaşılan İmzalar", "noSavedSigs": "Saxlanmış imza tapılmadı", @@ -1015,42 +2137,179 @@ "previous": "Əvvəlki səhifə", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "təsdiqlə,baş hərflər,çəkilmiş-imza,mətn-imza,şəkil-imza" }, "flatten": { - "tags": "statik,deaktiv,qeyri-interaktiv,streamline", "title": "Düzləşdirin", "header": "PDF-i düzləşdirin", "flattenOnlyForms": "Yalnız formaları düzəldin", "submit": "Düzləşdirin", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Parametrlər" }, "options": { - "flattenOnlyForms": "Yalnız formaları düzəldin" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Yalnız formaları düzəldin", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statik,deaktiv,qeyri-interaktiv,streamline" }, "repair": { "tags": "düzəlt,bərpa et,korreksiya et,geri qaytar", "title": "Bərpa Et", "header": "PDFləri Bərpa Et", - "submit": "Bərpa Et" + "submit": "Bərpa Et", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "təmizləmə,streamline,qeyri-məzmun,nizamla", "title": "Boş Səhifələri Sil", "header": "Boş SƏhifələri Silir", - "threshold": "Minimal Piksel Bəyazlığı:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Boş Səhifələri Sil", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "təmizləmə,streamline,qeyri-məzmun,nizamla", "thresholdDesc": "Pikselin \"Ağ\" hesab olunması üçün minimal nə qədər bəyaz olmalı olduğunu təyin edin. 0 = Qara, 255 Ağappaq.", - "whitePercent": "Bəyaz Faizi (%):", - "whitePercentDesc": "Silinmək üçün səhifənin neçə faizi \"ağ\" piksellərdən təşkil olunmalıdır", - "submit": "Boş Səhifələri Sil" + "whitePercentDesc": "Silinmək üçün səhifənin neçə faizi \"ağ\" piksellərdən təşkil olunmalıdır" }, "removeAnnotations": { "tags": "şərhlər,önə çıxanlar,qeydlər,işarələmə,sil", "title": "Annotasiyaları silin", "header": "Annotasiyaları silin", - "submit": "Sil" + "submit": "Sil", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "fərqləndir,təzad yarat,dəyişikliklər,analiz", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "Doğrula,PEM,P12,rəsmi,şifrlə", "title": "Sertifikatla İmzala", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Məkan", + "logoTitle": "Logo", + "name": "Ad", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Keystore və ya Şəxsi Açar daxil edin (Əgər varsa):", + "passwordOptional": "Leave empty if no password", + "reason": "Səbəb", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Loqonu Göstər", "header": "PDF-i Sertifikatınızla İmzalayın (İşlənilir)", "selectPDF": "İmzalamaq üçün PDF Faylı seçin:", "jksNote": "Note: Əgər sertifikatınızın tipi aşağıda göstərilməyibsə, zəhmət olmasa \"Keytool command line tool\" istifadə edərək onu \"Java Keystroke\" (.jks) faylına çevirin. Sonra, aşağıdan .jks faylını seçin.", @@ -1089,13 +2484,7 @@ "selectCert": "Sertifikat faylınızı seçin (X.509 format, .pem və ya .der ola bilər):", "selectP12": "PKCS#12 Keystore Faylınızı seçin (.p12 və ya .pfx) (İstəyə bağlı, əgər təmin olunarsa, şəxsi açar və sertifikatınızı ehtiva etməlidir):", "selectJKS": "Java Keystore Faylınızı seçin (.jks və ya .keystore):", - "certType": "Sertifikat Tipi", - "password": "Keystore və ya Şəxsi Açar daxil edin (Əgər varsa):", "showSig": "İmzanı Göstər", - "reason": "Səbəb", - "location": "Məkan", - "name": "Ad", - "showLogo": "Loqonu Göstər", "submit": "PDF-i İmzala" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Sertifikat İmzasını Sil", "header": "Rəqəmsal sertifikatı PDF-dən çıxarın", "selectPDF": "PDF faylı seçin:", - "submit": "İmzanı silin" + "submit": "İmzanı silin", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "birləşdir,sintez,tək-baxış,nizamla", @@ -1111,16 +2511,157 @@ "header": "Çoxsəhifəli Tərtibat", "pagesPerSheet": "Vərəqdəki Səhifə Sayı:", "addBorder": "Çərçivə Əlavə Et", - "submit": "Təsdiq et" + "submit": "Təsdiq et", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "ölçüsünü dəyiş,modifikasiya et,ölçülər,uyğunlaş", "title": "Səhifə miqyasını tənzimləyin", "header": "Səhifə miqyasını tənzimləyin", "pageSize": "Sənədin bir səhifəsinin ölçüsü.", "keepPageSize": "Orijinal Ölçü", "scaleFactor": "Səhifənin böyütmə səviyyəsi (kəsmə).", - "submit": "Təsdiq edin" + "submit": "Təsdiq edin", + "tags": "ölçüsünü dəyiş,modifikasiya et,ölçülər,uyğunlaş" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "nömrələ,taq,səliqələ,indeks" @@ -1129,16 +2670,83 @@ "tags": "avtodetektə,başlıq-əsaslı,səliqələ,yenidən adlandır", "title": "Avtomatik Yenidən Adlandır", "header": "Pdf-in Adını Avtomatik Yenidən Adlandır", - "submit": "Avtomatik Yenidən Adlandır" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Avtomatik Yenidən Adlandır", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "rəng-tənzimləmə,köklə,modifikasiya et,yaxşılaşdır" }, "crop": { - "tags": "kəs,kiçilt,redaktə et,forma", "title": "Kəs", "header": "Pdf-ləri Kəs", - "submit": "Təsdiq Et" + "submit": "Təsdiq Et", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "kəs,kiçilt,redaktə et,forma" }, "autoSplitPDF": { "tags": "QR-əsaslı,ayrı,skan-seqment,nizamla", @@ -1221,24 +2829,124 @@ "downloadJS": "Javascripti Endir", "submit": "Göstər" }, - "autoRedact": { - "tags": "Qarala,gizlət,sil,qara,marker,gizli", - "title": "Avtomatik Gizlətmə", - "header": "Avtomatik Gizlətmə", - "colorLabel": "Rəng", - "textsToRedactLabel": "Gizlədiləcək Mətn (Yeni sətirlə ayrılmış)", - "textsToRedactPlaceholder": "e.g. \\nKonfidensial \\nTam-Məxfi", - "useRegexLabel": "Regex İstifadə Et", - "wholeWordSearchLabel": "Bütöv Söz Axtar", - "customPaddingLabel": "Fərdi Əlavə Başlıq", - "convertPDFToImageLabel": "PDF-i PDF-Şəkil-ə çevir (Qutunun arxasındakı yazını silmək üçün istifadə edilir)", - "submitButton": "Təsdiqlə" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Qabaqcıl" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Əlavə et", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Səhifələr", + "placeholder": "(məsələn, 1,2,8 və ya 4,7,12-16 və ya 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "İxrac Et", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1264,22 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Qabaqcıl" - }, - "wordsToRedact": { - "add": "Əlavə et" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Səhifələr", - "placeholder": "(məsələn, 1,2,8 və ya 4,7,12-16 və ya 2n-1)" - }, - "export": "İxrac Et" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Cədvəl xaricetmə,xaric et,çevir" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "üst-üstə", "header": "Overlay PDF faylları", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Əsas PDF faylını seçin" }, "overlayFiles": { - "label": "Overlay PDF fayllarını seçin" + "label": "Overlay PDF fayllarını seçin", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Overlay Modu seçin", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "Overlay Sayları (Sabit Təkrar Rejimi üçün)", - "placeholder": "Sayları vergüllə ayrılmış şəkildə daxil edin (məsələn, 2,3,1)" + "placeholder": "Sayları vergüllə ayrılmış şəkildə daxil edin (məsələn, 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Overlay Position seçin", "foreground": "Ön plan", "background": "Arxa plan" }, - "submit": "Təsdiq et" + "submit": "Təsdiq et", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Hissə Bölgüsü, Ayır, Fərdiləşdir", @@ -1332,6 +3068,7 @@ "tags": "Möhür, Şəkil əlavə et, şəkli ortala, Watermark, PDF, Embed, Fərdiləşdir", "header": "PDF-i Möhürlə", "title": "PDF-i Möhürlə", + "stampSetup": "Stamp Setup", "stampType": "Möhür Tipi", "stampText": "Möhür Yazısı", "stampImage": "Möhür Fotosu", @@ -1344,7 +3081,19 @@ "overrideY": "Y Koordinatının Üstünə Yaz", "customMargin": "Fərdi Boşluq Ölçüsü", "customColor": "Fərdi Mətn Rəngi", - "submit": "Təsdiqlə" + "submit": "Təsdiqlə", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Şəkil Sil,Səhifə Əməliyyatları,Back end,server-tərəf" @@ -1362,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1389,40 +3139,122 @@ "version": "Versiya", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Qabaqcıl Rəng Seçimləri", - "header": "PDF-də Rəngləri Dəyiş-Tərsinə Çevir", - "selectText": { - "1": "Rəngi dəyişmə və tərsinə çevirmə seçimləri", - "2": "Defolt(Defolt yüksək kontrastlı rənglər)", - "3": "Fərdi(Fərdiləşdirilmiş rənglər)", - "4": "Bütöv Tərsinə Çevir(Bütün rəngləri tərsinə çevir)", - "5": "Yüksək kontrastlı rəng seçimləri", - "6": "Qara arxaplanda ağ mətn", - "7": "Ağ arxaplanda qara mətn", - "8": "Qara arxaplanda sarı mətn", - "9": "Qara arxaplanda yaşıl mətn", - "10": "Mətn rəngi seç", - "11": "Arxaplan rəngi seç" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Əvəzlə" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Rəngləri Dəyiş,Səhifə əməliyyatları,Back end,server-tərəf" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Daxil olun", "header": "Daxil olun", "signin": "Daxil olun", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Məni xatırla", "invalid": "Etibarsız istifadəçi adı və ya şifr.", "locked": "Sizin hesabınız kilidlənmişdir.", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "Siz artıq daxil olmusunuz", "alreadyLoggedIn2": "cihazlar. Zəhmət olmasa, cihazlardan çıxış edin və yenidən cəhd edin.", "toManySessions": "Həddindən artıq aktiv sessiyanız var", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF-dən Tək Səhifəyə", "header": "PDF-dən Tək Səhifəyə", - "submit": "Tək Səhifəyə Çevir" + "submit": "Tək Səhifəyə Çevir", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Səhifələri çıxar", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "Kontrastı tənzimləyin", "header": "Kontrastı tənzimləyin", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Parlaqlıq:", "saturation": "Doyma:", - "download": "Yüklə" + "download": "Yüklə", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Sıxışdır", + "desc": "Compress PDFs to reduce their file size.", "header": "PDF-i Sıxışdır", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Fayl Ölçüsü" + }, "credit": "Bu servis PDF sıxışdırılması/Optimizasiyası üçün Ghostscript istifadə edir.", "grayscale": { "label": "Sıxma üçün Boz Rəng Tətbiq Edin" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1491,10 +3435,7 @@ "4": "Avto mod - PDF-in dəqiq ölçüsünü əldə etmək üçün keyfiyyəti avtomatik tənzimləyir", "5": "Gözlənilən PDF Ölçüsü (məsələn, 25MB, 10.8MB, 25KB)" }, - "submit": "Sıxışdır", - "method": { - "filesize": "Fayl Ölçüsü" - } + "submit": "Sıxışdır" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1595,7 +3536,13 @@ "title": "Şəkli silin", "header": "Şəkli silin", "removeImage": "Şəkli silin", - "submit": "Şəkli silin" + "submit": "Şəkli silin", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "PDF-i hissələrə bölün", @@ -1629,6 +3576,12 @@ }, "note": "Buraxılış Qeydləri yalnız ingiliscə mövcuddur" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,52 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Endir", - "convert": { - "title": "Çevir", - "settings": "Parametrlər", - "color": "Rəng", - "greyscale": "Boz Tonlama", - "fillPage": "Səhifəni Doldur", - "pdfaDigitalSignatureWarning": "PDF Rəqəmsal İmza Ehtiva Edir.Bu, növbəti addımda silinəcək.", - "grayscale": "Boz Tonlama" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Hamısını Seç", - "deselectAll": "Hamısını Seçməni Ləğv Et" + "deselectAll": "Hamısını Seçməni Ləğv Et", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "İmzala" + "read": "Read", + "sign": "İmzala", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { - "loading": "Yüklənir..." + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Yüklənir...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Ad", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Versiya", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Hamısını Seç", "deselectAll": "Hamısını Seçməni Ləğv Et", "deleteSelected": "Seçilmişi Sil", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Endir", - "delete": "Sil" + "delete": "Sil", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDF-i Təmizlə", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Parametrlər" + "files": "Files", + "settings": "Parametrlər", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Şifr Əlavə Et", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Şifrlə", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "İcazələri Dəyişdir", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "təhlükəsiz,təhlükəsizlik", + "header": "Şifr Əlavə Et (Şifrləmə)", + "selectText": { + "1": "Şifrlənəcək PDF-i seç", + "2": "İstifadəçi Şifri", + "3": "Şifrləmə Açarı Uzunluğu", + "4": "Böyük dəyərlər daha güclüdür, lakin kiçik dəyərlərin uyğunluğu yüksəkdir.", + "5": "Təyin olunacaq icazə (Sahib (Owner) Şifri ilə birgə istifadə olunması tövsiyə olunur.)", + "6": "Sənədin strukturunun dəyişilməsinin qarşısını al", + "7": "Məzmun xaric edilməsinin qarşısını al", + "8": "Əlçatanlıq üçün xaricetmənin qarşısını al", + "9": "Anketin doldurulmasının qarşısını al", + "10": "Modifikasiyanın qarşısını al", + "11": "Sitat modifikasiyasının qarşısını al", + "12": "Çap etmənin qarşısını al", + "13": "Müxtəlif formatların çap edilməsinin qarşısını al", + "14": "Sahib Şifri", + "15": "Sənəd açıldıqdan sonra onunla nə edilə biləcəyini limitləndir (Bütün oxuyucular dəstəkləmir)", + "16": "Sənədin özünün açılmağını limitləndirir" } }, "changePermissions": { "title": "İcazələri Dəyişdir", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "İcazələri Dəyişdir", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Sənədin Yığılmasının Qarşısını Al" @@ -1736,10 +4580,784 @@ "label": "Fərqli Formatlarda Çapın Qarşısını Al" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "İcazələri Dəyişdir" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Şifri Sil", + "desc": "PDF Sənədindən şifr qorumasını götür.", + "tags": "təhlükəsiz,deşifr,təhlükəsizlik,kodu aç,kodu sil", + "password": { + "stepTitle": "Şifri Sil", + "label": "Cari Şifr", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Sil", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Şifri Sil (Deşifr)", + "selectText": { + "1": "Deşifr Üçün PDF-i Seç", + "2": "Şifr" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Rəngi dəyişmə və tərsinə çevirmə seçimləri", + "2": "Defolt(Defolt yüksək kontrastlı rənglər)", + "3": "Fərdi(Fərdiləşdirilmiş rənglər)", + "4": "Bütöv Tərsinə Çevir(Bütün rəngləri tərsinə çevir)", + "5": "Yüksək kontrastlı rəng seçimləri", + "6": "Qara arxaplanda ağ mətn", + "7": "Ağ arxaplanda qara mətn", + "8": "Qara arxaplanda sarı mətn", + "9": "Qara arxaplanda yaşıl mətn", + "10": "Mətn rəngi seç", + "11": "Arxaplan rəngi seç", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Əvəzlə", + "title": "Qabaqcıl Rəng Seçimləri", + "header": "PDF-də Rəngləri Dəyiş-Tərsinə Çevir" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Qarala,gizlət,sil,qara,marker,gizli", + "title": "Avtomatik Gizlətmə", + "header": "Avtomatik Gizlətmə", + "colorLabel": "Rəng", + "textsToRedactLabel": "Gizlədiləcək Mətn (Yeni sətirlə ayrılmış)", + "textsToRedactPlaceholder": "e.g. \\nKonfidensial \\nTam-Məxfi", + "useRegexLabel": "Regex İstifadə Et", + "wholeWordSearchLabel": "Bütöv Söz Axtar", + "customPaddingLabel": "Fərdi Əlavə Başlıq", + "convertPDFToImageLabel": "PDF-i PDF-Şəkil-ə çevir (Qutunun arxasındakı yazını silmək üçün istifadə edilir)", + "submitButton": "Təsdiqlə" + }, + "replaceColorPdf": { + "tags": "Rəngləri Dəyiş,Səhifə əməliyyatları,Back end,server-tərəf" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/bg-BG/translation.json b/frontend/public/locales/bg-BG/translation.json index a69f7507a..dfe51b527 100644 --- a/frontend/public/locales/bg-BG/translation.json +++ b/frontend/public/locales/bg-BG/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Персонализиран текст", "numberPagesDesc": "Кои страници да номерирате, по подразбиране 'всички', също приема 1-5 или 2,5,9 и т.н.", "customNumberDesc": "По подразбиране е {n}, също приема 'Страница {n} от {total}', 'Текст-{n}', '{filename}-{n}", - "submit": "Добавяне на номера на страници" + "submit": "Добавяне на номера на страници", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Персонализиран избор на страница (Въведете списък с номера на страници 1,5,6, разделени със запетая, или функции като 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Изберете PDF(и)", "multiPdfPrompt": "Изберете PDF (2+)", "multiPdfDropPrompt": "Изберете (или плъзнете и пуснете) всички PDF файлове, от които се нуждаете", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Предупреждение: Този процес може да отнеме до минута в зависимост от размера на файла", "pageOrderPrompt": "Персонализиран ред на страниците (Въведете разделен със запетаи списък с номера на страници или функции като 2n+1):", - "pageSelectionPrompt": "Персонализиран избор на страница (Въведете списък с номера на страници 1,5,6, разделени със запетая, или функции като 2n+1) :", "goToPage": "Давай", "true": "Вярно", "false": "Невярно", "unknown": "Непознат", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Съхранете", "saveToBrowser": "Съхраняване в браузъра", + "download": "Изтегли", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Затворете", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "избрани файлове", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Няма добавени любими", "downloadComplete": "Свалянето завършено", "bored": "Отекчени сте да чакате?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF документът е с парола и или паролата не е предоставена, или е неправилна", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Грешка", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Извинете за проблема!", "needHelp": "Нуждаете се от помощ / Открихте проблем?", "contactTip": "Ако все още имате проблеми, не се колебайте да се свържете с нас за помощ. Можете да изпратите запитване на нашата страница в GitHub или да се свържете с нас чрез Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Изпратете запитване", "discordSubmit": "Discord - Изпратете запитване за поддръжка" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Изтрий", "username": "Потребителско име", "password": "Парола", @@ -82,6 +169,7 @@ "green": "Зелено", "blue": "Синьо", "custom": "Персонализиране...", + "comingSoon": "Coming soon", "WorkInProgess": "Работата е в ход, може да не работи или да има грешки, моля, докладвайте за проблеми!", "poweredBy": "Задвижван чрез", "yes": "Да", @@ -115,12 +203,14 @@ "page": "Страница", "pages": "Страници", "loading": "Зареждане на...", + "review": "Review", "addToDoc": "Добавяне към документ", "reset": "Нулиране", "apply": "Приложи", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Политика за поверителност", + "iAgreeToThe": "I agree to all of the", "terms": "Правила и условия", "accessibility": "Достъпност", "cookie": "Политика за бисквитки", @@ -160,6 +250,7 @@ "title": "Искате ли да подобрите Stirling PDF?", "paragraph1": "Stirling PDF включва анализи, за да ни помогне да подобрим продукта. Ние не проследяваме лична информация или съдържание на файлове.", "paragraph2": "Моля, обмислете възможността за анализ, за да помогнете на Stirling-PDF да расте и да ни позволи да разберем по-добре нашите потребители.", + "learnMore": "Learn more", "enable": "Активиране на анализа", "disable": "Деактивиране на анализа", "settings": "Можете да промените настройките за анализ във config/settings.yml файла" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Запазете въведените формуляри", "help": "Активирайте за съхраняване на предишни използвани въведени данни за бъдещи изпълнения" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Импорт/Експорт на база данни", @@ -331,22 +474,310 @@ "alphabetical": "По азбучен ред", "globalPopularity": "Световна популярност", "sortBy": "Сортиране по:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Мулти инструмент", "desc": "Обединяване, завъртане, пренареждане и премахване на страници" }, "merge": { + "tags": "combine,join,unite", "title": "Обединяване", "desc": "Лесно обединете множество PDF файлове в един." }, "split": { + "tags": "divide,separate,break", "title": "Разделяне", "desc": "Разделяне на PDF файлове на множество документи" }, "rotate": { + "tags": "turn,flip,orient", "title": "Завъртане", "desc": "Лесно завъртете вашите PDF файлове." }, + "convert": { + "tags": "transform,change", + "title": "Преобразуване", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Организиране", + "desc": "Премахване/пренареждане на страници към произволен ред" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Добавяне на изображение", + "desc": "Добавя изображение към зададено място към PDF файла" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Добавяне на воден знак", + "desc": "Добавете персонализиран воден знак към вашия PDF документ." + }, + "removePassword": { + "tags": "unlock", + "title": "Премахване на парола", + "desc": "Премахнете защитата с парола от вашия PDF документ." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Компресиране", + "desc": "Компресирайте PDF файлове, за да намалите размера на файла." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Промяна на метаданни", + "desc": "Промяна/Премахване/Добавяне на метаданни от PDF документ" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Почистващи сканирания", + "desc": "Почиства, сканира и открива текст от изображения в PDF и го добавя отново като текст." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Извличане на изображения", + "desc": "Извлича всички изображения от PDF и ги записва към архив" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Подпишете", + "desc": "Добавя подпис към PDF чрез рисунка, текст или изображение" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Изравняване", + "desc": "Премахнете всички интерактивни елементи и формуляри от PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Подпишете със сертификат", + "desc": "Подписва PDF със сертификат/ключ (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Поправи", + "desc": "Опитва се да поправи повреден PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Премахване на празни страници", + "desc": "Открива и премахва празни страници от документ" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Премахване на анотации", + "desc": "Премахва всички коментари/анотации от PDF" + }, + "compare": { + "tags": "difference", + "title": "Сравнете", + "desc": "Сравнява и показва разликите между 2 PDF документа" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Премахване на знака за сертификат", + "desc": "Премахване на подпис на сертификат от PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Оформление с няколко страници", + "desc": "Слейте няколко страници от PDF документ в една страница" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Коригирайте размера/мащаба на страницата", + "desc": "Промяна на размера/мащаба на страница и/или нейното съдържание." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Добавяне на номера на страници", + "desc": "Добавете номера на страници в документ на определено място" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Коригиране на цветове/контраст", + "desc": "Коригиране на контраста, наситеността и яркостта на PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Изрязване на PDF", + "desc": "Изрежете PDF, за да намалите размера му (поддържа текст!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Автоматично разделяне на страници", + "desc": "Автоматично разделяне на сканиран PDF файл с QR код за разделяне на физически сканирани страници" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Вземете ЦЯЛАТА информация от PDF", + "desc": "Взима всяка възможна информация от PDF файлове" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF към една голяма страница", + "desc": "Обединява всички PDF страници в една голяма страница" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Показване на Javascript", + "desc": "Търси и показва всеки JS, инжектиран в PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Ръчно редактиране", + "desc": "Редактиране на PDF файл въз основа на избран текст, нарисувани форми и/или избрана страница(и)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Премахване на изображение", + "desc": "Премахнете изображението от PDF, за да намалите размера на файла" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Разделете PDF по глави", + "desc": "Разделете PDF на множество файлове въз основа на неговата структура на глави." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Валидиране на PDF подпис", + "desc": "Проверка на цифрови подписи и сертификати в PDF документи" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Извличане на страници", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Премахване", + "desc": "Изтрийте нежеланите страници от вашия PDF документ." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Автоматично разделяне по размер/брой", + "desc": "Разделете един PDF на множество документи въз основа на размер, брой страници или брой документи" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Добавете парола", + "desc": "Шифровайте вашия PDF документ с парола." + }, + "changePermissions": { + "title": "Промяна на правата", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Наслагва PDF файлове върху друг PDF", + "title": "Наслагване PDF-и" + }, "imageToPDF": { "title": "Изображение към PDF", "desc": "Преобразуване на изображение (PNG, JPEG, GIF) към PDF." @@ -355,18 +786,6 @@ "title": "PDF към изображение", "desc": "Преобразуване на PDF към изображение. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Организиране", - "desc": "Премахване/пренареждане на страници към произволен ред" - }, - "addImage": { - "title": "Добавяне на изображение", - "desc": "Добавя изображение към зададено място към PDF файла" - }, - "watermark": { - "title": "Добавяне на воден знак", - "desc": "Добавете персонализиран воден знак към вашия PDF документ." - }, "permissions": { "title": "Промяна на правата", "desc": "Променете правата на вашия PDF документ" @@ -375,38 +794,10 @@ "title": "Премахване", "desc": "Изтрийте нежеланите страници от вашия PDF документ." }, - "addPassword": { - "title": "Добавете парола", - "desc": "Шифровайте вашия PDF документ с парола." - }, - "removePassword": { - "title": "Премахване на парола", - "desc": "Премахнете защитата с парола от вашия PDF документ." - }, - "compress": { - "title": "Компресиране", - "desc": "Компресирайте PDF файлове, за да намалите размера на файла." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Промяна на метаданни", - "desc": "Промяна/Премахване/Добавяне на метаданни от PDF документ" - }, "fileToPDF": { "title": "Преобразуване на файл към PDF", "desc": "Преобразуване почти всеки файл към PDF (DOCX, PNG, XLS, PPT, TXT и други)" }, - "ocr": { - "title": "OCR / Почистващи сканирания", - "desc": "Почиства, сканира и открива текст от изображения в PDF и го добавя отново като текст." - }, - "extractImages": { - "title": "Извличане на изображения", - "desc": "Извлича всички изображения от PDF и ги записва към архив" - }, "pdfToPDFA": { "title": "PDF към PDF/A", "desc": "Конвертирайте PDF към PDF/A за дългосрочно съхранение" @@ -435,70 +826,14 @@ "title": "Откриване/Разделяне на сканирани снимки", "desc": "Разделя множество снимки от една снимка/PDF" }, - "sign": { - "title": "Подпишете", - "desc": "Добавя подпис към PDF чрез рисунка, текст или изображение" - }, - "flatten": { - "title": "Изравняване", - "desc": "Премахнете всички интерактивни елементи и формуляри от PDF" - }, - "repair": { - "title": "Поправи", - "desc": "Опитва се да поправи повреден PDF" - }, - "removeBlanks": { - "title": "Премахване на празни страници", - "desc": "Открива и премахва празни страници от документ" - }, - "removeAnnotations": { - "title": "Премахване на анотации", - "desc": "Премахва всички коментари/анотации от PDF" - }, - "compare": { - "title": "Сравнете", - "desc": "Сравнява и показва разликите между 2 PDF документа" - }, - "certSign": { - "title": "Подпишете със сертификат", - "desc": "Подписва PDF със сертификат/ключ (PEM/P12)" - }, - "removeCertSign": { - "title": "Премахване на знака за сертификат", - "desc": "Премахване на подпис на сертификат от PDF" - }, - "pageLayout": { - "title": "Оформление с няколко страници", - "desc": "Слейте няколко страници от PDF документ в една страница" - }, - "scalePages": { - "title": "Коригирайте размера/мащаба на страницата", - "desc": "Промяна на размера/мащаба на страница и/или нейното съдържание." - }, "pipeline": { "title": "Pipeline (Разширено)", "desc": "Изпълнявайте множество действия върху PDF файлове чрез дефиниране на конвейерни скриптове" }, - "addPageNumbers": { - "title": "Добавяне на номера на страници", - "desc": "Добавете номера на страници в документ на определено място" - }, "auto-rename": { "title": "Автоматично преименуване на PDF файл", "desc": "Автоматично преименува PDF файл въз основа на откритата му заглавка" }, - "adjustContrast": { - "title": "Коригиране на цветове/контраст", - "desc": "Коригиране на контраста, наситеността и яркостта на PDF" - }, - "crop": { - "title": "Изрязване на PDF", - "desc": "Изрежете PDF, за да намалите размера му (поддържа текст!)" - }, - "autoSplitPDF": { - "title": "Автоматично разделяне на страници", - "desc": "Автоматично разделяне на сканиран PDF файл с QR код за разделяне на физически сканирани страници" - }, "sanitizePDF": { "title": "Обеззаразяване", "desc": "Премахване на скриптове и други елементи от PDF файлове" @@ -519,30 +854,14 @@ "title": "PDF към Markdown", "desc": "Преобразува всеки PDF файл в Markdown" }, - "getPdfInfo": { - "title": "Вземете ЦЯЛАТА информация от PDF", - "desc": "Взима всяка възможна информация от PDF файлове" - }, "pageExtracter": { "title": "Извличане на страница(и)", "desc": "Извлича избрани страници от PDF" }, - "pdfToSinglePage": { - "title": "PDF към една голяма страница", - "desc": "Обединява всички PDF страници в една голяма страница" - }, - "showJS": { - "title": "Показване на Javascript", - "desc": "Търси и показва всеки JS, инжектиран в PDF" - }, "autoRedact": { "title": "Автоматично редактиране", "desc": "Автоматично редактира (зачернява) текст в PDF въз основа на въведен текст" }, - "redact": { - "title": "Ръчно редактиране", - "desc": "Редактиране на PDF файл въз основа на избран текст, нарисувани форми и/или избрана страница(и)" - }, "PDFToCSV": { "title": "PDF към CSV", "desc": "Извлича таблици от PDF, като ги конвертира в CSV" @@ -551,10 +870,6 @@ "title": "Автоматично разделяне по размер/брой", "desc": "Разделете един PDF на множество документи въз основа на размер, брой страници или брой документи" }, - "overlay-pdfs": { - "title": "Наслагване PDF-и", - "desc": "Наслагва PDF файлове върху друг PDF" - }, "split-by-sections": { "title": "Разделяне на PDF по секции", "desc": "Разделете всяка страница от PDF на по-малки хоризонтални и вертикални секции" @@ -563,43 +878,17 @@ "title": "Добавяне на печат към PDF", "desc": "Добавете текст или добавете печати с изображения на определени места" }, - "removeImage": { - "title": "Премахване на изображение", - "desc": "Премахнете изображението от PDF, за да намалите размера на файла" - }, - "splitByChapters": { - "title": "Разделете PDF по глави", - "desc": "Разделете PDF на множество файлове въз основа на неговата структура на глави." - }, - "validateSignature": { - "title": "Валидиране на PDF подпис", - "desc": "Проверка на цифрови подписи и сертификати в PDF документи" - }, "replace-color": { "title": "Замяна и обръщане на цвят", "desc": "Заменете цвета на текста и фона в PDF и обърнете пълния цвят на PDF, за да намалите размера на файла" }, - "convert": { - "title": "Преобразуване" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Извличане на страници" - }, - "removePages": { - "title": "Премахване", - "desc": "Изтрийте нежеланите страници от вашия PDF документ." - }, "removeImagePdf": { "title": "Премахване на изображение", "desc": "Премахнете изображението от PDF, за да намалите размера на файла" }, - "autoSizeSplitPDF": { - "title": "Автоматично разделяне по размер/брой", - "desc": "Разделете един PDF на множество документи въз основа на размер, брой страници или брой документи" - }, "adjust-contrast": { "title": "Коригиране на цветове/контраст", "desc": "Коригиране на контраста, наситеността и яркостта на PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Замяна и обръщане на цвят", "desc": "Заменете цвета на текста и фона в PDF и обърнете пълния цвят на PDF, за да намалите размера на файла" - }, - "changePermissions": { - "title": "Промяна на правата" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "преглед,четене,анотиране,текст,изображение", "title": "Преглед/Редактиране на PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "сливане,операции на страници,администраторска зона,от страна на сървъра", "title": "Обединяване", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Обединяване", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Име на файл", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Обединяване на множество PDF файлове (2+)", "sortByName": "Сортиране по име", "sortByDate": "Сортиране по дата", - "removeCertSign": "Премахване на цифровия подпис в обединения файл?", - "submit": "Обединяване", - "sortBy": { - "filename": "Име на файл" - } + "removeCertSign": "Премахване на цифровия подпис в обединения файл?" }, "split": { - "tags": "Операции на страницата,разделяне,Множество страници,изрязване,сървърна страна", "title": "Разделяне на PDF", "header": "Разделяне на PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Въведете страници за разделяне:", "submit": "Разделяне", "steps": { + "chooseMethod": "Choose Method", "settings": "Настройки" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Размер на файла" + "name": "Размер на файла", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Размер на файла" + "label": "Размер на файла", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Операции на страницата,разделяне,Множество страници,изрязване,сървърна страна" }, "rotate": { - "tags": "от страната на сървъра", "title": "Завъртане на PDF", + "submit": "Завъртане", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "от страната на сървъра", "header": "Завъртане на PDF", - "selectAngle": "Изберете ъгъл на въртене (кратно на 90 градуса):", - "submit": "Завъртане" + "selectAngle": "Изберете ъгъл на въртене (кратно на 90 градуса):" + }, + "convert": { + "title": "Преобразуване", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Настройки", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Цвят", + "greyscale": "Скала на сивото", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Попълване на страница", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF файлът съдържа цифров подпис. Това ще бъде премахнато в следващата стъпка.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Скала на сивото", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "преобразуване,img,jpg,изображение,снимка" @@ -727,7 +1263,33 @@ "8": "Премахване на последния", "9": "Премахване на първия и последния", "10": "Обединяване на четно и нечетно", - "11": "Дублиране на всички страници" + "11": "Дублиране на всички страници", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(напр. 1,3,2 или 4-8,2,10-12 или 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Добавяне на изображение", "submit": "Добавяне на изображение" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Текст,повтарящ се,етикет,собствено,авторско право,търговска марка,img,jpg,изображение,снимка", "title": "Добавяне на воден знак", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Добавяне на воден знак", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Текст", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Размер на шрифт", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Текст", + "2": "Изображение" + }, + "tags": "Текст,повтарящ се,етикет,собствено,авторско право,търговска марка,img,jpg,изображение,снимка", "header": "Добавяне на воден знак", "customColor": "Персонализиран цвят на текста", "selectText": { @@ -755,17 +1506,6 @@ "8": "Тип воден знак:", "9": "Изображение за воден знак:", "10": "Конвертирайте PDF в PDF-изображение" - }, - "submit": "Добавяне на воден знак", - "type": { - "1": "Текст", - "2": "Изображение" - }, - "watermarkType": { - "text": "Текст" - }, - "settings": { - "fontSize": "Размер на шрифт" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Премахване на страници,изтриване на страници", "title": "Премахване", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Премахване" }, - "addPassword": { - "tags": "сигурен,сигурност", - "title": "Добавяне на парола", - "header": "Добавяне на парола (Шифроване)", - "selectText": { - "1": "Изберете PDF, който да шифровате", - "2": "Потребителска парола", - "3": "Предотвратяване на сглобяването на документ", - "4": "По-високите стойности са по-силни, но по-ниските стойности имат по-добра съвместимост.", - "5": "Разрешения за задаване (препоръчва се да се използва заедно с паролата на собственика)", - "6": "Предотвратяване на сглобяването на документ", - "7": "Предотвратете извличането на съдържание", - "8": "Предотвратете извличането за достъпност", - "9": "Предотвратяване на попълване на формуляр", - "10": "Предотвратяване на промени", - "11": "Предотвратяване на промени на анотация", - "12": "Предотвратяване на печат", - "13": "Предотвратете отпечатването в различни формати", - "14": "Парола на собственика", - "15": "Ограничава какво може да се прави с документа, след като бъде отворен (не се поддържа от всички четци)", - "16": "Ограничава отварянето на самия документ" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Шифроване", "tooltip": { - "permissions": { - "title": "Промяна на правата" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "сигурно,декриптиране,сигурност,отмяна на парола,изтриване на парола", - "title": "Премахване на паролата", - "header": "Премахване на паролата (Декриптиране)", - "selectText": { - "1": "Изберете PDF за Декриптиране", - "2": "Парола" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Премахване", - "desc": "Премахнете защитата с парола от вашия PDF документ.", - "password": { - "stepTitle": "Премахване на парола", - "label": "Текуща парола" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Заглавие,автор,дата,създаване,час,издател,продуцент,статистика", - "title": "Заглавие:", "header": "Промени метаданните", + "submit": "Промени", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Заглавие,автор,дата,създаване,час,издател,продуцент,статистика", "selectText": { "1": "Моля, редактирайте променливите, които искате да промените", "2": "Изтрий всички метаданни", @@ -856,15 +1877,7 @@ "4": "Други метаданни:", "5": "Добавяне на персонализиране метаданни" }, - "author": "Автор:", - "creationDate": "Дата на създаване (гггг/ММ/дд ЧЧ:мм:сс):", - "creator": "Създател:", - "keywords": "Ключови думи:", - "modDate": "Дата на промяна (гггг/ММ/дд ЧЧ:мм:сс):", - "producer": "Продуцент:", - "subject": "Тема:", - "trapped": "В капан:", - "submit": "Промени" + "modDate": "Дата на промяна (гггг/ММ/дд ЧЧ:мм:сс):" }, "fileToPDF": { "tags": "трансформация,формат,документ,изображение,слайд,текст,преобразуване,офис,документи,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "разпознаване,текст,изображение,сканиране,четене,идентифициране,откриване,редактиране", "title": "OCR / Почистване на сканиране", + "desc": "Почиства, сканира и открива текст от изображения в PDF и го добавя отново като текст.", "header": "Почистващи сканирания / OCR (оптично разпознаване на знаци)", "selectText": { "1": "Изберете езици, които да бъдат открити в рамките на PDF (изброените са откритите към момента):", @@ -896,23 +1910,89 @@ "help": "Моля, прочетете тази документация за това как да използвате това за други езици и/или да не използвате в docker", "credit": "Тази услуга използва qpdf и Tesseract за OCR.", "submit": "Обработка на PDF чрез OCR", - "desc": "Почиства, сканира и открива текст от изображения в PDF и го добавя отново като текст.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Настройки", "ocrMode": { - "label": "OCR режим" + "label": "OCR режим", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Езици" + "label": "Езици", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR режим" + "title": "OCR режим", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Езици" + "title": "Езици", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Извличане на изображения", "selectText": "Изберете формат на изображението, в който да преобразувате извлечените изображения", "allowDuplicates": "Запазване на дублирани изображения", - "submit": "Извличане" + "submit": "Извличане", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "архив,дълготраен,стандартен,преобразуване,съхранение,консервиране", @@ -993,17 +2079,53 @@ }, "info": "Python не е инсталиран. Изисква се да се изпълнява." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "упълномощаване,инициали,нарисуван-подпис,текстов-знак,изображение-подпис", "title": "Подпишете", "header": "Подпишете PDF-и", "upload": "Качи изображение", - "draw": "Начертайте подпис", - "text": "Въвеждане на текст", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Изчисти", "add": "Добави", "saved": "Съхранени подписи", "save": "Запазване на подпис", + "applySignatures": "Apply Signatures", "personalSigs": "Лични подписи", "sharedSigs": "Споделени подписи", "noSavedSigs": "Не са намерени запазени подписи", @@ -1015,42 +2137,179 @@ "previous": "Предишна стараница", "maintainRatio": "Превключване за поддържане на съотношението на страните", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "упълномощаване,инициали,нарисуван-подпис,текстов-знак,изображение-подпис" }, "flatten": { - "tags": "статичен,деактивиран,неинтерактивен,рационализиран", "title": "Изравнете", "header": "Изравнете PDF-и", "flattenOnlyForms": "Изравнете само форми", "submit": "Изравнете", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Настройки" }, "options": { - "flattenOnlyForms": "Изравнете само форми" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Изравнете само форми", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "статичен,деактивиран,неинтерактивен,рационализиран" }, "repair": { "tags": "поправка,възстановяване,корекция,възстановяване", "title": "Поправи", "header": "Поправи PDF-и", - "submit": "Поправи" + "submit": "Поправи", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "почистване,рационализиране,без съдържание,организиране", "title": "Премахване на празни места", "header": "Премахване на празни страници", - "threshold": "Праг на белота на пикселите:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Премахване на празни места", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "почистване,рационализиране,без съдържание,организиране", "thresholdDesc": "Праг за определяне колко бял трябва да бъде един бял пиксел, за да бъде класифициран като 'бял'. 0 = черно, 255 чисто бяло.", - "whitePercent": "Процент бяло (%):", - "whitePercentDesc": "Процент от страницата, която трябва да бъде в 'бели' пиксели, които да бъдат премахнати", - "submit": "Премахване на празни места" + "whitePercentDesc": "Процент от страницата, която трябва да бъде в 'бели' пиксели, които да бъдат премахнати" }, "removeAnnotations": { "tags": "коментари, маркиране, бележки, маркиране, премахване", "title": "Премахване на анотации", "header": "Премахване на анотации", - "submit": "Премахване" + "submit": "Премахване", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "разграничаване,контраст,промени,анализ", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "удостоверяване,PEM,P12,официален,шифроване", "title": "Подписване със сертификат", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Местоположение", + "logoTitle": "Logo", + "name": "Име", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Въведете вашата парола за Keystore за ключове или частен ключ (ако има):", + "passwordOptional": "Leave empty if no password", + "reason": "Причина", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Покажи лого", "header": "Подпишете PDF с вашия сертификат (В процес на работа)", "selectPDF": "Изберете PDF файл за подписване:", "jksNote": "Забележка: Ако вашият тип сертификат не е в списъка по-долу, моля, конвертирайте го във файл на Java Keystore (.jks) с помощта на инструмента за команден ред keytool. След това изберете опцията за .jks файл по-долу.", @@ -1089,13 +2484,7 @@ "selectCert": "Изберете вашия файл със сертификат (формат X.509, може да бъде .pem или .der):", "selectP12": "Изберете вашия PKCS#12 Keystore файл (.p12 или .pfx) (По избор, ако е предоставен, трябва да съдържа вашия личен ключ и сертификат):", "selectJKS": "Изберете Вашия Java Keystore Файл (.jks или .keystore):", - "certType": "Тип сертификат", - "password": "Въведете вашата парола за Keystore за ключове или частен ключ (ако има):", "showSig": "Показване на подпис", - "reason": "Причина", - "location": "Местоположение", - "name": "Име", - "showLogo": "Покажи лого", "submit": "Подпишете PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Премахване на подписа на сертификата", "header": "Премахнете цифровия сертификат от PDF", "selectPDF": "Изберете PDF файл:", - "submit": "Премахване на подпис" + "submit": "Премахване на подпис", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "сливане,комбиниран,единичен изглед,организиране", @@ -1111,16 +2511,157 @@ "header": "Оформление на няколко страници", "pagesPerSheet": "Страници на лист:", "addBorder": "Добавяне на граници", - "submit": "Подайте" + "submit": "Подайте", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "преоразмеряване,промяна,размер,адаптиране", "title": "Коригиране на мащаба на страницата", "header": "Коригиране на мащаба на страницата", "pageSize": "Размер на страница от документа.", "keepPageSize": "Оригинален размер", "scaleFactor": "Ниво на мащабиране (изрязване) на страница.", - "submit": "Подайте" + "submit": "Подайте", + "tags": "преоразмеряване,промяна,размер,адаптиране" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "страничен, етикетиране, организиране, индексиране" @@ -1129,16 +2670,83 @@ "tags": "автоматично откриване,базирано на заглавка,организиране,преетикетиране", "title": "Автоматично преименуване", "header": "Автоматично преименуване на PDF", - "submit": "Автоматично преименуване" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Автоматично преименуване", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "корекция на цвета,настройте,модифицирайте,подобрете" }, "crop": { - "tags": "изрязване,свиване,редактиране,оформяне", "title": "Изрязване", "header": "Изрязване на PDF", - "submit": "Подайте" + "submit": "Подайте", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "изрязване,свиване,редактиране,оформяне" }, "autoSplitPDF": { "tags": "QR-базиран,отделен,сканиране-сегмент,организиране", @@ -1221,24 +2829,124 @@ "downloadJS": "Изтегли Javascript", "submit": "Покажи" }, - "autoRedact": { - "tags": "Редактиране,Скриване,затъмняване,черен,маркер,скрит", - "title": "Автоматично редактиране", - "header": "Автоматично редактиране", - "colorLabel": "Цвят", - "textsToRedactLabel": "Текст за редактиране (разделен с редове)", - "textsToRedactPlaceholder": "например: \\nПоверително \\nСтрого секретно", - "useRegexLabel": "Използване на Regex", - "wholeWordSearchLabel": "Търсене на цялата дума", - "customPaddingLabel": "Персонализирана допълнителна подложка", - "convertPDFToImageLabel": "Преобразуване на PDF към PDF-изображение (използва се за премахване на текст зад полето)", - "submitButton": "Изпращане" - }, "redact": { "tags": "Редактиране, скриване, затъмнение, черно, маркер, скрито, ръчно", "title": "Ръчно редактиране", - "header": "Ръчно редактиране", "submit": "Редактиране", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Разширено" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Добави", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Страници", + "placeholder": "(e.g. 1,2,8 or 4,7,12-16 or 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Експорт", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Ръчно редактиране", "textBasedRedaction": "Редактиране на базата на текст", "pageBasedRedaction": "Редактиране на базата на страници", "convertPDFToImageLabel": "Конвертиране на PDF в PDF-изображение (използва се за премахване на текста зад полето)", @@ -1264,21 +2972,7 @@ "showLayers": "Показване на слоеве (щракнете два пъти, за да върнете всички слоеве в състояние по подразбиране)", "colourPicker": "Избор на цвят", "findCurrentOutlineItem": "Намиране на текущия елемент от контура", - "applyChanges": "Прилагане на промените", - "auto": { - "settings": { - "advancedTitle": "Разширено" - }, - "wordsToRedact": { - "add": "Добави" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Страници" - }, - "export": "Експорт" - } + "applyChanges": "Прилагане на промените" }, "tableExtraxt": { "tags": "CSV,извличане на таблица,извличане,конвертиране" @@ -1289,11 +2983,15 @@ "overlay-pdfs": { "tags": "Наслагване", "header": "Наслагване на PDF файлове", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Изберете Основен PDF файл" }, "overlayFiles": { - "label": "Изберете наслагване на PDF файлове" + "label": "Изберете наслагване на PDF файлове", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Изберете режим на наслагване", @@ -1303,14 +3001,53 @@ }, "counts": { "label": "Брой наслагвания (за режим на фиксирано повторение)", - "placeholder": "Въведете броя, разделени със запетая (напр. 2,3,1)" + "placeholder": "Въведете броя, разделени със запетая (напр. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Изберете позиция на наслагване", "foreground": "Преден план", "background": "Фон" }, - "submit": "Изпращане" + "submit": "Изпращане", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Разделяне на секция,Разделяне,Персонализиране", @@ -1331,6 +3068,7 @@ "tags": "Печат,добавяне на изображение,централно изображение,воден знак,PDF,вграждане,персонализиране", "header": "Поставяне на печат на PDF", "title": "Поставяне на печат на PDF", + "stampSetup": "Stamp Setup", "stampType": "Тип печат", "stampText": "Поставяне на текст", "stampImage": "Изображение с печат", @@ -1343,7 +3081,19 @@ "overrideY": "Замяна на Y координата", "customMargin": "Персонализиран марж", "customColor": "Персонализиран цвят на текста", - "submit": "Изпращане" + "submit": "Изпращане", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Премахване на изображение, операции на страници, админ страна, страна на сървъра" @@ -1361,7 +3111,8 @@ "status": { "_value": "Статус", "valid": "Валиден", - "invalid": "Невалиден" + "invalid": "Невалиден", + "complete": "Validation complete" }, "signer": "Подписващ", "date": "Дата", @@ -1388,40 +3139,122 @@ "version": "Версия", "keyUsage": "Предназначение на ключа за използване", "selfSigned": "Самостоятелно подписан", - "bits": "битове" + "bits": "битове", + "details": "Certificate Details" }, "signature": { "info": "Информация за подписа", "_value": "Подпис", "mathValid": "Подписът е математически валиден, НО:" }, - "selectCustomCert": "Файл със сертификат X.509 по поръчка (по избор)" - }, - "replace-color": { - "title": "Замени-инвертиране-на-цвят", - "header": "Замяна-инвертиране на цвят PDF", - "selectText": { - "1": "Опции за замяна или инвертиране на цвят", - "2": "По подразбиране (цветове с висок контраст по подразбиране)", - "3": "По избор (персонализирани цветове)", - "4": "Пълно инвертиране (Инвертиране на всички цветове)", - "5": "Цветови опции с висок контраст", - "6": "Бял текст на черен фон", - "7": "Черен текст на бял фон", - "8": "Жълт текст на черен фон", - "9": "Зелен текст на черен фон", - "10": "Изберете цвят на текста", - "11": "Изберете цвят на фона" + "selectCustomCert": "Файл със сертификат X.509 по поръчка (по избор)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Замени" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Замяна на цвят, операции на страници, заден край, страна на сървъра" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Вход", "header": "Вход", "signin": "Впишете се", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Запомни ме", "invalid": "Невалидно потребителско име или парола.", "locked": "Вашият акаунт е заключен.", @@ -1440,12 +3273,83 @@ "alreadyLoggedIn": "Вече сте влезли в", "alreadyLoggedIn2": "устройства. Моля, излезте от устройствата и опитайте отново.", "toManySessions": "Имате твърде много активни сесии", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF към единична страница", "header": "PDF към единична страница", - "submit": "Преобразуване към единична страница" + "submit": "Преобразуване към единична страница", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Извличане на страници", @@ -1469,18 +3373,59 @@ "adjustContrast": { "title": "Настройка на контраста", "header": "Коригиране на контраста", + "basic": "Basic Adjustments", "contrast": "Контраст:", "brightness": "Яркост:", "saturation": "Наситеност:", - "download": "Изтегли" + "download": "Изтегли", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Компресиране", + "desc": "Compress PDFs to reduce their file size.", "header": "Компресиране на PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Размер на файла" + }, "credit": "Тази услуга използва qpdf за PDF компресиране/оптимизиране.", "grayscale": { "label": "Приложи сива скала за компресиране" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1490,10 +3435,7 @@ "4": "Автоматичен режим - Автоматично настройва качеството, за да получи PDF с точен размер", "5": "Очакван PDF размер (напр. 25МБ, 10.8МБ, 25КБ)" }, - "submit": "Компресиране", - "method": { - "filesize": "Размер на файла" - } + "submit": "Компресиране" }, "decrypt": { "passwordPrompt": "Този файл е защитен с парола. Моля, въведете паролата:", @@ -1594,7 +3536,13 @@ "title": "Премахване на изображението", "header": "Премахване на изображението", "removeImage": "Премахване на изображението", - "submit": "Премахване на изображението" + "submit": "Премахване на изображението", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Разделете PDF по глави", @@ -1628,6 +3576,12 @@ }, "note": "Бележките към изданието са налични само на английски език" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1663,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Изтегли", - "convert": { - "title": "Преобразуване", - "settings": "Настройки", - "color": "Цвят", - "greyscale": "Скала на сивото", - "fillPage": "Попълване на страница", - "pdfaDigitalSignatureWarning": "PDF файлът съдържа цифров подпис. Това ще бъде премахнато в следващата стъпка.", - "grayscale": "Скала на сивото" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Изберете всички", - "deselectAll": "Отмяна на избора на всички" + "deselectAll": "Отмяна на избора на всички", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Подпишете" + "read": "Read", + "sign": "Подпишете", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Зареждане на...", - "or": "или" + "or": "или", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Име", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Версия", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Изберете всички", "deselectAll": "Отмяна на избора на всички", "deleteSelected": "Изтриване на избраното", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Изтегли", - "delete": "Изтрий" + "delete": "Изтрий", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Дезинфектирай PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Настройки" + "files": "Files", + "settings": "Настройки", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Добавяне на парола", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Шифроване", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Промяна на правата", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "сигурен,сигурност", + "header": "Добавяне на парола (Шифроване)", + "selectText": { + "1": "Изберете PDF, който да шифровате", + "2": "Потребителска парола", + "3": "Предотвратяване на сглобяването на документ", + "4": "По-високите стойности са по-силни, но по-ниските стойности имат по-добра съвместимост.", + "5": "Разрешения за задаване (препоръчва се да се използва заедно с паролата на собственика)", + "6": "Предотвратяване на сглобяването на документ", + "7": "Предотвратете извличането на съдържание", + "8": "Предотвратете извличането за достъпност", + "9": "Предотвратяване на попълване на формуляр", + "10": "Предотвратяване на промени", + "11": "Предотвратяване на промени на анотация", + "12": "Предотвратяване на печат", + "13": "Предотвратете отпечатването в различни формати", + "14": "Парола на собственика", + "15": "Ограничава какво може да се прави с документа, след като бъде отворен (не се поддържа от всички четци)", + "16": "Ограничава отварянето на самия документ" } }, "changePermissions": { "title": "Промяна на правата", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Промяна на правата", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Предотвратяване на сглобяването на документ" @@ -1736,10 +4580,784 @@ "label": "Предотвратете отпечатването на различни формати" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Промяна на правата" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Премахване на паролата", + "desc": "Премахнете защитата с парола от вашия PDF документ.", + "tags": "сигурно,декриптиране,сигурност,отмяна на парола,изтриване на парола", + "password": { + "stepTitle": "Премахване на парола", + "label": "Текуща парола", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Премахване", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Премахване на паролата (Декриптиране)", + "selectText": { + "1": "Изберете PDF за Декриптиране", + "2": "Парола" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Опции за замяна или инвертиране на цвят", + "2": "По подразбиране (цветове с висок контраст по подразбиране)", + "3": "По избор (персонализирани цветове)", + "4": "Пълно инвертиране (Инвертиране на всички цветове)", + "5": "Цветови опции с висок контраст", + "6": "Бял текст на черен фон", + "7": "Черен текст на бял фон", + "8": "Жълт текст на черен фон", + "9": "Зелен текст на черен фон", + "10": "Изберете цвят на текста", + "11": "Изберете цвят на фона", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Замени", + "title": "Замени-инвертиране-на-цвят", + "header": "Замяна-инвертиране на цвят PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Редактиране,Скриване,затъмняване,черен,маркер,скрит", + "title": "Автоматично редактиране", + "header": "Автоматично редактиране", + "colorLabel": "Цвят", + "textsToRedactLabel": "Текст за редактиране (разделен с редове)", + "textsToRedactPlaceholder": "например: \\nПоверително \\nСтрого секретно", + "useRegexLabel": "Използване на Regex", + "wholeWordSearchLabel": "Търсене на цялата дума", + "customPaddingLabel": "Персонализирана допълнителна подложка", + "convertPDFToImageLabel": "Преобразуване на PDF към PDF-изображение (използва се за премахване на текст зад полето)", + "submitButton": "Изпращане" + }, + "replaceColorPdf": { + "tags": "Замяна на цвят, операции на страници, заден край, страна на сървъра" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/ca-CA/translation.json b/frontend/public/locales/ca-CA/translation.json index 5c1540095..c80ab5dee 100644 --- a/frontend/public/locales/ca-CA/translation.json +++ b/frontend/public/locales/ca-CA/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Text Personalitzat", "numberPagesDesc": "Pàgines a enumerar, per defecte 'totes', accepta 1-5 o 2,5,9, etc.", "customNumberDesc": "Per defecte {n}, accepta 'Pàgina {n} de {total}', 'Text-{n}', '{filename}-{n}'", - "submit": "Afegir Números de Pàgina" + "submit": "Afegir Números de Pàgina", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Selecció de pàgines personalitzada (Introdueix una llista separada per comes de números de pàgina, 1,5,6 o funcions com 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Selecciona PDF(s)", "multiPdfPrompt": "Selecciona PDFs (2+)", "multiPdfDropPrompt": "Selecciona (o arrossega) els documents PDF", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Alerta: Aquest procés pot tardar 1 minut depenent de la mida de l'arxiu", "pageOrderPrompt": "Ordre de Pàgines (Llista separada per comes) :", - "pageSelectionPrompt": "Selecció de pàgines personalitzada (Introdueix una llista separada per comes de números de pàgina, 1,5,6 o funcions com 2n+1):", "goToPage": "Anar", "true": "Verdader", "false": "Fals", "unknown": "Desconegut", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Desa", "saveToBrowser": "Desa al navegador", + "download": "Descarrega", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Tanca", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "fitxers seleccionats", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "No s'ha afegit cap favorit", "downloadComplete": "Descarrega completa", "bored": "Avorrit esperant?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "El PDF està protegit o bé el password és incorrecte", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Error", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Ho sentim pel problema!", "needHelp": "Necessites ajuda / Has trobat un problema?", "contactTip": "Si encara tens problemes, no dubtis a contactar-nos per a ajuda. Pots enviar una sol·licitud a la nostra pàgina de GitHub o contactar-nos a través de Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Envia una sol·licitud", "discordSubmit": "Discord - Envia una sol·licitud d'ajuda" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Esborra", "username": "Usuari", "password": "Contrasenya", @@ -82,6 +169,7 @@ "green": "Verd", "blue": "Blau", "custom": "Personalitzat...", + "comingSoon": "Coming soon", "WorkInProgess": "En desenvolupament, pot no funcionar o contenir errors. Si us plau, informa de qualsevol problema!", "poweredBy": "Impulsat per", "yes": "Si", @@ -115,12 +203,14 @@ "page": "Pàgina", "pages": "Pàgines", "loading": "Carregant...", + "review": "Review", "addToDoc": "Afegeix al document", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Política de Privacitat", + "iAgreeToThe": "I agree to all of the", "terms": "Termes i condicions", "accessibility": "Accessibilitat", "cookie": "Política de galetes", @@ -160,6 +250,7 @@ "title": "Vols ajudar a millorar Stirling PDF?", "paragraph1": "Stirling PDF té analítiques opcionals per ajudar-nos a millorar el producte. No recopilem cap informació personal ni el contingut dels fitxers.", "paragraph2": "Si us plau, considera habilitar les analítiques per ajudar Stirling PDF a créixer i permetre'ns entendre millor els nostres usuaris.", + "learnMore": "Learn more", "enable": "Habilita analítiques", "disable": "Desactiva analítiques", "settings": "Pots canviar la configuració de les analítiques al fitxer config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Desa els valors del formulari", "help": "Habilita per guardar els valors utilitzats prèviament per a futures execucions" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Importació/Exportació de Base de Dades", @@ -331,22 +474,310 @@ "alphabetical": "Alfabètic", "globalPopularity": "Popularitat global", "sortBy": "Ordena per:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Eina Multifunció de PDF", "desc": "Fusiona, Rota, Reorganitza i Esborra pàgines" }, "merge": { + "tags": "combine,join,unite", "title": "Fusiona", "desc": "Fusiona fàcilment pàgines en una sola." }, "split": { + "tags": "divide,separate,break", "title": "Divideix", "desc": "Divideix PDFs en múltiples documents" }, "rotate": { + "tags": "turn,flip,orient", "title": "Rota", "desc": "Rota els PDFs." }, + "convert": { + "tags": "transform,change", + "title": "Converteix", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organitza", + "desc": "Elimina/reorganitza pàgines en qualsevol ordre" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Afegir imatge a PDF", + "desc": "Afegeix una imatge en un PDF (en progrés)" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Afegir Marca d'aigua", + "desc": "Afegir una marca d'aigua personalitzada en un PDF" + }, + "removePassword": { + "tags": "unlock", + "title": "Elimina Contrasenya", + "desc": "Elimina la contrasenya del document PDF." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Comprimeix", + "desc": "Comprimeix PDFs per reduir-ne la mida." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Canvia Metadades", + "desc": "Canvia/Treu/Afegeix metadades al document PDF." + }, + "ocr": { + "tags": "extract,scan", + "title": "Executa OCR i neteja escaneigs", + "desc": "Neteja escanejats i detecta text d'imatges dins d'un PDF, tornant-lo a afegir com a text." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Extreu Imatges", + "desc": "Extreu les imatges del PDF i desa-les en un arxiu zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Signa", + "desc": "Afegeix signatura al PDF mitjançant dibuix, text o imatge" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Aplanar", + "desc": "Elimina tots els elements i formularis interactius d'un PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Signa amb Certificat", + "desc": "Signa un PDF amb Certificat/Clau (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Reparar", + "desc": "Intenta reparar un PDF danyat o trencat" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Elimina les pàgines en blanc", + "desc": "Detecta i elimina les pàgines en blanc d'un document" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Elimina Anotacions", + "desc": "Elimina tots els comentaris/anotacions d'un PDF" + }, + "compare": { + "tags": "difference", + "title": "Compara", + "desc": "Compara i mostra les diferències entre 2 documents PDF" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Elimina Signatura de Certificat", + "desc": "Elimina la signatura de certificat d'un PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Disposició Multi-Pàgina", + "desc": "Fusiona diverses pàgines d'un document PDF en una sola pàgina" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Ajusta la mida/escala de la pàgina", + "desc": "Canvia la mida/escala de la pàgina i/o del seu contingut." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Afegir Números de Pàgina", + "desc": "Afegir números de pàgina en una localització" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Ajusta Colors/Contrast", + "desc": "Ajusta colors/contrast, saturació i brillantor" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Talla PDF", + "desc": "Talla PDF per reduir la mida (manté el text!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Divisió Automàtica de Pàgines", + "desc": "Divideix automàticament un PDF escanejat amb un codi QR de separació de pàgines escanejades" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Obteniu Tota la Informació sobre el PDF", + "desc": "Recupera tota la informació possible sobre els PDFs" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF a Una Sola Pàgina Gran", + "desc": "Fusiona totes les pàgines d'un PDF en una sola pàgina gran" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Mostra Javascript", + "desc": "Cerca i mostra qualsevol JS injectat en un PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Redacció manual", + "desc": "Redacta un PDF segons el text seleccionat, les formes dibuixades i/o les pàgines seleccionades" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Elimina imatge", + "desc": "Elimina imatges d'un PDF per reduir la mida del fitxer" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Divideix PDF per Capítols", + "desc": "Divideix un PDF en múltiples fitxers segons la seva estructura de capítols." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validar Signatura PDF", + "desc": "Verifica les signatures digitals i els certificats en documents PDF" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extreu Pàgines", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Elimina", + "desc": "Elimina pàgines del document PDF." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Divisió Automàtica per Mida/Quantitat", + "desc": "Divideix un únic PDF en múltiples documents basant-se en la mida, el nombre de pàgines o el nombre de documents" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Afegir Contrasenya", + "desc": "Xifra el document PDF amb contrasenya." + }, + "changePermissions": { + "title": "Canviar Permissos", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Superposa PDFs sobre un altre PDF", + "title": "Superposar PDFs" + }, "imageToPDF": { "title": "Imatge a PDF", "desc": "Converteix imatge (PNG, JPEG, GIF) a PDF." @@ -355,18 +786,6 @@ "title": "PDF a Imatge", "desc": "Converteix PDF a imatge (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organitza", - "desc": "Elimina/reorganitza pàgines en qualsevol ordre" - }, - "addImage": { - "title": "Afegir imatge a PDF", - "desc": "Afegeix una imatge en un PDF (en progrés)" - }, - "watermark": { - "title": "Afegir Marca d'aigua", - "desc": "Afegir una marca d'aigua personalitzada en un PDF" - }, "permissions": { "title": "Canvia permisos", "desc": "Canvia els permisos del document PDF" @@ -375,38 +794,10 @@ "title": "Elimina", "desc": "Elimina pàgines del document PDF." }, - "addPassword": { - "title": "Afegir Contrasenya", - "desc": "Xifra el document PDF amb contrasenya." - }, - "removePassword": { - "title": "Elimina Contrasenya", - "desc": "Elimina la contrasenya del document PDF." - }, - "compress": { - "title": "Comprimeix", - "desc": "Comprimeix PDFs per reduir-ne la mida." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Canvia Metadades", - "desc": "Canvia/Treu/Afegeix metadades al document PDF." - }, "fileToPDF": { "title": "Converteix arxiu a PDF", "desc": "Converteix qualsevol arxiu a PDF (DOCX, PNG, XLS, PPT, TXT i més)" }, - "ocr": { - "title": "Executa OCR i neteja escaneigs", - "desc": "Neteja escanejats i detecta text d'imatges dins d'un PDF, tornant-lo a afegir com a text." - }, - "extractImages": { - "title": "Extreu Imatges", - "desc": "Extreu les imatges del PDF i desa-les en un arxiu zip" - }, "pdfToPDFA": { "title": "PDF a PDF/A", "desc": "Converteix PDF a PDF/A per a l'emmagatzematge a llarg termini." @@ -435,70 +826,14 @@ "title": "Detecta/Divideix fotos escanejades", "desc": "Divideix múltiples fotos dins del PDF/foto" }, - "sign": { - "title": "Signa", - "desc": "Afegeix signatura al PDF mitjançant dibuix, text o imatge" - }, - "flatten": { - "title": "Aplanar", - "desc": "Elimina tots els elements i formularis interactius d'un PDF" - }, - "repair": { - "title": "Reparar", - "desc": "Intenta reparar un PDF danyat o trencat" - }, - "removeBlanks": { - "title": "Elimina les pàgines en blanc", - "desc": "Detecta i elimina les pàgines en blanc d'un document" - }, - "removeAnnotations": { - "title": "Elimina Anotacions", - "desc": "Elimina tots els comentaris/anotacions d'un PDF" - }, - "compare": { - "title": "Compara", - "desc": "Compara i mostra les diferències entre 2 documents PDF" - }, - "certSign": { - "title": "Signa amb Certificat", - "desc": "Signa un PDF amb Certificat/Clau (PEM/P12)" - }, - "removeCertSign": { - "title": "Elimina Signatura de Certificat", - "desc": "Elimina la signatura de certificat d'un PDF" - }, - "pageLayout": { - "title": "Disposició Multi-Pàgina", - "desc": "Fusiona diverses pàgines d'un document PDF en una sola pàgina" - }, - "scalePages": { - "title": "Ajusta la mida/escala de la pàgina", - "desc": "Canvia la mida/escala de la pàgina i/o del seu contingut." - }, "pipeline": { "title": "Procés", "desc": "Executa múltiples accions en PDFs definint scripts de procés" }, - "addPageNumbers": { - "title": "Afegir Números de Pàgina", - "desc": "Afegir números de pàgina en una localització" - }, "auto-rename": { "title": "Canvia Automàticament el Nom del Fitxer PDF", "desc": "Canvia automàticament el nom d'un fitxer PDF en funció de la capçalera detectada" }, - "adjustContrast": { - "title": "Ajusta Colors/Contrast", - "desc": "Ajusta colors/contrast, saturació i brillantor" - }, - "crop": { - "title": "Talla PDF", - "desc": "Talla PDF per reduir la mida (manté el text!)" - }, - "autoSplitPDF": { - "title": "Divisió Automàtica de Pàgines", - "desc": "Divideix automàticament un PDF escanejat amb un codi QR de separació de pàgines escanejades" - }, "sanitizePDF": { "title": "Neteja", "desc": "Elimina scripts i altres elements dels fitxers PDF" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Obteniu Tota la Informació sobre el PDF", - "desc": "Recupera tota la informació possible sobre els PDFs" - }, "pageExtracter": { "title": "Extreu pàgina(es)", "desc": "Extreu pàgines seleccionades d'un PDF" }, - "pdfToSinglePage": { - "title": "PDF a Una Sola Pàgina Gran", - "desc": "Fusiona totes les pàgines d'un PDF en una sola pàgina gran" - }, - "showJS": { - "title": "Mostra Javascript", - "desc": "Cerca i mostra qualsevol JS injectat en un PDF" - }, "autoRedact": { "title": "Redacció Automàtica", "desc": "Redacta automàticament (enfosqueix) text en un PDF basat en el text introduït" }, - "redact": { - "title": "Redacció manual", - "desc": "Redacta un PDF segons el text seleccionat, les formes dibuixades i/o les pàgines seleccionades" - }, "PDFToCSV": { "title": "PDF a CSV", "desc": "Extreu taules d'un PDF convertint-les a CSV" @@ -551,10 +870,6 @@ "title": "Divisió Automàtica per Mida/Quantitat", "desc": "Divideix un únic PDF en múltiples documents basant-se en la mida, el nombre de pàgines o el nombre de documents" }, - "overlay-pdfs": { - "title": "Superposar PDFs", - "desc": "Superposa PDFs sobre un altre PDF" - }, "split-by-sections": { "title": "Divideix PDF per Seccions", "desc": "Divideix cada pàgina d'un PDF en seccions horitzontals i verticals més petites" @@ -563,43 +878,17 @@ "title": "Afegeix segell al PDF", "desc": "Afegeix segells de text o imatge en ubicacions establertes" }, - "removeImage": { - "title": "Elimina imatge", - "desc": "Elimina imatges d'un PDF per reduir la mida del fitxer" - }, - "splitByChapters": { - "title": "Divideix PDF per Capítols", - "desc": "Divideix un PDF en múltiples fitxers segons la seva estructura de capítols." - }, - "validateSignature": { - "title": "Validar Signatura PDF", - "desc": "Verifica les signatures digitals i els certificats en documents PDF" - }, "replace-color": { "title": "Reemplaça i Inverteix Color", "desc": "Reemplaça el color del text i el fons en un PDF i inverteix tot el color del PDF per reduir la mida del fitxer" }, - "convert": { - "title": "Converteix" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Extreu Pàgines" - }, - "removePages": { - "title": "Elimina", - "desc": "Elimina pàgines del document PDF." - }, "removeImagePdf": { "title": "Elimina imatge", "desc": "Elimina imatges d'un PDF per reduir la mida del fitxer" }, - "autoSizeSplitPDF": { - "title": "Divisió Automàtica per Mida/Quantitat", - "desc": "Divideix un únic PDF en múltiples documents basant-se en la mida, el nombre de pàgines o el nombre de documents" - }, "adjust-contrast": { "title": "Ajusta Colors/Contrast", "desc": "Ajusta colors/contrast, saturació i brillantor" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Reemplaça i Inverteix Color", "desc": "Reemplaça el color del text i el fons en un PDF i inverteix tot el color del PDF per reduir la mida del fitxer" - }, - "changePermissions": { - "title": "Canviar Permissos" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "veure,llegir,anotar,text,imatge", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "fusió,operacions de pàgina,backend,servidor", "title": "Fusiona", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Fusiona", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Nom del Fitxer", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Fusiona múltiples PDFs (2+)", "sortByName": "Ordena per nom", "sortByDate": "Ordena per data", - "removeCertSign": "Eliminar la signatura digital en el fitxer fusionat?", - "submit": "Fusiona", - "sortBy": { - "filename": "Nom del Fitxer" - } + "removeCertSign": "Eliminar la signatura digital en el fitxer fusionat?" }, "split": { - "tags": "operacions de pàgina,divideix,Multi-Pàgina,talla,servidor", "title": "Divideix PDF", "header": "Divideix PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Introdueix les pàgines per dividir-les:", "submit": "Divideix", "steps": { + "chooseMethod": "Choose Method", "settings": "Opcions" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Mida del Fitxer" + "name": "Mida del Fitxer", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Mida del Fitxer" + "label": "Mida del Fitxer", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "operacions de pàgina,divideix,Multi-Pàgina,talla,servidor" }, "rotate": { - "tags": "servidor", "title": "Rota PDF", + "submit": "Rota", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "servidor", "header": "Rota PDF", - "selectAngle": "Selecciona l'angle de gir (en múltiples de 90 graus):", - "submit": "Rota" + "selectAngle": "Selecciona l'angle de gir (en múltiples de 90 graus):" + }, + "convert": { + "title": "Converteix", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Opcions", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Color", + "greyscale": "Escala de Grisos", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Omple la Pàgina", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "El PDF conté una signatura digital. Aquesta serà eliminada en el següent pas.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Escala de Grisos", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversió,img,jpg,imatge,foto" @@ -727,7 +1263,33 @@ "8": "Eliminar Últim", "9": "Eliminar Primer i Últim", "10": "Fusionar Parells-Senars", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(p. ex. 1,3,2 o 4-8,2,10-12 o 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Afegir Imatge", "submit": "Afegir Imatge" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "text,repetició,etiqueta,propia,copyright,marca registrada,img,jpg,imatge,foto", "title": "Afegir Marca d'Aigua", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Afegir Marca d'Aigua", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Text", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Mida del tipus de lletra", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Text", + "2": "Imatge" + }, + "tags": "text,repetició,etiqueta,propia,copyright,marca registrada,img,jpg,imatge,foto", "header": "Afegir Marca d'Aigua", "customColor": "Color de Text Personalitzat", "selectText": { @@ -755,14 +1506,6 @@ "8": "Tipus de Marca d'Aigua:", "9": "Imatge de la Marca d'Aigua:", "10": "Converteix PDF a PDF-Image" - }, - "submit": "Afegir Marca d'Aigua", - "type": { - "1": "Text", - "2": "Imatge" - }, - "settings": { - "fontSize": "Mida del tipus de lletra" } }, "permissions": { @@ -787,50 +1530,201 @@ "removePages": { "tags": "eliminar pàgines,suprimir pàgines", "title": "Elimina", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Elimina" }, - "addPassword": { - "tags": "segur,seguretat", - "title": "Afegir Contrasenya", - "header": "Afegir contrasenya (Encriptat)", - "selectText": { - "1": "PDF a encriptar", - "2": "Contrasenya", - "3": "Longitud de la clau de xifratge", - "4": "Valors més alts són més forts, però els valors més baixos tenen una millor compatibilitat.", - "5": "Permissos a Establir", - "6": "Evita el muntatge del document", - "7": "Evita l'extracció de contingut", - "8": "Evita l'extracció per accessibilitat", - "9": "Evita emplenar formularis", - "10": "Evita modificacions", - "11": "Evita modificacions d'annotacions", - "12": "Evita impressió", - "13": "Evita impressió en diferents formats", - "14": "Contrasenya d'Administrador", - "15": "Restringeix el que es pot fer amb el document un cop obert (No compatible amb tots els lectors)", - "16": "Restringeix l'obertura del document" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Encripta", "tooltip": { - "permissions": { - "title": "Canviar Permissos" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "segur,desencripta,seguretat,eliminar contrasenya,suprimir contrasenya", - "title": "Eliminar Contrasenya", - "header": "Eliminar Contrasenya (Desxifrar)", - "selectText": { - "1": "Selecciona el PDF a Desxifrar", - "2": "Contrasenya" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Eliminar Contrasenya", - "desc": "Elimina la contrasenya del document PDF.", - "password": { - "stepTitle": "Elimina Contrasenya", - "label": "Contrasenya Actual" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -840,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Títol,autor,data,creació,hora,editor,productor,estadístiques", - "title": "Títol:", "header": "Canvia Metadades", + "submit": "Canvia", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Títol,autor,data,creació,hora,editor,productor,estadístiques", "selectText": { "1": "Edita les variables a canviar", "2": "Neteja totes les metadades", @@ -853,15 +1877,7 @@ "4": "Altres Metadades:", "5": "Afegir entrada personalitzada" }, - "author": "Autor:", - "creationDate": "Data de Creació (yyyy/MM/dd HH:mm:ss):", - "creator": "Creador:", - "keywords": "Paraules clau:", - "modDate": "Data de Modificació (yyyy/MM/dd HH:mm:ss):", - "producer": "Productor:", - "subject": "Assumpte:", - "trapped": "Atrapat:", - "submit": "Canvia" + "modDate": "Data de Modificació (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformació,format,document,imatge,diapositiva,text,conversió,oficina,docs,word,excel,powerpoint", @@ -875,6 +1891,7 @@ "ocr": { "tags": "reconeixement,text,imatge,escaneig,lectura,identificació,detecció,editable", "title": "OCR / Neteja Escanejats", + "desc": "Neteja escanejats i detecta text d'imatges dins d'un PDF, tornant-lo a afegir com a text.", "header": "Neteja Escanejats / OCR (Reconeixement Òptic de Caràcters)", "selectText": { "1": "Selecciona els idiomes que s'han de detectar dins del PDF (els que s'indiquen són els detectats):", @@ -893,23 +1910,89 @@ "help": "Llegeix aquesta documentació sobre com utilitzar-la per a altres idiomes i/o no utilitzar-la a Docker", "credit": "Aquest servei fa servir qpdf i Tesseract per a OCR.", "submit": "Processa PDF amb OCR", - "desc": "Neteja escanejats i detecta text d'imatges dins d'un PDF, tornant-lo a afegir com a text.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Opcions", "ocrMode": { - "label": "Mode OCR" + "label": "Mode OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Idiomes" + "label": "Idiomes", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Mode OCR" + "title": "Mode OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Idiomes" + "title": "Idiomes", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -918,7 +2001,13 @@ "header": "Extreu Imatges", "selectText": "Selecciona el format d'imatge al qual convertir les imatges extretes", "allowDuplicates": "Desa imatges duplicades", - "submit": "Extreu" + "submit": "Extreu", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arxiu,llarg termini,estàndard,conversió,emmagatzematge,preservació", @@ -990,17 +2079,53 @@ }, "info": "Python no està instal·lat. És necessari per executar-ho." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autoritza,inicis,signatura dibuixada,signatura de text,signatura amb imatge", "title": "Signa", "header": "Signa els PDF", "upload": "Penja la imatge", - "draw": "Dibuixa la signatura", - "text": "Entrada de text", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Esborra", "add": "Afegeix", "saved": "Signatures Desades", "save": "Desa Signatura", + "applySignatures": "Apply Signatures", "personalSigs": "Signatures Personals", "sharedSigs": "Signatures Compartides", "noSavedSigs": "No s'han trobat signatures desades", @@ -1012,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autoritza,inicis,signatura dibuixada,signatura de text,signatura amb imatge" }, "flatten": { - "tags": "estàtic,desactivar,no interactiu,simplifica", "title": "Aplanar", "header": "Aplana els PDF", "flattenOnlyForms": "Aplana només els formularis", "submit": "Aplanar", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Opcions" }, "options": { - "flattenOnlyForms": "Aplana només els formularis" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Aplana només els formularis", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "estàtic,desactivar,no interactiu,simplifica" }, "repair": { "tags": "repara,restaura,correcció,recupera", "title": "Reparar", "header": "Repara els PDF", - "submit": "Reparar" + "submit": "Reparar", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "neteja,simplifica,sense contingut,organitza", "title": "Elimina els espais en blanc", "header": "Elimina les pàgines en blanc", - "threshold": "Llindar:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Elimina els espais en blanc", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "neteja,simplifica,sense contingut,organitza", "thresholdDesc": "Llindar per determinar el nivell de blanc que ha de tenir un píxel per considerar-lo blanc", - "whitePercent": "Percentatge de blanc (%):", - "whitePercentDesc": "Percentatge de la pàgina que ha de ser blanca per eliminar-la", - "submit": "Elimina els espais en blanc" + "whitePercentDesc": "Percentatge de la pàgina que ha de ser blanca per eliminar-la" }, "removeAnnotations": { "tags": "comentaris,ressalta,notes,marcatge,elimina", "title": "Elimina Anotacions", "header": "Elimina Anotacions", - "submit": "Elimina" + "submit": "Elimina", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "diferencia,contrasta,canvis,anàlisi", @@ -1079,6 +2341,142 @@ "certSign": { "tags": "autentica,PEM,P12,oficial,encripta", "title": "Signatura amb Certificat", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Ubicació", + "logoTitle": "Logo", + "name": "Nom", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Introduïu la contrasenya del vostre magatzem de claus o clau privada (si n'hi ha):", + "passwordOptional": "Leave empty if no password", + "reason": "Motiu", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Mostra el logotip", "header": "Signa un PDF amb el teu certificat (Treball en curs)", "selectPDF": "Seleccioneu un fitxer PDF per signar:", "jksNote": "Nota: Si el vostre tipus de certificat no es troba a la llista, convertiu-lo a un fitxer de Java Keystore (.jks) utilitzant l'eina de línia de comandes keytool. A continuació, trieu l'opció de fitxer .jks més avall.", @@ -1086,13 +2484,7 @@ "selectCert": "Seleccioneu el vostre fitxer de certificat (format X.509, podria ser .pem o .der):", "selectP12": "Seleccioneu el vostre fitxer de magatzem de claus PKCS#12 (.p12 o .pfx) (Opcional, si es proporciona, hauria de contenir la vostra clau privada i certificat):", "selectJKS": "Seleccioneu el vostre fitxer de Java Keystore (.jks o .keystore):", - "certType": "Tipus de certificat", - "password": "Introduïu la contrasenya del vostre magatzem de claus o clau privada (si n'hi ha):", "showSig": "Mostra la signatura", - "reason": "Motiu", - "location": "Ubicació", - "name": "Nom", - "showLogo": "Mostra el logotip", "submit": "Signa PDF" }, "removeCertSign": { @@ -1100,7 +2492,18 @@ "title": "Elimina la Signatura del Certificat", "header": "Elimina el certificat digital del PDF", "selectPDF": "Seleccioneu un fitxer PDF:", - "submit": "Elimina Signatura" + "submit": "Elimina Signatura", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "fusió,composició,vista única,organitzar", @@ -1108,16 +2511,157 @@ "header": "Disposició de Múltiples Pàgines", "pagesPerSheet": "Pàgines per full:", "addBorder": "Afegeix Marcs", - "submit": "Envia" + "submit": "Envia", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "redimensionar,modificar,dimensió,adaptar", "title": "Ajusta l'escala de la pàgina", "header": "Ajusta l'escala de la pàgina", "pageSize": "Mida d'una pàgina del document.", "keepPageSize": "Mida Original", "scaleFactor": "Nivell de zoom (retall) d'una pàgina.", - "submit": "Envia" + "submit": "Envia", + "tags": "redimensionar,modificar,dimensió,adaptar" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "pàgina,etiqueta,organitza,indexa" @@ -1126,16 +2670,83 @@ "tags": "autodetect,basat en capçalera,organitzar,reetiquetar", "title": "Canvi de Nom Automàtic", "header": "Canvi de Nom Automàtic de PDF", - "submit": "Canvi de Nom Automàtic" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Canvi de Nom Automàtic", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "correcció de color,ajustar,modificar,millorar" }, "crop": { - "tags": "retallar,reduir,editar,donar forma", "title": "Talla", "header": "Talla PDF", - "submit": "Envia" + "submit": "Envia", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "retallar,reduir,editar,donar forma" }, "autoSplitPDF": { "tags": "basat en QR,separar,segmentació d'escaneig,organitzar", @@ -1218,24 +2829,124 @@ "downloadJS": "Descarrega Javascript", "submit": "Mostra" }, - "autoRedact": { - "tags": "Redactar,Amagar,ressaltar en negre,negre,marcador,ocult", - "title": "Redacció Automàtica", - "header": "Redacció Automàtica", - "colorLabel": "Color", - "textsToRedactLabel": "Text a Redactar (separat per línies)", - "textsToRedactPlaceholder": "p. ex. \\nConfidencial \\nMolt Secret", - "useRegexLabel": "Utilitza Regex", - "wholeWordSearchLabel": "Cerca de Paraula Completa", - "customPaddingLabel": "Espai Extra Personalitzat", - "convertPDFToImageLabel": "Converteix PDF a Imatge PDF (S'utilitza per eliminar text darrere del quadre)", - "submitButton": "Envia" - }, "redact": { "tags": "Redactar,Amagar,ressaltar en negre,negre,marcador,ocult,manual", "title": "Redacció manual", - "header": "Redacció manual", "submit": "Redacta", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Avançat" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Afegeix", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pàgines", + "placeholder": "(p. ex. 1,2,8 o 4,7,12-16 o 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Exporta", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Redacció manual", "textBasedRedaction": "Redacció basada en text", "pageBasedRedaction": "Redacció basada en pàgines", "convertPDFToImageLabel": "Converteix PDF a PDF-imatge (utilitzat per eliminar text darrere del quadre)", @@ -1261,22 +2972,7 @@ "showLayers": "Mostra les capes (doble clic per restablir totes les capes a l'estat per defecte)", "colourPicker": "Selector de colors", "findCurrentOutlineItem": "Troba l'element actual de l'esquema", - "applyChanges": "Aplica els canvis", - "auto": { - "settings": { - "advancedTitle": "Avançat" - }, - "wordsToRedact": { - "add": "Afegeix" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Pàgines", - "placeholder": "(p. ex. 1,2,8 o 4,7,12-16 o 2n-1)" - }, - "export": "Exporta" - } + "applyChanges": "Aplica els canvis" }, "tableExtraxt": { "tags": "CSV,Extracció de taules,extreure,convertir" @@ -1287,11 +2983,15 @@ "overlay-pdfs": { "tags": "Superposició", "header": "Superposar Fitxers PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Selecciona el Fitxer PDF Base" }, "overlayFiles": { - "label": "Selecciona els Fitxers PDF a Superposar" + "label": "Selecciona els Fitxers PDF a Superposar", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Selecciona el Mode de Superposició", @@ -1301,14 +3001,53 @@ }, "counts": { "label": "Nombre de Superposicions (per al Mode de Repte Fix)", - "placeholder": "Introdueix els nombres separats per comes (p. ex., 2,3,1)" + "placeholder": "Introdueix els nombres separats per comes (p. ex., 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Selecciona la Posició de la Superposició", "foreground": "Primer pla", "background": "Fons" }, - "submit": "Envia" + "submit": "Envia", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Divisió per seccions,Divideix,Personalitza", @@ -1329,6 +3068,7 @@ "tags": "Segell, Afegeix imatge, Centra imatge, Marca d'aigua, PDF, Insereix, Personalitza", "header": "Segella PDF", "title": "Segella PDF", + "stampSetup": "Stamp Setup", "stampType": "Tipus de Segell", "stampText": "Text del Segell", "stampImage": "Imatge del Segell", @@ -1341,7 +3081,19 @@ "overrideY": "Modifica la Coordenada Y", "customMargin": "Marge Personalitzat", "customColor": "Color de Text Personalitzat", - "submit": "Envia" + "submit": "Envia", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Elimina imatge,Operacions de pàgina,Back-end,Servidor" @@ -1359,7 +3111,8 @@ "status": { "_value": "Estat", "valid": "Vàlid", - "invalid": "Invàlid" + "invalid": "Invàlid", + "complete": "Validation complete" }, "signer": "Signant", "date": "Data", @@ -1386,40 +3139,122 @@ "version": "Versió", "keyUsage": "Ús de la clau", "selfSigned": "Autofirmat", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Informació de la Signatura", "_value": "Signatura", "mathValid": "La signatura és matemàticament vàlida, PERÒ:" }, - "selectCustomCert": "Fitxer de Certificat Personalitzat X.509 (Opcional)" - }, - "replace-color": { - "title": "Reemplaça-Inverteix-Color", - "header": "Reemplaça-Inverteix Color en PDF", - "selectText": { - "1": "Opcions per Reemplaçar o Invertir color", - "2": "Per defecte (Colors d'alt contrast per defecte)", - "3": "Personalitzat (Colors personalitzats)", - "4": "Inversió completa (Inverteix tots els colors)", - "5": "Opcions de color d'alt contrast", - "6": "Text blanc sobre fons negre", - "7": "Text negre sobre fons blanc", - "8": "Text groc sobre fons negre", - "9": "Text verd sobre fons negre", - "10": "Tria el color del text", - "11": "Tria el color del fons" + "selectCustomCert": "Fitxer de Certificat Personalitzat X.509 (Opcional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Reemplaça" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Reemplaça Color,Operacions de pàgina,Back end,Costat servidor" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Accedir", "header": "Accedir", "signin": "Accedir", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Recordar", "invalid": "Nom d'usuari/contrasenya no vàlid", "locked": "Compte bloquejat", @@ -1438,12 +3273,83 @@ "alreadyLoggedIn": "Ja has iniciat sessió a", "alreadyLoggedIn2": "dispositius. Si us plau, tanca la sessió en els dispositius i torna-ho a intentar.", "toManySessions": "Tens massa sessions actives", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF a Pàgina Única", "header": "PDF a Pàgina Única", - "submit": "Converteix a Pàgina Única" + "submit": "Converteix a Pàgina Única", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Extreu Pàgines", @@ -1467,18 +3373,59 @@ "adjustContrast": { "title": "Ajusta el Contrast", "header": "Ajusta el Contrast", + "basic": "Basic Adjustments", "contrast": "Contrast:", "brightness": "Brillantor:", "saturation": "Saturació:", - "download": "Descarrega" + "download": "Descarrega", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Comprimir", + "desc": "Compress PDFs to reduce their file size.", "header": "Comprimir PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Mida del Fitxer" + }, "credit": "Aquest servei utilitza qpdf per a la compressió/optimització de PDF.", "grayscale": { "label": "Aplicar escala de grisos per a la compressió" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1488,10 +3435,7 @@ "4": "Mode automàtic: ajusta automàticament la qualitat perquè el PDF tingui la mida exacta", "5": "Mida esperada del PDF (p. ex. 25 MB, 10,8 MB, 25 KB)" }, - "submit": "Comprimir", - "method": { - "filesize": "Mida del Fitxer" - } + "submit": "Comprimir" }, "decrypt": { "passwordPrompt": "Aquest fitxer està protegit amb contrasenya. Si us plau, introdueix la contrasenya:", @@ -1592,7 +3536,13 @@ "title": "Eliminar imatge", "header": "Eliminar imatge", "removeImage": "Eliminar imatge", - "submit": "Eliminar imatge" + "submit": "Eliminar imatge", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Divideix PDF per Capítols", @@ -1626,6 +3576,12 @@ }, "note": "Les notes de llançament només estan disponibles en anglès" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1661,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Descarrega", - "convert": { - "title": "Converteix", - "settings": "Opcions", - "color": "Color", - "greyscale": "Escala de Grisos", - "fillPage": "Omple la Pàgina", - "pdfaDigitalSignatureWarning": "El PDF conté una signatura digital. Aquesta serà eliminada en el següent pas.", - "grayscale": "Escala de Grisos" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Selecciona-ho tot", - "deselectAll": "Desselecciona-ho tot" + "deselectAll": "Desselecciona-ho tot", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Signa" + "read": "Read", + "sign": "Signa", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Carregant...", - "or": "o" + "or": "o", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Nom", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Versió", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Selecciona-ho tot", "deselectAll": "Desselecciona-ho tot", "deleteSelected": "Suprimeix seleccionades", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Descarrega", - "delete": "Esborra" + "delete": "Esborra", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Neteja PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Opcions" + "files": "Files", + "settings": "Opcions", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Afegir Contrasenya", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Encripta", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Canviar Permissos", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "segur,seguretat", + "header": "Afegir contrasenya (Encriptat)", + "selectText": { + "1": "PDF a encriptar", + "2": "Contrasenya", + "3": "Longitud de la clau de xifratge", + "4": "Valors més alts són més forts, però els valors més baixos tenen una millor compatibilitat.", + "5": "Permissos a Establir", + "6": "Evita el muntatge del document", + "7": "Evita l'extracció de contingut", + "8": "Evita l'extracció per accessibilitat", + "9": "Evita emplenar formularis", + "10": "Evita modificacions", + "11": "Evita modificacions d'annotacions", + "12": "Evita impressió", + "13": "Evita impressió en diferents formats", + "14": "Contrasenya d'Administrador", + "15": "Restringeix el que es pot fer amb el document un cop obert (No compatible amb tots els lectors)", + "16": "Restringeix l'obertura del document" } }, "changePermissions": { "title": "Canviar Permissos", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Canviar Permissos", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Evita el muntatge del document" @@ -1734,10 +4580,784 @@ "label": "Evita impressió en diferents formats" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Canviar Permissos" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Eliminar Contrasenya", + "desc": "Elimina la contrasenya del document PDF.", + "tags": "segur,desencripta,seguretat,eliminar contrasenya,suprimir contrasenya", + "password": { + "stepTitle": "Elimina Contrasenya", + "label": "Contrasenya Actual", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Eliminar Contrasenya", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Eliminar Contrasenya (Desxifrar)", + "selectText": { + "1": "Selecciona el PDF a Desxifrar", + "2": "Contrasenya" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Opcions per Reemplaçar o Invertir color", + "2": "Per defecte (Colors d'alt contrast per defecte)", + "3": "Personalitzat (Colors personalitzats)", + "4": "Inversió completa (Inverteix tots els colors)", + "5": "Opcions de color d'alt contrast", + "6": "Text blanc sobre fons negre", + "7": "Text negre sobre fons blanc", + "8": "Text groc sobre fons negre", + "9": "Text verd sobre fons negre", + "10": "Tria el color del text", + "11": "Tria el color del fons", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Reemplaça", + "title": "Reemplaça-Inverteix-Color", + "header": "Reemplaça-Inverteix Color en PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Redactar,Amagar,ressaltar en negre,negre,marcador,ocult", + "title": "Redacció Automàtica", + "header": "Redacció Automàtica", + "colorLabel": "Color", + "textsToRedactLabel": "Text a Redactar (separat per línies)", + "textsToRedactPlaceholder": "p. ex. \\nConfidencial \\nMolt Secret", + "useRegexLabel": "Utilitza Regex", + "wholeWordSearchLabel": "Cerca de Paraula Completa", + "customPaddingLabel": "Espai Extra Personalitzat", + "convertPDFToImageLabel": "Converteix PDF a Imatge PDF (S'utilitza per eliminar text darrere del quadre)", + "submitButton": "Envia" + }, + "replaceColorPdf": { + "tags": "Reemplaça Color,Operacions de pàgina,Back end,Costat servidor" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/cs-CZ/translation.json b/frontend/public/locales/cs-CZ/translation.json index 54b8bca76..ca9936f3e 100644 --- a/frontend/public/locales/cs-CZ/translation.json +++ b/frontend/public/locales/cs-CZ/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Vlastní text", "numberPagesDesc": "Které stránky číslovat, výchozí je 'všechny', také přijímá 1-5 nebo 2,5,9 atd.", "customNumberDesc": "Výchozí je {n}, také přijímá 'Stránka {n} z {total}', 'Text-{n}', '{filename}-{n}'", - "submit": "Přidat čísla stránek" + "submit": "Přidat čísla stránek", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Vlastní výběr stránek (Zadejte seznam čísel stránek oddělených čárkou jako 1,5,6 nebo funkci jako např. 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Vyberte PDF soubor(y)", "multiPdfPrompt": "Vyberte PDF soubory (2+)", "multiPdfDropPrompt": "Vyberte (nebo přetáhněte) všechny požadované PDF soubory", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Upozornění: Tento proces může trvat až minutu v závislosti na velikosti souboru", "pageOrderPrompt": "Vlastní pořadí stránek (Zadejte seznam čísel stránek oddělených čárkou nebo funkci jako např. 2n+1):", - "pageSelectionPrompt": "Vlastní výběr stránek (Zadejte seznam čísel stránek oddělených čárkou jako 1,5,6 nebo funkci jako např. 2n+1):", "goToPage": "Přejít", "true": "Ano", "false": "Ne", "unknown": "Neznámý", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Uložit", "saveToBrowser": "Uložit do prohlížeče", + "download": "Stáhnout", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Zavřít", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "vybraných souborů", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Žádné oblíbené položky nebyly přidány", "downloadComplete": "Stahování dokončeno", "bored": "Nudíte se při čekání?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF dokument je chráněn heslem a buď heslo nebylo zadáno, nebo bylo nesprávné", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Chyba", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Omlouváme se za problém!", "needHelp": "Potřebujete pomoc / Našli jste problém?", "contactTip": "Pokud stále máte potíže, neváhejte nás kontaktovat. Můžete podat ticket na našem GitHubu nebo nás kontaktovat přes Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Podat ticket", "discordSubmit": "Discord - Podat příspěvek podpory" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Smazat", "username": "Uživatelské jméno", "password": "Heslo", @@ -82,6 +169,7 @@ "green": "Zelená", "blue": "Modrá", "custom": "Vlastní...", + "comingSoon": "Coming soon", "WorkInProgess": "Práce probíhá, nemusí fungovat nebo může obsahovat chyby. Prosím, nahlaste případné problémy!", "poweredBy": "Využívá", "yes": "Ano", @@ -115,12 +203,14 @@ "page": "Stránka", "pages": "Stránky", "loading": "Načítání...", + "review": "Review", "addToDoc": "Přidat do dokumentu", "reset": "Obnovit", "apply": "Použít", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Zásady ochrany osobních údajů", + "iAgreeToThe": "I agree to all of the", "terms": "Podmínky použití", "accessibility": "Přístupnost", "cookie": "Zásady používání cookies", @@ -160,6 +250,7 @@ "title": "Chcete pomoci vylepšit Stirling PDF?", "paragraph1": "Stirling PDF nabízí volitelnou analytiku, která nám pomáhá zlepšovat produkt. Nesledujeme žádné osobní údaje ani obsah souborů.", "paragraph2": "Zvažte prosím povolení analytiky, abyste pomohli růstu Stirling-PDF a umožnili nám lépe porozumět našim uživatelům.", + "learnMore": "Learn more", "enable": "Povolit analytiku", "disable": "Zakázat analytiku", "settings": "Nastavení analytiky můžete změnit v souboru config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Ukládat vstupy formulářů", "help": "Povolí ukládání dříve použitých vstupů pro budoucí použití" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Import/Export databáze", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Multi nástroj", "desc": "Sloučit, otočit, přeuspořádat, rozdělit a odstranit stránky" }, "merge": { + "tags": "combine,join,unite", "title": "Sloučit", "desc": "Snadno sloučit více PDF do jednoho." }, "split": { + "tags": "divide,separate,break", "title": "Rozdělit", "desc": "Rozdělit PDF do více dokumentů" }, "rotate": { + "tags": "turn,flip,orient", "title": "Otočit", "desc": "Snadno otočit vaše PDF." }, + "convert": { + "tags": "transform,change", + "title": "Převést", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Uspořádat", + "desc": "Odstranit/přeuspořádat stránky v libovolném pořadí" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Přidat obrázek", + "desc": "Přidá obrázek na určené místo v PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Přidat vodoznak", + "desc": "Přidat vlastní vodoznak do vašeho PDF dokumentu." + }, + "removePassword": { + "tags": "unlock", + "title": "Odstranit heslo", + "desc": "Odstranit ochranu heslem z vašeho PDF dokumentu." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Komprimovat", + "desc": "Komprimovat PDF pro zmenšení jejich velikosti." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Změnit metadata", + "desc": "Změnit/odstranit/přidat metadata z PDF dokumentu" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Vyčištění skenů", + "desc": "Vyčistí skeny a detekuje text z obrázků v PDF a znovu ho přidá jako text." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Extrahovat obrázky", + "desc": "Extrahuje všechny obrázky z PDF a uloží je do zipu" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Podepsat", + "desc": "Přidá podpis do PDF kreslením, textem nebo obrázkem" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Zploštit", + "desc": "Odstranit všechny interaktivní prvky a formuláře z PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Podepsat certifikátem", + "desc": "Podepíše PDF certifikátem/klíčem (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Opravit", + "desc": "Pokusí se opravit poškozený/rozbitý PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Odstranit prázdné stránky", + "desc": "Detekuje a odstraní prázdné stránky z dokumentu" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Odstranit poznámky", + "desc": "Odstraní všechny komentáře/poznámky z PDF" + }, + "compare": { + "tags": "difference", + "title": "Porovnat", + "desc": "Porovná a zobrazí rozdíly mezi 2 PDF dokumenty" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Odstranit podpis certifikátu", + "desc": "Odstranit podpis certifikátu z PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Rozvržení více stránek", + "desc": "Sloučit více stránek PDF dokumentu do jedné stránky" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Upravit velikost/měřítko stránky", + "desc": "Změnit velikost/měřítko stránky a/nebo jejího obsahu." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Přidat čísla stránek", + "desc": "Přidat čísla stránek v celém dokumentu na určeném místě" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Upravit barvy/kontrast", + "desc": "Upravit kontrast, sytost a jas PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Oříznout PDF", + "desc": "Oříznout PDF pro zmenšení jeho velikosti (zachová text!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Automaticky rozdělit stránky", + "desc": "Automaticky rozdělit naskenované PDF s fyzickým QR kódem pro rozdělení stránek" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Získat VŠECHNY informace o PDF", + "desc": "Získá všechny možné informace o PDF" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "Jedna velká stránka", + "desc": "Sloučí všechny stránky PDF do jedné velké stránky" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Zobrazit Javascript", + "desc": "Vyhledá a zobrazí jakýkoliv JS vložený do PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Ruční začernění", + "desc": "Začerní PDF na základě vybraného textu, nakreslených tvarů a/nebo vybraných stránek" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Odstranit obrázek", + "desc": "Odstranit obrázek z PDF pro zmenšení velikosti souboru" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Rozdělit PDF podle kapitol", + "desc": "Rozdělí PDF do více souborů podle jeho struktury kapitol." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Ověřit podpis PDF", + "desc": "Ověřit digitální podpisy a certifikáty v PDF dokumentech" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extrahovat stránky", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Odstranit", + "desc": "Smazat nežádoucí stránky z vašeho PDF dokumentu." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Automaticky rozdělit podle velikosti/počtu", + "desc": "Rozdělí jeden PDF na více dokumentů podle velikosti, počtu stránek nebo počtu dokumentů" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Přidat heslo", + "desc": "Zašifrovat váš PDF dokument heslem." + }, + "changePermissions": { + "title": "Změnit oprávnění", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Překryje PDF nad jiným PDF", + "title": "Překrýt PDF" + }, "imageToPDF": { "title": "Obrázek na PDF", "desc": "Převést obrázek (PNG, JPEG, GIF) na PDF." @@ -355,18 +786,6 @@ "title": "PDF na obrázek", "desc": "Převést PDF na obrázek. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Uspořádat", - "desc": "Odstranit/přeuspořádat stránky v libovolném pořadí" - }, - "addImage": { - "title": "Přidat obrázek", - "desc": "Přidá obrázek na určené místo v PDF" - }, - "watermark": { - "title": "Přidat vodoznak", - "desc": "Přidat vlastní vodoznak do vašeho PDF dokumentu." - }, "permissions": { "title": "Změnit oprávnění", "desc": "Změnit oprávnění vašeho PDF dokumentu" @@ -375,38 +794,10 @@ "title": "Odstranit", "desc": "Smazat nežádoucí stránky z vašeho PDF dokumentu." }, - "addPassword": { - "title": "Přidat heslo", - "desc": "Zašifrovat váš PDF dokument heslem." - }, - "removePassword": { - "title": "Odstranit heslo", - "desc": "Odstranit ochranu heslem z vašeho PDF dokumentu." - }, - "compress": { - "title": "Komprimovat", - "desc": "Komprimovat PDF pro zmenšení jejich velikosti." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Změnit metadata", - "desc": "Změnit/odstranit/přidat metadata z PDF dokumentu" - }, "fileToPDF": { "title": "Převést soubor na PDF", "desc": "Převést téměř jakýkoliv soubor na PDF (DOCX, PNG, XLS, PPT, TXT a další)" }, - "ocr": { - "title": "OCR / Vyčištění skenů", - "desc": "Vyčistí skeny a detekuje text z obrázků v PDF a znovu ho přidá jako text." - }, - "extractImages": { - "title": "Extrahovat obrázky", - "desc": "Extrahuje všechny obrázky z PDF a uloží je do zipu" - }, "pdfToPDFA": { "title": "PDF na PDF/A", "desc": "Převést PDF na PDF/A pro dlouhodobé uchovávání" @@ -435,70 +826,14 @@ "title": "Detekovat/Rozdělit naskenované fotografie", "desc": "Rozdělí více fotografií z jedné fotografie/PDF" }, - "sign": { - "title": "Podepsat", - "desc": "Přidá podpis do PDF kreslením, textem nebo obrázkem" - }, - "flatten": { - "title": "Zploštit", - "desc": "Odstranit všechny interaktivní prvky a formuláře z PDF" - }, - "repair": { - "title": "Opravit", - "desc": "Pokusí se opravit poškozený/rozbitý PDF" - }, - "removeBlanks": { - "title": "Odstranit prázdné stránky", - "desc": "Detekuje a odstraní prázdné stránky z dokumentu" - }, - "removeAnnotations": { - "title": "Odstranit poznámky", - "desc": "Odstraní všechny komentáře/poznámky z PDF" - }, - "compare": { - "title": "Porovnat", - "desc": "Porovná a zobrazí rozdíly mezi 2 PDF dokumenty" - }, - "certSign": { - "title": "Podepsat certifikátem", - "desc": "Podepíše PDF certifikátem/klíčem (PEM/P12)" - }, - "removeCertSign": { - "title": "Odstranit podpis certifikátu", - "desc": "Odstranit podpis certifikátu z PDF" - }, - "pageLayout": { - "title": "Rozvržení více stránek", - "desc": "Sloučit více stránek PDF dokumentu do jedné stránky" - }, - "scalePages": { - "title": "Upravit velikost/měřítko stránky", - "desc": "Změnit velikost/měřítko stránky a/nebo jejího obsahu." - }, "pipeline": { "title": "Pipeline", "desc": "Spustit více akcí na PDF definováním pipeline skriptů" }, - "addPageNumbers": { - "title": "Přidat čísla stránek", - "desc": "Přidat čísla stránek v celém dokumentu na určeném místě" - }, "auto-rename": { "title": "Automaticky přejmenovat PDF soubor", "desc": "Automaticky přejmenuje PDF soubor podle detekované hlavičky" }, - "adjustContrast": { - "title": "Upravit barvy/kontrast", - "desc": "Upravit kontrast, sytost a jas PDF" - }, - "crop": { - "title": "Oříznout PDF", - "desc": "Oříznout PDF pro zmenšení jeho velikosti (zachová text!)" - }, - "autoSplitPDF": { - "title": "Automaticky rozdělit stránky", - "desc": "Automaticky rozdělit naskenované PDF s fyzickým QR kódem pro rozdělení stránek" - }, "sanitizePDF": { "title": "Sanitizovat", "desc": "Odstranit skripty a další prvky z PDF souborů" @@ -519,30 +854,14 @@ "title": "PDF na Markdown", "desc": "Převádí libovolné PDF na Markdown" }, - "getPdfInfo": { - "title": "Získat VŠECHNY informace o PDF", - "desc": "Získá všechny možné informace o PDF" - }, "pageExtracter": { "title": "Extrahovat stránky", "desc": "Extrahuje vybrané stránky z PDF" }, - "pdfToSinglePage": { - "title": "Jedna velká stránka", - "desc": "Sloučí všechny stránky PDF do jedné velké stránky" - }, - "showJS": { - "title": "Zobrazit Javascript", - "desc": "Vyhledá a zobrazí jakýkoliv JS vložený do PDF" - }, "autoRedact": { "title": "Automatické začernění", "desc": "Automaticky začerní text v PDF na základě vstupního textu" }, - "redact": { - "title": "Ruční začernění", - "desc": "Začerní PDF na základě vybraného textu, nakreslených tvarů a/nebo vybraných stránek" - }, "PDFToCSV": { "title": "PDF na CSV", "desc": "Extrahuje tabulky z PDF a převádí je na CSV" @@ -551,10 +870,6 @@ "title": "Automaticky rozdělit podle velikosti/počtu", "desc": "Rozdělí jeden PDF na více dokumentů podle velikosti, počtu stránek nebo počtu dokumentů" }, - "overlay-pdfs": { - "title": "Překrýt PDF", - "desc": "Překryje PDF nad jiným PDF" - }, "split-by-sections": { "title": "Rozdělit PDF podle sekcí", "desc": "Rozdělí každou stránku PDF na menší horizontální a vertikální sekce" @@ -563,43 +878,17 @@ "title": "Přidat razítko do PDF", "desc": "Přidá textová nebo obrázkové razítka na určená místa" }, - "removeImage": { - "title": "Odstranit obrázek", - "desc": "Odstranit obrázek z PDF pro zmenšení velikosti souboru" - }, - "splitByChapters": { - "title": "Rozdělit PDF podle kapitol", - "desc": "Rozdělí PDF do více souborů podle jeho struktury kapitol." - }, - "validateSignature": { - "title": "Ověřit podpis PDF", - "desc": "Ověřit digitální podpisy a certifikáty v PDF dokumentech" - }, "replace-color": { "title": "Nahrazení a inverze barev", "desc": "Úprava barev textu a pozadí v PDF nebo jejich inverze ke snížení velikosti souboru" }, - "convert": { - "title": "Převést" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Extrahovat stránky" - }, - "removePages": { - "title": "Odstranit", - "desc": "Smazat nežádoucí stránky z vašeho PDF dokumentu." - }, "removeImagePdf": { "title": "Odstranit obrázek", "desc": "Odstranit obrázek z PDF pro zmenšení velikosti souboru" }, - "autoSizeSplitPDF": { - "title": "Automaticky rozdělit podle velikosti/počtu", - "desc": "Rozdělí jeden PDF na více dokumentů podle velikosti, počtu stránek nebo počtu dokumentů" - }, "adjust-contrast": { "title": "Upravit barvy/kontrast", "desc": "Upravit kontrast, sytost a jas PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Nahrazení a inverze barev", "desc": "Úprava barev textu a pozadí v PDF nebo jejich inverze ke snížení velikosti souboru" - }, - "changePermissions": { - "title": "Změnit oprávnění" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "zobrazit,číst,anotovat,text,obrázek", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "sloučit,Operace se stránkami,Zadní strana,serverová strana", "title": "Sloučit", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Sloučit", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Název souboru", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Sloučit více PDF (2+)", "sortByName": "Seřadit podle názvu", "sortByDate": "Seřadit podle data", - "removeCertSign": "Odstranit digitální podpis v sloučeném souboru?", - "submit": "Sloučit", - "sortBy": { - "filename": "Název souboru" - } + "removeCertSign": "Odstranit digitální podpis v sloučeném souboru?" }, "split": { - "tags": "Operace se stránkami,rozdělit,Více stránek,vyjmout,serverová strana", "title": "Rozdělit PDF", "header": "Rozdělit PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Zadejte stránky pro rozdělení:", "submit": "Rozdělit", "steps": { + "chooseMethod": "Choose Method", "settings": "Nastavení" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Velikost souboru" + "name": "Velikost souboru", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Velikost souboru" + "label": "Velikost souboru", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operace se stránkami,rozdělit,Více stránek,vyjmout,serverová strana" }, "rotate": { - "tags": "serverová strana", "title": "Otočit PDF", + "submit": "Otočit", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "serverová strana", "header": "Otočit PDF", - "selectAngle": "Vyberte úhel otočení (v násobcích 90 stupňů):", - "submit": "Otočit" + "selectAngle": "Vyberte úhel otočení (v násobcích 90 stupňů):" + }, + "convert": { + "title": "Převést", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Nastavení", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Barva", + "greyscale": "Stupně šedi", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Vyplnit stránku", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF obsahuje digitální podpis, který bude v dalším kroku odstraněn.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Stupně šedi", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "převod,img,jpg,obrázek,fotka" @@ -727,7 +1263,33 @@ "8": "Odstranit poslední", "9": "Odstranit první a poslední", "10": "Sloučení sudé-liché", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(např. 1,3,2 nebo 4-8,2,10-12 nebo 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Přidat obrázek", "submit": "Přidat obrázek" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Text,opakující se,popisek,vlastní,copyright,ochranná známka,img,jpg,obrázek,fotka", "title": "Přidat vodoznak", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Přidat vodoznak", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Text", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Velikost písma", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Text", + "2": "Obrázek" + }, + "tags": "Text,opakující se,popisek,vlastní,copyright,ochranná známka,img,jpg,obrázek,fotka", "header": "Přidat vodoznak", "customColor": "Vlastní barva textu", "selectText": { @@ -755,14 +1506,6 @@ "8": "Typ vodoznaku:", "9": "Obrázek vodoznaku:", "10": "Převést PDF na PDF-obrázek" - }, - "submit": "Přidat vodoznak", - "type": { - "1": "Text", - "2": "Obrázek" - }, - "settings": { - "fontSize": "Velikost písma" } }, "permissions": { @@ -787,50 +1530,201 @@ "removePages": { "tags": "Odstranit stránky,smazat stránky", "title": "Odstranit", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Odstranit" }, - "addPassword": { - "tags": "zabezpečit,bezpečnost", - "title": "Přidat heslo", - "header": "Přidat heslo (Zašifrovat)", - "selectText": { - "1": "Vyberte PDF k zašifrování", - "2": "Uživatelské heslo", - "3": "Délka šifrovacího klíče", - "4": "Vyšší hodnoty jsou silnější, ale nižší hodnoty mají lepší kompatibilitu.", - "5": "Oprávnění k nastavení (Doporučeno používat společně s heslem vlastníka)", - "6": "Zabránit sestavení dokumentu", - "7": "Zabránit extrakci obsahu", - "8": "Zabránit extrakci pro přístupnost", - "9": "Zabránit vyplňování formulářů", - "10": "Zabránit úpravám", - "11": "Zabránit úpravám poznámek", - "12": "Zabránit tisku", - "13": "Zabránit tisku v různých formátech", - "14": "Heslo vlastníka", - "15": "Omezuje, co lze s dokumentem dělat po jeho otevření (Není podporováno všemi čtečkami)", - "16": "Omezuje samotné otevření dokumentu" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Zašifrovat", "tooltip": { - "permissions": { - "title": "Změnit oprávnění" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "zabezpečit,dešifrovat,bezpečnost,odstranit heslo,smazat heslo", - "title": "Odstranit heslo", - "header": "Odstranit heslo (Dešifrovat)", - "selectText": { - "1": "Vyberte PDF k dešifrování", - "2": "Heslo" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Odstranit", - "desc": "Odstranit ochranu heslem z vašeho PDF dokumentu.", - "password": { - "stepTitle": "Odstranit heslo", - "label": "Současné heslo" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -840,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Název,autor,datum,vytvoření,čas,vydavatel,producent,statistiky", - "title": "Změnit metadata", "header": "Změnit metadata", + "submit": "Změnit", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Název,autor,datum,vytvoření,čas,vydavatel,producent,statistiky", "selectText": { "1": "Upravte proměnné, které chcete změnit", "2": "Smazat všechna metadata", @@ -853,15 +1877,7 @@ "4": "Ostatní metadata:", "5": "Přidat vlastní položku metadat" }, - "author": "Autor:", - "creationDate": "Datum vytvoření (rrrr/MM/dd HH:mm:ss):", - "creator": "Tvůrce:", - "keywords": "Klíčová slova:", - "modDate": "Datum úpravy (rrrr/MM/dd HH:mm:ss):", - "producer": "Producent:", - "subject": "Předmět:", - "trapped": "Zachyceno:", - "submit": "Změnit" + "modDate": "Datum úpravy (rrrr/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformace,formát,dokument,obrázek,prezentace,text,převod,office,docs,word,excel,powerpoint", @@ -875,6 +1891,7 @@ "ocr": { "tags": "rozpoznání,text,obrázek,sken,číst,identifikovat,detekce,upravitelný", "title": "OCR / Čištění skenů", + "desc": "Vyčistí skeny a detekuje text z obrázků v PDF a znovu ho přidá jako text.", "header": "Čištění skenů / OCR (Optické rozpoznávání znaků)", "selectText": { "1": "Vyberte jazyky, které mají být detekovány v PDF (Uvedené jsou aktuálně detekované):", @@ -893,23 +1910,89 @@ "help": "Přečtěte si prosím tuto dokumentaci o použití pro jiné jazyky a/nebo použití mimo Docker", "credit": "Tato služba používá qpdf a Tesseract pro OCR.", "submit": "Zpracovat PDF pomocí OCR", - "desc": "Vyčistí skeny a detekuje text z obrázků v PDF a znovu ho přidá jako text.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Nastavení", "ocrMode": { - "label": "Režim OCR" + "label": "Režim OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Jazyky" + "label": "Jazyky", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Režim OCR" + "title": "Režim OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Jazyky" + "title": "Jazyky", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -918,7 +2001,13 @@ "header": "Extrahovat obrázky", "selectText": "Vyberte formát obrázku pro převod extrahovaných obrázků", "allowDuplicates": "Uložit duplicitní obrázky", - "submit": "Extrahovat" + "submit": "Extrahovat", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "archiv,dlouhodobý,standard,převod,úložiště,uchování", @@ -990,17 +2079,53 @@ }, "info": "Python není nainstalován. Je vyžadován pro spuštění." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autorizovat,iniciály,kreslený-podpis,textový-podpis,obrázkový-podpis", "title": "Podepsat", "header": "Podepsat PDF", "upload": "Nahrát obrázek", - "draw": "Nakreslit podpis", - "text": "Textový vstup", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Vymazat", "add": "Přidat", "saved": "Uložené podpisy", "save": "Uložit podpis", + "applySignatures": "Apply Signatures", "personalSigs": "Osobní podpisy", "sharedSigs": "Sdílené podpisy", "noSavedSigs": "Nebyly nalezeny žádné uložené podpisy", @@ -1012,42 +2137,179 @@ "previous": "Předchozí stránka", "maintainRatio": "Přepnout zachování poměru stran", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autorizovat,iniciály,kreslený-podpis,textový-podpis,obrázkový-podpis" }, "flatten": { - "tags": "statický,deaktivovat,neinteraktivní,zjednodušit", "title": "Zploštit", "header": "Zploštit PDF", "flattenOnlyForms": "Zploštit pouze formuláře", "submit": "Zploštit", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Nastavení" }, "options": { - "flattenOnlyForms": "Zploštit pouze formuláře" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Zploštit pouze formuláře", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statický,deaktivovat,neinteraktivní,zjednodušit" }, "repair": { "tags": "opravit,obnovit,korekce,obnovit", "title": "Opravit", "header": "Opravit PDF", - "submit": "Opravit" + "submit": "Opravit", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "vyčistit,zjednodušit,bez-obsahu,uspořádat", "title": "Odstranit prázdné stránky", "header": "Odstranit prázdné stránky", - "threshold": "Práh bělosti pixelů:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Odstranit prázdné", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "vyčistit,zjednodušit,bez-obsahu,uspořádat", "thresholdDesc": "Práh pro určení, jak bílý musí pixel být, aby byl klasifikován jako 'bílý'. 0 = černá, 255 čistě bílá.", - "whitePercent": "Procento bílé (%):", - "whitePercentDesc": "Procento stránky, které musí být 'bílé' pixely, aby byla odstraněna", - "submit": "Odstranit prázdné" + "whitePercentDesc": "Procento stránky, které musí být 'bílé' pixely, aby byla odstraněna" }, "removeAnnotations": { "tags": "komentáře,zvýraznění,poznámky,značky,odstranit", "title": "Odstranit poznámky", "header": "Odstranit poznámky", - "submit": "Odstranit" + "submit": "Odstranit", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "rozlišit,kontrast,změny,analýza", @@ -1079,6 +2341,142 @@ "certSign": { "tags": "ověřit,PEM,P12,oficiální,šifrovat", "title": "Podepisování certifikátem", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Umístění", + "logoTitle": "Logo", + "name": "Jméno", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Zadejte heslo k vašemu úložišti klíčů nebo privátnímu klíči (pokud existuje):", + "passwordOptional": "Leave empty if no password", + "reason": "Důvod", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Zobrazit logo", "header": "Podepsat PDF certifikátem (Práce probíhá)", "selectPDF": "Vyberte PDF soubor k podepsání:", "jksNote": "Poznámka: Pokud typ vašeho certifikátu není uveden níže, převeďte jej prosím na Java Keystore (.jks) soubor pomocí nástroje keytool příkazové řádky. Poté vyberte možnost .jks níže.", @@ -1086,13 +2484,7 @@ "selectCert": "Vyberte soubor s vaším certifikátem (formát X.509, může být .pem nebo .der):", "selectP12": "Vyberte soubor s vaším PKCS#12 úložištěm klíčů (.p12 nebo .pfx) (Volitelné, pokud je uvedeno, mělo by obsahovat váš privátní klíč a certifikát):", "selectJKS": "Vyberte soubor s vaším Java úložištěm klíčů (.jks nebo .keystore):", - "certType": "Typ certifikátu", - "password": "Zadejte heslo k vašemu úložišti klíčů nebo privátnímu klíči (pokud existuje):", "showSig": "Zobrazit podpis", - "reason": "Důvod", - "location": "Umístění", - "name": "Jméno", - "showLogo": "Zobrazit logo", "submit": "Podepsat PDF" }, "removeCertSign": { @@ -1100,7 +2492,18 @@ "title": "Odstranit podpis certifikátu", "header": "Odstranit digitální certifikát z PDF", "selectPDF": "Vyberte PDF soubor:", - "submit": "Odstranit podpis" + "submit": "Odstranit podpis", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "sloučit,kompozitní,jedno-zobrazení,uspořádat", @@ -1108,16 +2511,157 @@ "header": "Rozvržení více stránek", "pagesPerSheet": "Stránek na list:", "addBorder": "Přidat okraje", - "submit": "Odeslat" + "submit": "Odeslat", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "změnit velikost,upravit,rozměr,přizpůsobit", "title": "Upravit měřítko stránky", "header": "Upravit měřítko stránky", "pageSize": "Velikost stránky dokumentu.", "keepPageSize": "Původní velikost", "scaleFactor": "Úroveň přiblížení (oříznutí) stránky.", - "submit": "Odeslat" + "submit": "Odeslat", + "tags": "změnit velikost,upravit,rozměr,přizpůsobit" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "číslování,popisek,uspořádat,rejstřík" @@ -1126,16 +2670,83 @@ "tags": "auto-detekce,podle-hlavičky,uspořádat,přejmenovat", "title": "Automatické přejmenování", "header": "Automatické přejmenování PDF", - "submit": "Automaticky přejmenovat" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Automaticky přejmenovat", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "korekce-barev,ladit,upravit,vylepšit" }, "crop": { - "tags": "oříznout,zmenšit,upravit,tvar", "title": "Oříznout", "header": "Oříznout PDF", - "submit": "Odeslat" + "submit": "Odeslat", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "oříznout,zmenšit,upravit,tvar" }, "autoSplitPDF": { "tags": "QR-kód,oddělit,sken-segment,uspořádat", @@ -1218,24 +2829,124 @@ "downloadJS": "Stáhnout Javascript", "submit": "Zobrazit" }, - "autoRedact": { - "tags": "Začernit,Skrýt,začernit,černá,značka,skrytý", - "title": "Automatické začernění", - "header": "Automatické začernění", - "colorLabel": "Barva", - "textsToRedactLabel": "Text k začernění (oddělený řádky)", - "textsToRedactPlaceholder": "např. \\nDůvěrné \\nPřísně tajné", - "useRegexLabel": "Použít regulární výraz", - "wholeWordSearchLabel": "Hledat celá slova", - "customPaddingLabel": "Vlastní dodatečné odsazení", - "convertPDFToImageLabel": "Převést PDF na PDF-obrázek (Používá se k odstranění textu za rámečkem)", - "submitButton": "Odeslat" - }, "redact": { "tags": "Začernit,Skrýt,začernit,černá,značka,skrytý,ruční", "title": "Ruční začernění", - "header": "Ruční začernění", "submit": "Začernit", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Pokročilé" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Přidat", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Stránky", + "placeholder": "(např. 1,2,8 nebo 4,7,12-16 nebo 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Exportovat", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Ruční začernění", "textBasedRedaction": "Začernění založené na textu", "pageBasedRedaction": "Začernění založené na stránkách", "convertPDFToImageLabel": "Převést PDF na PDF-obrázek (Používá se k odstranění textu za rámečkem)", @@ -1261,22 +2972,7 @@ "showLayers": "Zobrazit vrstvy (dvojklik pro obnovení všech vrstev do výchozího stavu)", "colourPicker": "Výběr barvy", "findCurrentOutlineItem": "Najít aktuální položku osnovy", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Pokročilé" - }, - "wordsToRedact": { - "add": "Přidat" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Stránky", - "placeholder": "(např. 1,2,8 nebo 4,7,12-16 nebo 2n-1)" - }, - "export": "Exportovat" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Extrakce tabulek,extrahovat,převést" @@ -1287,11 +2983,15 @@ "overlay-pdfs": { "tags": "Překrýt", "header": "Překrýt PDF soubory", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Vyberte základní PDF soubor" }, "overlayFiles": { - "label": "Vyberte PDF soubory pro překrytí" + "label": "Vyberte PDF soubory pro překrytí", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Vyberte režim překrytí", @@ -1301,14 +3001,53 @@ }, "counts": { "label": "Počty překrytí (pro režim pevného opakování)", - "placeholder": "Zadejte počty oddělené čárkami (např. 2,3,1)" + "placeholder": "Zadejte počty oddělené čárkami (např. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Vyberte pozici překrytí", "foreground": "Popředí", "background": "Pozadí" }, - "submit": "Odeslat" + "submit": "Odeslat", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Sekční dělení,Rozdělit,Přizpůsobit", @@ -1329,6 +3068,7 @@ "tags": "Razítko,Přidat obrázek,centrovat obrázek,Vodoznak,PDF,Vložit,Přizpůsobit", "header": "Razítko PDF", "title": "Razítko PDF", + "stampSetup": "Stamp Setup", "stampType": "Typ razítka", "stampText": "Text razítka", "stampImage": "Obrázek razítka", @@ -1341,7 +3081,19 @@ "overrideY": "Přepsat souřadnici Y", "customMargin": "Vlastní okraj", "customColor": "Vlastní barva textu", - "submit": "Odeslat" + "submit": "Odeslat", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Odstranit obrázek,Operace stránek,zadní strana,serverová strana" @@ -1359,7 +3111,8 @@ "status": { "_value": "Stav", "valid": "Platný", - "invalid": "Neplatný" + "invalid": "Neplatný", + "complete": "Validation complete" }, "signer": "Podepisující", "date": "Datum", @@ -1386,40 +3139,122 @@ "version": "Verze", "keyUsage": "Použití klíče", "selfSigned": "Podepsaný sám sebou", - "bits": "bitů" + "bits": "bitů", + "details": "Certificate Details" }, "signature": { "info": "Informace o podpisu", "_value": "Podpis", "mathValid": "Podpis je matematicky platný, ALE:" }, - "selectCustomCert": "Vlastní certifikát X.509 (Volitelné)" - }, - "replace-color": { - "title": "Nahradit a invertovat barvy", - "header": "Nahradit a invertovat barvy v PDF", - "selectText": { - "1": "Možnosti nahrazení nebo inverze barev", - "2": "Výchozí (přednastavené kontrastní barvy)", - "3": "Vlastní (uživatelsky definované barvy)", - "4": "Úplná inverze (invertovat všechny barvy)", - "5": "Možnosti vysokého kontrastu", - "6": "Bílý text na černém pozadí", - "7": "Černý text na bílém pozadí", - "8": "Žlutý text na černém pozadí", - "9": "Zelený text na černém pozadí", - "10": "Vybrat barvu textu", - "11": "Vybrat barvu pozadí" + "selectCustomCert": "Vlastní certifikát X.509 (Volitelné)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Nahradit" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "nahrazení barev,úprava stránek,zpracování,serverová část" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Přihlášení", "header": "Přihlášení", "signin": "Přihlásit se", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Zapamatovat si mě", "invalid": "Neplatné uživatelské jméno nebo heslo.", "locked": "Váš účet byl uzamčen.", @@ -1438,12 +3273,83 @@ "alreadyLoggedIn": "Již jste přihlášeni na", "alreadyLoggedIn2": "zařízeních. Odhlaste se prosím z těchto zařízení a zkuste to znovu.", "toManySessions": "Máte příliš mnoho aktivních relací", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF na jednu stránku", "header": "PDF na jednu stránku", - "submit": "Převést na jednu stránku" + "submit": "Převést na jednu stránku", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Extrahovat stránky", @@ -1467,18 +3373,59 @@ "adjustContrast": { "title": "Upravit kontrast", "header": "Upravit kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Jas:", "saturation": "Sytost:", - "download": "Stáhnout" + "download": "Stáhnout", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Komprimovat", + "desc": "Compress PDFs to reduce their file size.", "header": "Komprimovat PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Velikost souboru" + }, "credit": "Tato služba používá qpdf pro kompresi/optimalizaci PDF.", "grayscale": { "label": "Použít stupnici šedi pro kompresi" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1488,10 +3435,7 @@ "4": "Automatický režim - Automaticky upravuje kvalitu pro dosažení přesné velikosti PDF", "5": "Očekávaná velikost PDF (např. 25MB, 10.8MB, 25KB)" }, - "submit": "Komprimovat", - "method": { - "filesize": "Velikost souboru" - } + "submit": "Komprimovat" }, "decrypt": { "passwordPrompt": "Tento soubor je chráněn heslem. Zadejte prosím heslo:", @@ -1592,7 +3536,13 @@ "title": "Odstranit obrázek", "header": "Odstranit obrázek", "removeImage": "Odstranit obrázek", - "submit": "Odstranit obrázek" + "submit": "Odstranit obrázek", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Rozdělit PDF podle kapitol", @@ -1626,6 +3576,12 @@ }, "note": "Poznámky k vydání jsou dostupné pouze v angličtině" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1661,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Stáhnout", - "convert": { - "title": "Převést", - "settings": "Nastavení", - "color": "Barva", - "greyscale": "Stupně šedi", - "fillPage": "Vyplnit stránku", - "pdfaDigitalSignatureWarning": "PDF obsahuje digitální podpis, který bude v dalším kroku odstraněn.", - "grayscale": "Stupně šedi" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Vybrat vše", - "deselectAll": "Zrušit výběr všeho" + "deselectAll": "Zrušit výběr všeho", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Podepsat" + "read": "Read", + "sign": "Podepsat", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Načítání...", - "or": "nebo" + "or": "nebo", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Jméno", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Verze", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Vybrat vše", "deselectAll": "Zrušit výběr všeho", "deleteSelected": "Smazat vybrané", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Stáhnout", - "delete": "Smazat" + "delete": "Smazat", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Sanitizovat PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Nastavení" + "files": "Files", + "settings": "Nastavení", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Přidat heslo", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Zašifrovat", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Změnit oprávnění", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "zabezpečit,bezpečnost", + "header": "Přidat heslo (Zašifrovat)", + "selectText": { + "1": "Vyberte PDF k zašifrování", + "2": "Uživatelské heslo", + "3": "Délka šifrovacího klíče", + "4": "Vyšší hodnoty jsou silnější, ale nižší hodnoty mají lepší kompatibilitu.", + "5": "Oprávnění k nastavení (Doporučeno používat společně s heslem vlastníka)", + "6": "Zabránit sestavení dokumentu", + "7": "Zabránit extrakci obsahu", + "8": "Zabránit extrakci pro přístupnost", + "9": "Zabránit vyplňování formulářů", + "10": "Zabránit úpravám", + "11": "Zabránit úpravám poznámek", + "12": "Zabránit tisku", + "13": "Zabránit tisku v různých formátech", + "14": "Heslo vlastníka", + "15": "Omezuje, co lze s dokumentem dělat po jeho otevření (Není podporováno všemi čtečkami)", + "16": "Omezuje samotné otevření dokumentu" } }, "changePermissions": { "title": "Změnit oprávnění", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Změnit oprávnění", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Zabránit sestavení dokumentu" @@ -1734,10 +4580,784 @@ "label": "Zabránit tisku v různých formátech" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Změnit oprávnění" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Odstranit heslo", + "desc": "Odstranit ochranu heslem z vašeho PDF dokumentu.", + "tags": "zabezpečit,dešifrovat,bezpečnost,odstranit heslo,smazat heslo", + "password": { + "stepTitle": "Odstranit heslo", + "label": "Současné heslo", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Odstranit", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Odstranit heslo (Dešifrovat)", + "selectText": { + "1": "Vyberte PDF k dešifrování", + "2": "Heslo" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Možnosti nahrazení nebo inverze barev", + "2": "Výchozí (přednastavené kontrastní barvy)", + "3": "Vlastní (uživatelsky definované barvy)", + "4": "Úplná inverze (invertovat všechny barvy)", + "5": "Možnosti vysokého kontrastu", + "6": "Bílý text na černém pozadí", + "7": "Černý text na bílém pozadí", + "8": "Žlutý text na černém pozadí", + "9": "Zelený text na černém pozadí", + "10": "Vybrat barvu textu", + "11": "Vybrat barvu pozadí", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Nahradit", + "title": "Nahradit a invertovat barvy", + "header": "Nahradit a invertovat barvy v PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Začernit,Skrýt,začernit,černá,značka,skrytý", + "title": "Automatické začernění", + "header": "Automatické začernění", + "colorLabel": "Barva", + "textsToRedactLabel": "Text k začernění (oddělený řádky)", + "textsToRedactPlaceholder": "např. \\nDůvěrné \\nPřísně tajné", + "useRegexLabel": "Použít regulární výraz", + "wholeWordSearchLabel": "Hledat celá slova", + "customPaddingLabel": "Vlastní dodatečné odsazení", + "convertPDFToImageLabel": "Převést PDF na PDF-obrázek (Používá se k odstranění textu za rámečkem)", + "submitButton": "Odeslat" + }, + "replaceColorPdf": { + "tags": "nahrazení barev,úprava stránek,zpracování,serverová část" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/da-DK/translation.json b/frontend/public/locales/da-DK/translation.json index ab8d97cd2..82596d238 100644 --- a/frontend/public/locales/da-DK/translation.json +++ b/frontend/public/locales/da-DK/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Brugerdefineret Tekst", "numberPagesDesc": "Hvilke sider der skal nummereres, standard 'alle', accepterer også 1-5 eller 2,5,9 osv.", "customNumberDesc": "Standard er {n}, accepterer også 'Side {n} af {total}', 'Tekst-{n}', '{filnavn}-{n}", - "submit": "Tilføj Sidenumre" + "submit": "Tilføj Sidenumre", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Brugerdefineret sidevalg (Indtast en kommasepareret liste af sidenumre 1,5,6 eller funktioner som 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Vælg PDF-fil(er)", "multiPdfPrompt": "Vælg PDF-filerne (2+)", "multiPdfDropPrompt": "Vælg (eller drag & drop) alle PDF-filerne du skal bruge", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Advarsel: Denne proces kan tage op til et helt minut, alt efter størrelsen på filen", "pageOrderPrompt": "Brugerdefineret siderækkefølge (Indtast en kommasepareret liste af sidenumre eller funktioner som 2n+1) :", - "pageSelectionPrompt": "Brugerdefineret sidevalg (Indtast en kommasepareret liste af sidenumre 1,5,6 eller funktioner som 2n+1) :", "goToPage": "Gå", "true": "Sandt", "false": "Falsk", "unknown": "Ukendt", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Gem", "saveToBrowser": "Gem til browser", + "download": "Download", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Luk", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "Filer valgt", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Ingen favoritter tilføjet", "downloadComplete": "Download fuldført", "bored": "Træt af at vente?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF-dokumentet er beskyttet med adgangskode, og enten blev adgangskoden ikke angivet eller var forkert", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Fejl", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Beklager fejlen!", "needHelp": "Brug for hjælp / Fundet et problem?", "contactTip": "Hvis du stadig har problemer, skal du endelig tage kontakt til os, for at få hjælp. Du kan oprette en ticket på vores Github-side eller tage kontakt til os via Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Indsend en ticket", "discordSubmit": "Discord - Indsend Support post" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Slet", "username": "Brugernavn", "password": "Adgangskode", @@ -82,6 +169,7 @@ "green": "Grøn", "blue": "Blå", "custom": "Brugerdefineret...", + "comingSoon": "Coming soon", "WorkInProgess": "Arbejde i gang, Kan muligvis ikke virke eller have fejl, Rapportér venligst eventuelle problemer!", "poweredBy": "Drevet af", "yes": "Ja", @@ -115,12 +203,14 @@ "page": "Sidenummer", "pages": "Sideantal", "loading": "Laster...", + "review": "Review", "addToDoc": "Tilføj til Dokument", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Privacy Policy", + "iAgreeToThe": "I agree to all of the", "terms": "Vilkår og betingelser", "accessibility": "Adgangsnævnteglen", "cookie": "Cokiebelejring", @@ -160,6 +250,7 @@ "title": "Vil du gøre Stirling PDF bedre?", "paragraph1": "Stirling PDF har indsat analytics for at hjælpe os med at forbedre produktet. Vi følger ikke nogen personoplysninger eller filinhold.", "paragraph2": "Bevægelsesmæssigt aktiver du analytics for at hjælpe Stirling-PDF med at vokse og til atstå os bedre at forstå vores brugere.", + "learnMore": "Learn more", "enable": "Aktivér analytics", "disable": "Deaktiver analytics", "settings": "Du kan ændre analytics-indstillingerne i config/settings.yml-filen" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Gem formularinput", "help": "Aktivér for at gemme tidligere anvendte input til fremtidige kørsler" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Database Import/Eksport", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Multi Værktøj", "desc": "Flet, Rotér, Omarrangér og Fjern sider" }, "merge": { + "tags": "combine,join,unite", "title": "Flet", "desc": "Flet nemt flere PDF'er til én." }, "split": { + "tags": "divide,separate,break", "title": "Opdel", "desc": "Opdel PDF'er i flere dokumenter" }, "rotate": { + "tags": "turn,flip,orient", "title": "Rotér", "desc": "Rotér nemt dine PDF'er." }, + "convert": { + "tags": "transform,change", + "title": "Konvertér", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organisér", + "desc": "Fjern/Omarrangér sider i vilkårlig rækkefølge" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Tilføj billede", + "desc": "Tilføjer et billede på en bestemt placering på PDF'en" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Tilføj Vandmærke", + "desc": "Tilføj et brugerdefineret vandmærke til dit PDF-dokument." + }, + "removePassword": { + "tags": "unlock", + "title": "Fjern Adgangskode", + "desc": "Fjern adgangskodebeskyttelse fra dit PDF-dokument." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Komprimer", + "desc": "Komprimer PDF'er for at reducere deres filstørrelse." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Ændre Metadata", + "desc": "Ændre/Fjern/Tilføj metadata fra et PDF-dokument" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Oprydning af scanninger", + "desc": "Oprydning af scanninger og genkender tekst fra billeder i en PDF og tilføjer den igen som tekst." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Udtræk Billeder", + "desc": "Udtrækker alle billeder fra en PDF og gemmer dem som zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Underskriv", + "desc": "Tilføjer underskrift til PDF ved tegning, tekst eller billede" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Udjævn", + "desc": "Fjern alle interaktive elementer og formularer fra en PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Underskriv med Certifikat", + "desc": "Underskriver en PDF med et Certifikat/Nøgle (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Reparér", + "desc": "Forsøger at reparere en korrupt/ødelagt PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Fjern Tomme sider", + "desc": "Detekterer og fjerner tomme sider fra et dokument" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Fjern Anmærkninger", + "desc": "Fjerner alle kommentarer/anmærkninger fra en PDF" + }, + "compare": { + "tags": "difference", + "title": "Sammenlign", + "desc": "Sammenligner og viser forskellene mellem 2 PDF-dokumenter" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Fjern Certifikatunderskrift", + "desc": "Fjern certifikatunderskrift fra PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Multi-Side Layout", + "desc": "Flet flere sider af et PDF-dokument til en enkelt side" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Justér sidestørrelse/skala", + "desc": "Ændre størrelsen/skalaen af en side og/eller dens indhold." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Tilføj Sidenumre", + "desc": "Tilføj Sidenumre gennem hele dokumentet på et bestemt sted" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Justér Farver/Kontrast", + "desc": "Justér Kontrast, Mætning og Lysstyrke af en PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Beskær PDF", + "desc": "Beskær en PDF for at reducere dens størrelse (bevarer tekst!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Auto Opdel Sider", + "desc": "Auto Opdel Scannede PDF'er med fysisk scannet side-splitter QR-kode" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Få ALLE Oplysninger om PDF", + "desc": "Henter alle mulige oplysninger om PDF'er" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF til Enkelt Stor Side", + "desc": "Fletter alle PDF-sider til én stor enkelt side" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Vis Javascript", + "desc": "Søger og viser eventuelt JS indsprøjtet i en PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Fjern billede", + "desc": "Fjern billede fra PDF for at reducere filstørrelse" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Partitioner PDF efter kapitler", + "desc": "Partitioner en PDF i flere filer baseret på dens kapitelstruktur." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Udtræk Sider", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Fjern", + "desc": "Slet uønskede sider fra dit PDF-dokument." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Auto Opdel efter Størrelse/Antal", + "desc": "Opdel en enkelt PDF i flere dokumenter baseret på størrelse, sideantal eller dokumentantal" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Tilføj Adgangskode", + "desc": "Kryptér dit PDF-dokument med en adgangskode." + }, + "changePermissions": { + "title": "Ændre Tilladelser", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Overlejrer PDF'er oven på en anden PDF", + "title": "Overlejr PDF'er" + }, "imageToPDF": { "title": "Billede til PDF", "desc": "Konvertér et billede (PNG, JPEG, GIF) til PDF." @@ -355,18 +786,6 @@ "title": "PDF til Billede", "desc": "Konvertér en PDF til et billede. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organisér", - "desc": "Fjern/Omarrangér sider i vilkårlig rækkefølge" - }, - "addImage": { - "title": "Tilføj billede", - "desc": "Tilføjer et billede på en bestemt placering på PDF'en" - }, - "watermark": { - "title": "Tilføj Vandmærke", - "desc": "Tilføj et brugerdefineret vandmærke til dit PDF-dokument." - }, "permissions": { "title": "Ændre Tilladelser", "desc": "Ændre tilladelserne for dit PDF-dokument" @@ -375,38 +794,10 @@ "title": "Fjern", "desc": "Slet uønskede sider fra dit PDF-dokument." }, - "addPassword": { - "title": "Tilføj Adgangskode", - "desc": "Kryptér dit PDF-dokument med en adgangskode." - }, - "removePassword": { - "title": "Fjern Adgangskode", - "desc": "Fjern adgangskodebeskyttelse fra dit PDF-dokument." - }, - "compress": { - "title": "Komprimer", - "desc": "Komprimer PDF'er for at reducere deres filstørrelse." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Ændre Metadata", - "desc": "Ændre/Fjern/Tilføj metadata fra et PDF-dokument" - }, "fileToPDF": { "title": "Konvertér fil til PDF", "desc": "Konvertér næsten enhver fil til PDF (DOCX, PNG, XLS, PPT, TXT og mere)" }, - "ocr": { - "title": "OCR / Oprydning af scanninger", - "desc": "Oprydning af scanninger og genkender tekst fra billeder i en PDF og tilføjer den igen som tekst." - }, - "extractImages": { - "title": "Udtræk Billeder", - "desc": "Udtrækker alle billeder fra en PDF og gemmer dem som zip" - }, "pdfToPDFA": { "title": "PDF til PDF/A", "desc": "Konvertér PDF til PDF/A for langtidsopbevaring" @@ -435,70 +826,14 @@ "title": "Detektér/Opdel Scannede fotosb", "desc": "Opdeler flere fotos fra et enkelt foto/PDF" }, - "sign": { - "title": "Underskriv", - "desc": "Tilføjer underskrift til PDF ved tegning, tekst eller billede" - }, - "flatten": { - "title": "Udjævn", - "desc": "Fjern alle interaktive elementer og formularer fra en PDF" - }, - "repair": { - "title": "Reparér", - "desc": "Forsøger at reparere en korrupt/ødelagt PDF" - }, - "removeBlanks": { - "title": "Fjern Tomme sider", - "desc": "Detekterer og fjerner tomme sider fra et dokument" - }, - "removeAnnotations": { - "title": "Fjern Anmærkninger", - "desc": "Fjerner alle kommentarer/anmærkninger fra en PDF" - }, - "compare": { - "title": "Sammenlign", - "desc": "Sammenligner og viser forskellene mellem 2 PDF-dokumenter" - }, - "certSign": { - "title": "Underskriv med Certifikat", - "desc": "Underskriver en PDF med et Certifikat/Nøgle (PEM/P12)" - }, - "removeCertSign": { - "title": "Fjern Certifikatunderskrift", - "desc": "Fjern certifikatunderskrift fra PDF" - }, - "pageLayout": { - "title": "Multi-Side Layout", - "desc": "Flet flere sider af et PDF-dokument til en enkelt side" - }, - "scalePages": { - "title": "Justér sidestørrelse/skala", - "desc": "Ændre størrelsen/skalaen af en side og/eller dens indhold." - }, "pipeline": { "title": "Pipeline (Avanceret)", "desc": "Kør flere handlinger på PDF'er ved at definere pipeline-scripts" }, - "addPageNumbers": { - "title": "Tilføj Sidenumre", - "desc": "Tilføj Sidenumre gennem hele dokumentet på et bestemt sted" - }, "auto-rename": { "title": "Auto Omdøb PDF-fil", "desc": "Auto omdøber en PDF-fil baseret på dens detekterede overskrift" }, - "adjustContrast": { - "title": "Justér Farver/Kontrast", - "desc": "Justér Kontrast, Mætning og Lysstyrke af en PDF" - }, - "crop": { - "title": "Beskær PDF", - "desc": "Beskær en PDF for at reducere dens størrelse (bevarer tekst!)" - }, - "autoSplitPDF": { - "title": "Auto Opdel Sider", - "desc": "Auto Opdel Scannede PDF'er med fysisk scannet side-splitter QR-kode" - }, "sanitizePDF": { "title": "Rens", "desc": "Fjern scripts og andre elementer fra PDF-filer" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Få ALLE Oplysninger om PDF", - "desc": "Henter alle mulige oplysninger om PDF'er" - }, "pageExtracter": { "title": "Udtræk side(r)", "desc": "Udtrækker udvalgte sider fra PDF" }, - "pdfToSinglePage": { - "title": "PDF til Enkelt Stor Side", - "desc": "Fletter alle PDF-sider til én stor enkelt side" - }, - "showJS": { - "title": "Vis Javascript", - "desc": "Søger og viser eventuelt JS indsprøjtet i en PDF" - }, "autoRedact": { "title": "Auto Rediger", "desc": "Auto Redigerer (Sværter) tekst i en PDF baseret på input tekst" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF til CSV", "desc": "Udtrækker Tabeller fra en PDF og konverterer dem til CSV" @@ -551,10 +870,6 @@ "title": "Auto Opdel efter Størrelse/Antal", "desc": "Opdel en enkelt PDF i flere dokumenter baseret på størrelse, sideantal eller dokumentantal" }, - "overlay-pdfs": { - "title": "Overlejr PDF'er", - "desc": "Overlejrer PDF'er oven på en anden PDF" - }, "split-by-sections": { "title": "Opdel PDF efter Sektioner", "desc": "Opdel hver side af en PDF i mindre horisontale og vertikale sektioner" @@ -563,43 +878,17 @@ "title": "Tilføj Stempel til PDF", "desc": "Tilføj tekst eller tilføj billedstempel på bestemte placeringer" }, - "removeImage": { - "title": "Fjern billede", - "desc": "Fjern billede fra PDF for at reducere filstørrelse" - }, - "splitByChapters": { - "title": "Partitioner PDF efter kapitler", - "desc": "Partitioner en PDF i flere filer baseret på dens kapitelstruktur." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Erstatt farve for tekst og baggrund i en PDF og omgivende farve til fuld farve af PDF for at redusere filstørrelsen." }, - "convert": { - "title": "Konvertér" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Udtræk Sider" - }, - "removePages": { - "title": "Fjern", - "desc": "Slet uønskede sider fra dit PDF-dokument." - }, "removeImagePdf": { "title": "Fjern billede", "desc": "Fjern billede fra PDF for at reducere filstørrelse" }, - "autoSizeSplitPDF": { - "title": "Auto Opdel efter Størrelse/Antal", - "desc": "Opdel en enkelt PDF i flere dokumenter baseret på størrelse, sideantal eller dokumentantal" - }, "adjust-contrast": { "title": "Justér Farver/Kontrast", "desc": "Justér Kontrast, Mætning og Lysstyrke af en PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Replace and Invert Color", "desc": "Erstatt farve for tekst og baggrund i en PDF og omgivende farve til fuld farve af PDF for at redusere filstørrelsen." - }, - "changePermissions": { - "title": "Ændre Tilladelser" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "se,læs,annotér,tekst,billede", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "flet,Sideoperationer,Back end,server side", "title": "Flet", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Flet", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Filnavn", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Flet flere PDF'er (2+)", "sortByName": "Sortér efter navn", "sortByDate": "Sortér efter dato", - "removeCertSign": "Fjern digital signatur i den flettede fil?", - "submit": "Flet", - "sortBy": { - "filename": "Filnavn" - } + "removeCertSign": "Fjern digital signatur i den flettede fil?" }, "split": { - "tags": "Sideoperationer,opdel,Multi Side,klip,server side", "title": "Opdel PDF", "header": "Opdel PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Indtast sider at opdele på:", "submit": "Opdel", "steps": { + "chooseMethod": "Choose Method", "settings": "Indstillinger" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Filstørrelse" + "name": "Filstørrelse", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Filstørrelse" + "label": "Filstørrelse", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Sideoperationer,opdel,Multi Side,klip,server side" }, "rotate": { - "tags": "server side", "title": "Rotér PDF", + "submit": "Rotér", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "server side", "header": "Rotér PDF", - "selectAngle": "Vælg rotationsvinkel (i multipla af 90 grader):", - "submit": "Rotér" + "selectAngle": "Vælg rotationsvinkel (i multipla af 90 grader):" + }, + "convert": { + "title": "Konvertér", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Indstillinger", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Farve", + "greyscale": "Gråtone", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Udfyld Side", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF'en indeholder en digital signatur. Dette vil blive fjernet i næste trin.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Gråtone", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konvertering,img,jpg,billede,foto" @@ -727,7 +1263,33 @@ "8": "Fjern Sidste", "9": "Fjern Første og Sidste", "10": "Ulige-Lige Sammenføjning", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Tilføj billede", "submit": "Tilføj billede" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Tekst,gentagne,etiket,egen,ophavsret,varemærke,img,jpg,billede,foto", "title": "Tilføj Vandmærke", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Tilføj Vandmærke", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Tekst", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Skriftstørrelse", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Tekst", + "2": "Billede" + }, + "tags": "Tekst,gentagne,etiket,egen,ophavsret,varemærke,img,jpg,billede,foto", "header": "Tilføj Vandmærke", "customColor": "Brugerdefineret Tekstfarve", "selectText": { @@ -755,17 +1506,6 @@ "8": "Vandmærketype:", "9": "Vandmærkebillede:", "10": "Konvertér PDF til PDF-Billede" - }, - "submit": "Tilføj Vandmærke", - "type": { - "1": "Tekst", - "2": "Billede" - }, - "watermarkType": { - "text": "Tekst" - }, - "settings": { - "fontSize": "Skriftstørrelse" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Fjern sider,slet sider", "title": "Fjern", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Fjern" }, - "addPassword": { - "tags": "sikker,sikkerhed", - "title": "Tilføj Adgangskode", - "header": "Tilføj adgangskode (Kryptér)", - "selectText": { - "1": "Vælg PDF til kryptering", - "2": "Brugeradgangskode", - "3": "Krypteringsnøglelængde", - "4": "Højere værdier er stærkere, men lavere værdier har bedre kompatibilitet.", - "5": "Tilladelser at indstille (Anbefales at bruges sammen med Ejer adgangskode)", - "6": "Forhindre samling af dokument", - "7": "Forhindre indholdsudtrækning", - "8": "Forhindre udtrækning for tilgængelighed", - "9": "Forhindre udfyldning af formular", - "10": "Forhindre ændring", - "11": "Forhindre anmærkningsændring", - "12": "Forhindre udskrivning", - "13": "Forhindre udskrivning af forskellige formater", - "14": "Ejer Adgangskode", - "15": "Begrænser hvad der kan gøres med dokumentet, når det er åbnet (Understøttes ikke af alle læsere)", - "16": "Begrænser åbningen af selve dokumentet" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Kryptér", "tooltip": { - "permissions": { - "title": "Ændre Tilladelser" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "sikker,Dekryptér,sikkerhed,fjern adgangskode,slet adgangskode", - "title": "Fjern adgangskode", - "header": "Fjern adgangskode (Dekryptér)", - "selectText": { - "1": "Vælg PDF til Dekryptering", - "2": "Adgangskode" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Fjern", - "desc": "Fjern adgangskodebeskyttelse fra dit PDF-dokument.", - "password": { - "stepTitle": "Fjern Adgangskode", - "label": "Nuværende Adgangskode" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Titel,forfatter,dato,oprettelse,tid,udgiver,producent,statistik", - "title": "Ændre Metadata", "header": "Ændre Metadata", + "submit": "Ændre", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Titel,forfatter,dato,oprettelse,tid,udgiver,producent,statistik", "selectText": { "1": "Rediger venligst de variabler, du ønsker at ændre", "2": "Slet al metadata", @@ -856,15 +1877,7 @@ "4": "Anden Metadata:", "5": "Tilføj Brugerdefineret Metadata Post" }, - "author": "Forfatter:", - "creationDate": "Oprettelsesdato (åååå/MM/dd TT:mm:ss):", - "creator": "Skaber:", - "keywords": "Nøgleord:", - "modDate": "Ændringsdato (åååå/MM/dd TT:mm:ss):", - "producer": "Producent:", - "subject": "Emne:", - "trapped": "Fanget:", - "submit": "Ændre" + "modDate": "Ændringsdato (åååå/MM/dd TT:mm:ss):" }, "fileToPDF": { "tags": "transformation,format,dokument,billede,dias,tekst,konvertering,kontor,docs,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "genkendelse,tekst,billede,scan,læs,identificér,detektion,redigerbar", "title": "OCR / Scan Oprydning", + "desc": "Oprydning af scanninger og genkender tekst fra billeder i en PDF og tilføjer den igen som tekst.", "header": "Oprydning af Scanninger / OCR (Optisk Karaktergenkendelse)", "selectText": { "1": "Vælg sprog, der skal detekteres i PDF'en (De angivne er dem, der i øjeblikket er registreret):", @@ -896,23 +1910,89 @@ "help": "Læs venligst denne dokumentation om, hvordan man bruger dette til andre sprog og/eller brug uden for docker", "credit": "Denne tjeneste bruger qpdf og Tesseract til OCR.", "submit": "Behandl PDF med OCR", - "desc": "Oprydning af scanninger og genkender tekst fra billeder i en PDF og tilføjer den igen som tekst.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Indstillinger", "ocrMode": { - "label": "OCR-tilstand" + "label": "OCR-tilstand", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Sprog" + "label": "Sprog", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR-tilstand" + "title": "OCR-tilstand", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Sprog" + "title": "Sprog", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Udtræk Billeder", "selectText": "Vælg billedformat til at konvertere udtrukne billeder til", "allowDuplicates": "Gem duplikerede billeder", - "submit": "Udtræk" + "submit": "Udtræk", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arkiv,langtids,standard,konvertering,opbevaring,bevaring", @@ -993,17 +2079,53 @@ }, "info": "Python er ikke installeret. Det er nødvendigt for at køre." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autorisér,initialer,tegnet-underskrift,tekst-underskrift,billede-underskrift", "title": "Underskriv", "header": "Underskriv PDF'er", "upload": "Upload Billede", - "draw": "Tegn Underskrift", - "text": "Tekstinput", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Ryd", "add": "Tilføj", "saved": "Gemte Signaturer", "save": "Gem Signatur", + "applySignatures": "Apply Signatures", "personalSigs": "Personlige Signaturer", "sharedSigs": "Delte Signaturer", "noSavedSigs": "Ingen Gemte Signaturer Fundet", @@ -1015,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autorisér,initialer,tegnet-underskrift,tekst-underskrift,billede-underskrift" }, "flatten": { - "tags": "statisk,deaktivér,ikke-interaktiv,strømlinje", "title": "Udjævn", "header": "Udjævn PDF", "flattenOnlyForms": "Udjævn kun formularer", "submit": "Udjævn", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Indstillinger" }, "options": { - "flattenOnlyForms": "Udjævn kun formularer" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Udjævn kun formularer", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statisk,deaktivér,ikke-interaktiv,strømlinje" }, "repair": { "tags": "fix,gendan,korrektion,genvind", "title": "Reparér", "header": "Reparér PDF'er", - "submit": "Reparér" + "submit": "Reparér", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "oprydning,strømlinje,ikke-indhold,organisér", "title": "Fjern Tomme Sider", "header": "Fjern Tomme Sider", - "threshold": "Pixel Hvidhedstærskel:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Fjern Tomme Sider", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "oprydning,strømlinje,ikke-indhold,organisér", "thresholdDesc": "Tærskel for at bestemme, hvor hvid en hvid pixel skal være for at blive klassificeret som 'Hvid'. 0 = Sort, 255 ren hvid.", - "whitePercent": "Hvid Procent (%):", - "whitePercentDesc": "Procent af siden, der skal være 'hvide' pixels for at blive fjernet", - "submit": "Fjern Tomme Sider" + "whitePercentDesc": "Procent af siden, der skal være 'hvide' pixels for at blive fjernet" }, "removeAnnotations": { "tags": "kommentarer,fremhæv,noter,markup,fjern", "title": "Fjern Anmærkninger", "header": "Fjern Anmærkninger", - "submit": "Fjern" + "submit": "Fjern", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "differentier,kontrast,ændringer,analyse", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "autentificér,PEM,P12,officiel,kryptér", "title": "Certifikat Underskrivning", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Placering", + "logoTitle": "Logo", + "name": "Navn", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Indtast Din Keystore eller Private Nøgle Adgangskode (Hvis nogen):", + "passwordOptional": "Leave empty if no password", + "reason": "Årsag", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Vis Logo", "header": "Underskriv en PDF med dit certifikat (Arbejde i gang)", "selectPDF": "Vælg en PDF-fil til underskrivning:", "jksNote": "Bemærk: Hvis din certifikattype ikke er angivet nedenfor, skal du konvertere det til en Java Keystore (.jks) fil ved hjælp af keytool kommandolinjeværktøjet. Vælg derefter .jks fil muligheden nedenfor.", @@ -1089,13 +2484,7 @@ "selectCert": "Vælg Din Certifikatfil (X.509 format, kan være .pem eller .der):", "selectP12": "Vælg Din PKCS#12 Keystore Fil (.p12 eller .pfx) (Valgfrit, Hvis angivet, skal den indeholde din private nøgle og certifikat):", "selectJKS": "Vælg Din Java Keystore Fil (.jks eller .keystore):", - "certType": "Certifikattype", - "password": "Indtast Din Keystore eller Private Nøgle Adgangskode (Hvis nogen):", "showSig": "Vis Underskrift", - "reason": "Årsag", - "location": "Placering", - "name": "Navn", - "showLogo": "Vis Logo", "submit": "Underskriv PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Fjern Certifikat Underskrift", "header": "Fjern det digitale certifikat fra PDF'en", "selectPDF": "Vælg en PDF-fil:", - "submit": "Fjern Underskrift" + "submit": "Fjern Underskrift", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "flet,sammensæt,enkelt-visning,organisér", @@ -1111,16 +2511,157 @@ "header": "Multi-Side Layout", "pagesPerSheet": "Sider pr. ark:", "addBorder": "Tilføj Kanter", - "submit": "Indsend" + "submit": "Indsend", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "ændre størrelse,modificér,dimension,tilpas", "title": "Justér sidestørrelse", "header": "Justér sidestørrelse", "pageSize": "Størrelse på en side i dokumentet.", "keepPageSize": "Original Size", "scaleFactor": "Zoom-niveau (beskæring) af en side.", - "submit": "Indsend" + "submit": "Indsend", + "tags": "ændre størrelse,modificér,dimension,tilpas" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "nummerér,etiket,organisér,indeks" @@ -1129,16 +2670,83 @@ "tags": "auto-detektér,overskrift-baseret,organisér,omdøb", "title": "Auto Omdøb", "header": "Auto Omdøb PDF", - "submit": "Auto Omdøb" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Auto Omdøb", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "farvekorrektion,juster,modificér,forbedre" }, "crop": { - "tags": "trim,formindsk,redigér,form", "title": "Beskær", "header": "Beskær PDF", - "submit": "Indsend" + "submit": "Indsend", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "trim,formindsk,redigér,form" }, "autoSplitPDF": { "tags": "QR-baseret,adskil,scan-segment,organisér", @@ -1221,24 +2829,124 @@ "downloadJS": "Last ned Javascript", "submit": "Vis" }, - "autoRedact": { - "tags": "Rediger,Skjul,sværte,sort,markør,skjult", - "title": "Auto Rediger", - "header": "Auto Rediger", - "colorLabel": "Farve", - "textsToRedactLabel": "Tekst der skal redigeres (linje-adskilt)", - "textsToRedactPlaceholder": "f.eks. \\nFortroligt \\nTop-Hemmelig", - "useRegexLabel": "Brug Regex", - "wholeWordSearchLabel": "Hele Ord Søgning", - "customPaddingLabel": "Brugerdefineret Ekstra Polstring", - "convertPDFToImageLabel": "Konvertér PDF til PDF-Billede (Bruges til at fjerne tekst bag boksen)", - "submitButton": "Indsend" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Avanceret" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Tilføj", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Sideantal", + "placeholder": "(f.eks. 1,2,8 eller 4,7,12-16 eller 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1264,21 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Avanceret" - }, - "wordsToRedact": { - "add": "Tilføj" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Sideantal", - "placeholder": "(f.eks. 1,2,8 eller 4,7,12-16 eller 2n-1)" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Tabeludtrækning,udtræk,konvertér" @@ -1289,11 +2983,15 @@ "overlay-pdfs": { "tags": "Overlejr", "header": "Overlejr PDF-filer", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Vælg Base PDF-fil" }, "overlayFiles": { - "label": "Vælg Overlejrings PDF-filer" + "label": "Vælg Overlejrings PDF-filer", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Vælg Overlejringstilstand", @@ -1303,14 +3001,53 @@ }, "counts": { "label": "Antal overlejringer (for Fast Gentaget tilstand)", - "placeholder": "Indtast kommaseparerede tællinger (f.eks. 2,3,1)" + "placeholder": "Indtast kommaseparerede tællinger (f.eks. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Vælg overlejringsposition", "foreground": "Forgrund", "background": "Baggrund" }, - "submit": "Indsend" + "submit": "Indsend", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Sektionsopdeling, Opdel, Tilpas", @@ -1331,6 +3068,7 @@ "tags": "Stempel, Tilføj billede, centrer billede, Vandmærke, PDF, Indlejr, Tilpas", "header": "Stempel PDF", "title": "Stempel PDF", + "stampSetup": "Stamp Setup", "stampType": "Stempeltype", "stampText": "Stempeltekst", "stampImage": "Stempelbillede", @@ -1343,7 +3081,19 @@ "overrideY": "Tilsidesæt Y-koordinat", "customMargin": "Brugerdefineret Margin", "customColor": "Brugerdefineret Tekstfarve", - "submit": "Indsend" + "submit": "Indsend", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Fjern Billede,Sideoperationer,Back end,server side" @@ -1361,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1388,40 +3139,122 @@ "version": "Version", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Erstat-omgivende Farve PDF", - "selectText": { - "1": "Erstatt eller omgivende Farvemuligheder", - "2": "Standard (høj kontrastfarver)", - "3": "Brugerdefineret (anpassede farver)", - "4": "Inverter alle farver", - "5": "Høj kontrastfarveindstillinger", - "6": "Hvid tekst på sort baggrund", - "7": "Sort tekst på hvid baggrund", - "8": "Gul tekst på sort baggrund", - "9": "Grøn tekst på sort baggrund", - "10": "Vælg tekstfarve", - "11": "Vælg baggrundsfarve" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Erstat" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Erstat Farve,Side operationer,Behandling,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Log ind", "header": "Log ind", "signin": "Log ind", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Husk mig", "invalid": "Ugyldigt brugernavn eller adgangskode.", "locked": "Din konto er blevet låst.", @@ -1440,12 +3273,83 @@ "alreadyLoggedIn": "Du er allerede logget ind på", "alreadyLoggedIn2": "enheder. Log ud af disse enheder og prøv igen.", "toManySessions": "Du har for mange aktive sessoner", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF Til Enkelt Side", "header": "PDF Til Enkelt Side", - "submit": "Konvertér Til Enkelt Side" + "submit": "Konvertér Til Enkelt Side", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Udtræk Sider", @@ -1469,18 +3373,59 @@ "adjustContrast": { "title": "Justér Kontrast", "header": "Justér Kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Lysstyrke:", "saturation": "Mætning:", - "download": "Download" + "download": "Download", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Komprimer", + "desc": "Compress PDFs to reduce their file size.", "header": "Komprimer PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Filstørrelse" + }, "credit": "Denne tjeneste bruger qpdf til PDF Komprimering/Optimering.", "grayscale": { "label": "Anvend gråskala til komprimering" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1490,10 +3435,7 @@ "4": "Auto tilstand - Justerer automatisk kvaliteten for at få PDF'en til en præcis størrelse", "5": "Forventet PDF-størrelse (f.eks. 25MB, 10.8MB, 25KB)" }, - "submit": "Komprimer", - "method": { - "filesize": "Filstørrelse" - } + "submit": "Komprimer" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1594,7 +3536,13 @@ "title": "Fjern billede", "header": "Fjern billede", "removeImage": "Fjern billede", - "submit": "Fjern" + "submit": "Fjern", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Del PDF ved Kapitler", @@ -1628,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1663,42 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "convert": { - "title": "Konvertér", - "settings": "Indstillinger", - "color": "Farve", - "greyscale": "Gråtone", - "fillPage": "Udfyld Side", - "pdfaDigitalSignatureWarning": "PDF'en indeholder en digital signatur. Dette vil blive fjernet i næste trin.", - "grayscale": "Gråtone" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Underskriv" + "read": "Read", + "sign": "Underskriv", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { - "loading": "Laster..." + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Laster...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Navn", - "delete": "Slet" + "fileFormat": "Format", + "fileSize": "Size", + "fileVersion": "Version", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", + "download": "Download", + "delete": "Slet", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Rens PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Indstillinger" + "files": "Files", + "settings": "Indstillinger", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Tilføj Adgangskode", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Kryptér", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Ændre Tilladelser", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "sikker,sikkerhed", + "header": "Tilføj adgangskode (Kryptér)", + "selectText": { + "1": "Vælg PDF til kryptering", + "2": "Brugeradgangskode", + "3": "Krypteringsnøglelængde", + "4": "Højere værdier er stærkere, men lavere værdier har bedre kompatibilitet.", + "5": "Tilladelser at indstille (Anbefales at bruges sammen med Ejer adgangskode)", + "6": "Forhindre samling af dokument", + "7": "Forhindre indholdsudtrækning", + "8": "Forhindre udtrækning for tilgængelighed", + "9": "Forhindre udfyldning af formular", + "10": "Forhindre ændring", + "11": "Forhindre anmærkningsændring", + "12": "Forhindre udskrivning", + "13": "Forhindre udskrivning af forskellige formater", + "14": "Ejer Adgangskode", + "15": "Begrænser hvad der kan gøres med dokumentet, når det er åbnet (Understøttes ikke af alle læsere)", + "16": "Begrænser åbningen af selve dokumentet" } }, "changePermissions": { "title": "Ændre Tilladelser", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Ændre Tilladelser", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Forhindre samling af dokument" @@ -1725,10 +4580,784 @@ "label": "Forhindre udskrivning af forskellige formater" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Ændre Tilladelser" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Fjern adgangskode", + "desc": "Fjern adgangskodebeskyttelse fra dit PDF-dokument.", + "tags": "sikker,Dekryptér,sikkerhed,fjern adgangskode,slet adgangskode", + "password": { + "stepTitle": "Fjern Adgangskode", + "label": "Nuværende Adgangskode", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Fjern", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Fjern adgangskode (Dekryptér)", + "selectText": { + "1": "Vælg PDF til Dekryptering", + "2": "Adgangskode" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Erstatt eller omgivende Farvemuligheder", + "2": "Standard (høj kontrastfarver)", + "3": "Brugerdefineret (anpassede farver)", + "4": "Inverter alle farver", + "5": "Høj kontrastfarveindstillinger", + "6": "Hvid tekst på sort baggrund", + "7": "Sort tekst på hvid baggrund", + "8": "Gul tekst på sort baggrund", + "9": "Grøn tekst på sort baggrund", + "10": "Vælg tekstfarve", + "11": "Vælg baggrundsfarve", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Erstat", + "title": "Replace-Invert-Color", + "header": "Erstat-omgivende Farve PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Rediger,Skjul,sværte,sort,markør,skjult", + "title": "Auto Rediger", + "header": "Auto Rediger", + "colorLabel": "Farve", + "textsToRedactLabel": "Tekst der skal redigeres (linje-adskilt)", + "textsToRedactPlaceholder": "f.eks. \\nFortroligt \\nTop-Hemmelig", + "useRegexLabel": "Brug Regex", + "wholeWordSearchLabel": "Hele Ord Søgning", + "customPaddingLabel": "Brugerdefineret Ekstra Polstring", + "convertPDFToImageLabel": "Konvertér PDF til PDF-Billede (Bruges til at fjerne tekst bag boksen)", + "submitButton": "Indsend" + }, + "replaceColorPdf": { + "tags": "Erstat Farve,Side operationer,Behandling,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/de-DE/translation.json b/frontend/public/locales/de-DE/translation.json index 4ff3f64ef..3cf8e915b 100644 --- a/frontend/public/locales/de-DE/translation.json +++ b/frontend/public/locales/de-DE/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "Sie haben ungespeicherte Änderungen an Ihrer PDF. Was möchten Sie tun?", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Ungespeicherte Änderungen", + "keepWorking": "Weiterarbeiten", + "discardChanges": "Änderungen verwerfen", + "applyAndContinue": "Anwenden & Fortfahren", + "exportAndContinue": "Exportieren & Fortfahren", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Benutzerdefinierter Text", "numberPagesDesc": "Welche Seiten nummeriert werden sollen, Standardeinstellung 'alle' ('all'), akzeptiert auch 1-5 oder 2,5,9 usw.", "customNumberDesc": "Standardmäßig {n}, akzeptiert auch 'Seite {n} von {total}', 'Text-{n}', '{filename}-{n}'", - "submit": "Seitenzahlen hinzufügen" + "submit": "Seitenzahlen hinzufügen", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Benutzerdefinierte Seitenauswahl (Geben Sie eine durch Kommas getrennte Liste von Seitenzahlen 1,5,6 oder Funktionen wie 2n+1 ein):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "PDF(s) auswählen", "multiPdfPrompt": "PDFs auswählen (2+)", "multiPdfDropPrompt": "Wählen Sie alle gewünschten PDFs aus (oder ziehen Sie sie per Drag & Drop hierhin)", @@ -30,7 +84,6 @@ "uploadLimitExceededPlural": "sind zu groß. Die maximal zulässige Größe ist", "processTimeWarning": "Achtung: Abhängig von der Dateigröße kann dieser Prozess bis zu einer Minute dauern", "pageOrderPrompt": "Seitenreihenfolge (Geben Sie eine durch Komma getrennte Liste von Seitenzahlen ein):", - "pageSelectionPrompt": "Benutzerdefinierte Seitenauswahl (Geben Sie eine durch Kommas getrennte Liste von Seitenzahlen 1,5,6 oder Funktionen wie 2n+1 ein):", "goToPage": "Gehe zu", "true": "Wahr", "false": "Falsch", @@ -41,11 +94,18 @@ "save": "Speichern", "saveToBrowser": "Im Browser speichern", "download": "Herunterladen", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", "undoOperationTooltip": "Klicken zum Rückgängigmachen der letzten Operation und Wiederherstellen der ursprünglichen Dateien", "undo": "Rückgängig", "moreOptions": "Weitere Optionen", "editYourNewFiles": "Ihre neue(n) Datei(en) bearbeiten", "close": "Schließen", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "Ausgewählt: {{filename}}", "chooseFile": "Datei wählen", "filesSelected": "Dateien ausgewählt", @@ -55,7 +115,9 @@ "uploadFiles": "Dateien hochladen", "addFiles": "Dateien hinzufügen", "selectFromWorkbench": "Dateien von der Workbench auswählen oder", - "selectMultipleFromWorkbench": "Mindestens {{count}} Dateien von der Workbench auswählen oder" + "selectMultipleFromWorkbench": "Mindestens {{count}} Dateien von der Workbench auswählen oder", + "created": "Created", + "size": "File Size" }, "noFavourites": "Keine Favoriten hinzugefügt", "downloadComplete": "Download abgeschlossen", @@ -74,7 +136,10 @@ }, "error": { "pdfPassword": "Das PDF-Dokument ist passwortgeschützt und das Passwort wurde entweder nicht angegeben oder war falsch", + "encryptedPdfMustRemovePassword": "Diese PDF ist verschlüsselt oder passwortgeschützt. Bitte entsperren Sie sie, bevor Sie in PDF/A konvertieren.", + "incorrectPasswordProvided": "Das PDF-Passwort ist falsch oder wurde nicht angegeben.", "_value": "Fehler", + "dismissAllErrors": "Alle Fehler ausblenden", "sorry": "Entschuldigung für das Problem!", "needHelp": "Brauchen Sie Hilfe / Ein Problem gefunden?", "contactTip": "Wenn Sie weiterhin Probleme haben, zögern Sie nicht, uns um Hilfe zu bitten. Du kannst ein Ticket auf unserer GitHub-Seite einreichen oder uns über Discord kontaktieren:", @@ -87,10 +152,7 @@ "showStack": "Stack-Trace anzeigen", "copyStack": "Stack-Trace kopieren", "githubSubmit": "GitHub - Ein Ticket einreichen", - "discordSubmit": "Discord - Unterstützungsbeitrag einreichen", - "dismissAllErrors": "Alle Fehler ausblenden", - "encryptedPdfMustRemovePassword": "Diese PDF ist verschlüsselt oder passwortgeschützt. Bitte entsperren Sie sie, bevor Sie in PDF/A konvertieren.", - "incorrectPasswordProvided": "Das PDF-Passwort ist falsch oder wurde nicht angegeben." + "discordSubmit": "Discord - Unterstützungsbeitrag einreichen" }, "warning": { "tooltipTitle": "Warnung" @@ -188,6 +250,7 @@ "title": "Möchten Sie Stirling-PDF verbessern?", "paragraph1": "Stirling-PDF verfügt über Opt-in-Analytics, die uns helfen, das Produkt zu verbessern. Wir zeichnen keine persönlichen Informationen oder Dateiinhalte auf.", "paragraph2": "Bitte erwägen Sie die Analytics zu aktivieren, um Stirling-PDF beim Wachsen zu helfen und um unsere User besser zu verstehen.", + "learnMore": "Learn more", "enable": "Analytics aktivieren", "disable": "Analytics deaktivieren", "settings": "Sie können die Einstellungen für die Analytics in der config/settings.yml Datei bearbeiten" @@ -231,6 +294,54 @@ "cacheInputs": { "name": "Formulareingaben speichern", "help": "Aktivieren, um zuvor verwendete Eingaben für zukünftige Durchläufe zu speichern" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -302,8 +413,10 @@ "top20": "Top 20", "all": "Alle", "refresh": "Aktualisieren", - "includeHomepage": "Startseite ('/') einschließen", - "includeLoginPage": "Anmeldeseite einschließen ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Gesamtendpunkte", "totalVisits": "Gesamtbesuche", "showing": "Zeigen", @@ -318,7 +431,9 @@ "top": "Spitze", "numberOfVisits": "Anzahl der Besuche", "visitsTooltip": "Besuche: {0} ({1}% des Gesamten)", - "retry": "Wiederholen" + "retry": "Wiederholen", + "includeHomepage": "Startseite ('/') einschließen", + "includeLoginPage": "Anmeldeseite einschließen ('/login')" }, "database": { "title": "Datenbank Import/Export", @@ -359,278 +474,284 @@ "alphabetical": "Alphabetisch", "globalPopularity": "Beliebtheit", "sortBy": "Sortieren nach:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "mehrere,werkzeuge", "title": "PDF-Multitool", - "desc": "Seiten zusammenführen, drehen, neu anordnen und entfernen", - "tags": "mehrere,werkzeuge" + "desc": "Seiten zusammenführen, drehen, neu anordnen und entfernen" }, "merge": { + "tags": "kombinieren,zusammenführen,vereinen", "title": "Zusammenführen", - "desc": "Mehrere PDF-Dateien zu einer einzigen zusammenführen", - "tags": "kombinieren,zusammenführen,vereinen" + "desc": "Mehrere PDF-Dateien zu einer einzigen zusammenführen" }, "split": { + "tags": "teilen,trennen,aufteilen", "title": "Aufteilen", - "desc": "PDFs in mehrere Dokumente aufteilen", - "tags": "teilen,trennen,aufteilen" + "desc": "PDFs in mehrere Dokumente aufteilen" }, "rotate": { + "tags": "drehen,spiegeln,ausrichten", "title": "Drehen", - "desc": "Drehen Sie Ihre PDFs ganz einfach", - "tags": "drehen,spiegeln,ausrichten" + "desc": "Drehen Sie Ihre PDFs ganz einfach" }, "convert": { + "tags": "umwandeln,ändern", "title": "Umwandeln", - "desc": "Dateien zwischen verschiedenen Formaten konvertieren", - "tags": "umwandeln,ändern" + "desc": "Dateien zwischen verschiedenen Formaten konvertieren" }, "pdfOrganiser": { + "tags": "organisieren,umordnen,neu anordnen", "title": "Organisieren", - "desc": "Seiten entfernen und Seitenreihenfolge ändern", - "tags": "organisieren,umordnen,neu anordnen" + "desc": "Seiten entfernen und Seitenreihenfolge ändern" }, "addImage": { + "tags": "einfügen,einbetten,platzieren", "title": "Bild einfügen", - "desc": "Fügt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit)", - "tags": "einfügen,einbetten,platzieren" + "desc": "Fügt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit)" }, "addAttachments": { + "tags": "einbetten,anhängen,einfügen", "title": "Anhänge hinzufügen", - "desc": "Eingebettete Dateien (Anhänge) zu einer PDF hinzufügen oder entfernen", - "tags": "einbetten,anhängen,einfügen" + "desc": "Eingebettete Dateien (Anhänge) zu einer PDF hinzufügen oder entfernen" }, "watermark": { + "tags": "stempel,markierung,überlagerung", "title": "Wasserzeichen hinzufügen", - "desc": "Fügen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu", - "tags": "stempel,markierung,überlagerung" + "desc": "Fügen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu" }, "removePassword": { + "tags": "entsperren", "title": "Passwort entfernen", - "desc": "Den Passwortschutz eines PDFs entfernen", - "tags": "entsperren" + "desc": "Den Passwortschutz eines PDFs entfernen" }, "compress": { + "tags": "verkleinern,reduzieren,optimieren", "title": "Komprimieren", - "desc": "PDF komprimieren um die Dateigröße zu reduzieren", - "tags": "verkleinern,reduzieren,optimieren" + "desc": "PDF komprimieren um die Dateigröße zu reduzieren" }, "unlockPDFForms": { + "tags": "entsperren,aktivieren,bearbeiten", "title": "Schreibgeschützte PDF-Formfelder entfernen", - "desc": "Entfernen Sie die schreibgeschützte Eigenschaft von Formularfeldern in einem PDF-Dokument.", - "tags": "entsperren,aktivieren,bearbeiten" + "desc": "Entfernen Sie die schreibgeschützte Eigenschaft von Formularfeldern in einem PDF-Dokument." }, "changeMetadata": { + "tags": "bearbeiten,ändern,aktualisieren", "title": "Metadaten ändern", - "desc": "Ändern/Entfernen/Hinzufügen von Metadaten aus einem PDF-Dokument", - "tags": "bearbeiten,ändern,aktualisieren" + "desc": "Ändern/Entfernen/Hinzufügen von Metadaten aus einem PDF-Dokument" }, "ocr": { + "tags": "extrahieren,scannen", "title": "Führe OCR/Cleanup-Scans aus", - "desc": "Cleanup scannt und erkennt Text aus Bildern in einer PDF-Datei und fügt ihn erneut als Text hinzu", - "tags": "extrahieren,scannen" + "desc": "Cleanup scannt und erkennt Text aus Bildern in einer PDF-Datei und fügt ihn erneut als Text hinzu" }, "extractImages": { + "tags": "extrahieren,speichern,exportieren", "title": "Bilder extrahieren", - "desc": "Extrahiert alle Bilder aus einer PDF-Datei und speichert sie als Zip-Archiv", - "tags": "extrahieren,speichern,exportieren" + "desc": "Extrahiert alle Bilder aus einer PDF-Datei und speichert sie als Zip-Archiv" }, "scannerImageSplit": { + "tags": "erkennen,teilen,fotos", "title": "Gescannte Fotos erkennen/aufteilen", - "desc": "Teilt mehrere Fotos aus einem Foto/PDF auf", - "tags": "erkennen,teilen,fotos" + "desc": "Teilt mehrere Fotos aus einem Foto/PDF auf" }, "sign": { + "tags": "unterschrift,autogramm", "title": "Signieren", - "desc": "Fügt PDF-Signaturen durch Zeichnung, Text oder Bild hinzu", - "tags": "unterschrift,autogramm" + "desc": "Fügt PDF-Signaturen durch Zeichnung, Text oder Bild hinzu" }, "flatten": { + "tags": "vereinfachen,entfernen,interaktiv", "title": "Abflachen", - "desc": "Alle interaktiven Elemente und Formulare aus einem PDF entfernen", - "tags": "vereinfachen,entfernen,interaktiv" + "desc": "Alle interaktiven Elemente und Formulare aus einem PDF entfernen" }, "certSign": { + "tags": "authentifizieren,PEM,P12,offiziell,verschlüsseln,signieren,zertifikat,PKCS12,JKS,server,manuell,auto", "title": "Mit Zertifikat signieren", - "desc": "Ein PDF mit einem Zertifikat/Schlüssel (PEM/P12) signieren", - "tags": "authentifizieren,PEM,P12,offiziell,verschlüsseln,signieren,zertifikat,PKCS12,JKS,server,manuell,auto" + "desc": "Ein PDF mit einem Zertifikat/Schlüssel (PEM/P12) signieren" }, "repair": { + "tags": "reparieren,wiederherstellen", "title": "Reparatur", - "desc": "Versucht, ein beschädigtes/kaputtes PDF zu reparieren", - "tags": "reparieren,wiederherstellen" + "desc": "Versucht, ein beschädigtes/kaputtes PDF zu reparieren" }, "removeBlanks": { + "tags": "löschen,bereinigen,leer", "title": "Leere Seiten entfernen", - "desc": "Erkennt und entfernt leere Seiten aus einem Dokument", - "tags": "löschen,bereinigen,leer" + "desc": "Erkennt und entfernt leere Seiten aus einem Dokument" }, "removeAnnotations": { + "tags": "löschen,bereinigen,entfernen", "title": "Anmerkungen entfernen", - "desc": "Entfernt alle Kommentare/Anmerkungen aus einem PDF", - "tags": "löschen,bereinigen,entfernen" + "desc": "Entfernt alle Kommentare/Anmerkungen aus einem PDF" }, "compare": { + "tags": "unterschied", "title": "Vergleichen", - "desc": "Vergleicht und zeigt die Unterschiede zwischen zwei PDF-Dokumenten an", - "tags": "unterschied" + "desc": "Vergleicht und zeigt die Unterschiede zwischen zwei PDF-Dokumenten an" }, "removeCertSign": { + "tags": "entfernen,löschen,entsperren", "title": "Zertifikatsignatur entfernen", - "desc": "Zertifikatsignatur aus PDF entfernen", - "tags": "entfernen,löschen,entsperren" + "desc": "Zertifikatsignatur aus PDF entfernen" }, "pageLayout": { + "tags": "layout,anordnen,kombinieren", "title": "Mehrseitiges Layout", - "desc": "Mehrere Seiten eines PDF zu einer Seite zusammenführen", - "tags": "layout,anordnen,kombinieren" + "desc": "Mehrere Seiten eines PDF zu einer Seite zusammenführen" }, "bookletImposition": { + "tags": "broschüre,druck,bindung", "title": "Broschüren-Layout", - "desc": "Broschüren mit korrekter Seitenreihenfolge und mehrseitigem Layout für Druck und Bindung erstellen", - "tags": "broschüre,druck,bindung" + "desc": "Broschüren mit korrekter Seitenreihenfolge und mehrseitigem Layout für Druck und Bindung erstellen" }, "scalePages": { + "tags": "größe ändern,anpassen,skalieren", "title": "Seitengröße/Skalierung anpassen", - "desc": "Größe/Skalierung der Seite und/oder des Inhalts ändern", - "tags": "größe ändern,anpassen,skalieren" + "desc": "Größe/Skalierung der Seite und/oder des Inhalts ändern" }, "addPageNumbers": { + "tags": "nummerieren,paginierung,zählen", "title": "Seitenzahlen hinzufügen", - "desc": "Hinzufügen von Seitenzahlen an einer bestimmten Stelle", - "tags": "nummerieren,paginierung,zählen" + "desc": "Hinzufügen von Seitenzahlen an einer bestimmten Stelle" }, "autoRename": { + "tags": "auto-erkennung,kopfzeilen-basiert,organisieren,umbenennen", "title": "PDF-Datei automatisch umbenennen", - "desc": "Benennt eine PDF-Datei automatisch basierend auf der erkannten Überschrift um", - "tags": "auto-erkennung,kopfzeilen-basiert,organisieren,umbenennen" + "desc": "Benennt eine PDF-Datei automatisch basierend auf der erkannten Überschrift um" }, "adjustContrast": { + "tags": "kontrast,helligkeit,sättigung", "title": "Farben/Kontrast anpassen", - "desc": "Kontrast, Sättigung und Helligkeit einer PDF anpassen", - "tags": "kontrast,helligkeit,sättigung" + "desc": "Kontrast, Sättigung und Helligkeit einer PDF anpassen" }, "crop": { + "tags": "zuschneiden,schneiden,größe ändern", "title": "PDF zuschneiden", - "desc": "PDF zuschneiden um die Größe zu verändern (Text bleibt erhalten!)", - "tags": "zuschneiden,schneiden,größe ändern" + "desc": "PDF zuschneiden um die Größe zu verändern (Text bleibt erhalten!)" }, "autoSplitPDF": { + "tags": "auto,teilen,QR", "title": "PDF automatisch teilen", - "desc": "Physisch gescannte PDF anhand von Splitter-Seiten und QR-Codes aufteilen", - "tags": "auto,teilen,QR" + "desc": "Physisch gescannte PDF anhand von Splitter-Seiten und QR-Codes aufteilen" }, "sanitize": { + "tags": "bereinigen,löschen,entfernen", "title": "Bereinigen", - "desc": "Potentiell schädliche Elemente aus PDF-Dateien entfernen", - "tags": "bereinigen,löschen,entfernen" + "desc": "Potentiell schädliche Elemente aus PDF-Dateien entfernen" }, "getPdfInfo": { + "tags": "info,metadaten,details", "title": "Alle Informationen anzeigen", - "desc": "Erfasst alle möglichen Informationen in einer PDF", - "tags": "info,metadaten,details" + "desc": "Erfasst alle möglichen Informationen in einer PDF" }, "pdfToSinglePage": { + "tags": "kombinieren,zusammenführen,einzeln", "title": "PDF zu einer Seite zusammenfassen", - "desc": "Fügt alle PDF-Seiten zu einer einzigen großen Seite zusammen", - "tags": "kombinieren,zusammenführen,einzeln" + "desc": "Fügt alle PDF-Seiten zu einer einzigen großen Seite zusammen" }, "showJS": { + "tags": "javascript,code,skript", "title": "Javascript anzeigen", - "desc": "Alle Javascript Funktionen in einer PDF anzeigen", - "tags": "javascript,code,skript" + "desc": "Alle Javascript Funktionen in einer PDF anzeigen" }, "redact": { + "tags": "zensieren,schwärzen,verbergen", "title": "Manuell zensieren/schwärzen", - "desc": "Zensiere (Schwärze) eine PDF-Datei durch Auswählen von Text, gezeichneten Formen und/oder ausgewählten Seite(n)", - "tags": "zensieren,schwärzen,verbergen" - }, - "overlayPdfs": { - "title": "PDFs überlagern", - "desc": "PDFs über eine andere PDF überlagern", - "tags": "überlagern,kombinieren,stapeln" + "desc": "Zensiere (Schwärze) eine PDF-Datei durch Auswählen von Text, gezeichneten Formen und/oder ausgewählten Seite(n)" }, "splitBySections": { + "tags": "teilen,abschnitte,aufteilen", "title": "PDF nach Abschnitten aufteilen", - "desc": "Jede Seite einer PDF in kleinere horizontale und vertikale Abschnitte unterteilen", - "tags": "teilen,abschnitte,aufteilen" + "desc": "Jede Seite einer PDF in kleinere horizontale und vertikale Abschnitte unterteilen" }, "addStamp": { + "tags": "stempel,markierung,siegel", "title": "Stempel zu PDF hinzufügen", - "desc": "Text- oder Bildstempel an festgelegten Positionen hinzufügen", - "tags": "stempel,markierung,siegel" + "desc": "Text- oder Bildstempel an festgelegten Positionen hinzufügen" }, "removeImage": { + "tags": "entfernen,löschen,bereinigen", "title": "Bild entfernen", - "desc": "Bild aus PDF entfernen, um die Dateigröße zu verringern", - "tags": "entfernen,löschen,bereinigen" + "desc": "Bild aus PDF entfernen, um die Dateigröße zu verringern" }, "splitByChapters": { + "tags": "teilen,kapitel,struktur", "title": "PDF-Datei nach Kapiteln aufteilen", - "desc": "Aufteilung einer PDF-Datei in mehrere Dateien auf Basis der Kapitelstruktur.", - "tags": "teilen,kapitel,struktur" + "desc": "Aufteilung einer PDF-Datei in mehrere Dateien auf Basis der Kapitelstruktur." }, "validateSignature": { + "tags": "validieren,überprüfen,zertifikat", "title": "PDF-Signatur überprüfen", - "desc": "Digitale Signaturen und Zertifikate in PDF-Dokumenten überprüfen", - "tags": "validieren,überprüfen,zertifikat" + "desc": "Digitale Signaturen und Zertifikate in PDF-Dokumenten überprüfen" }, "swagger": { + "tags": "API,dokumentation,test", "title": "API-Dokumentation", - "desc": "API-Dokumentation anzeigen und Endpunkte testen", - "tags": "API,dokumentation,test" + "desc": "API-Dokumentation anzeigen und Endpunkte testen" }, - "fakeScan": { - "title": "Scan simulieren", - "desc": "Eine PDF erstellen, die wie gescannt aussieht" + "scannerEffect": { + "tags": "scannen,simulieren,erstellen", + "title": "Scanner-Effekt", + "desc": "Erstellen Sie eine PDF, die aussieht, als wäre sie gescannt worden" }, "editTableOfContents": { + "tags": "lesezeichen,inhalt,bearbeiten", "title": "Inhaltsverzeichnis bearbeiten", - "desc": "Hinzufügen oder Bearbeiten von Lesezeichen und Inhaltsverzeichnissen in PDF-Dokumenten", - "tags": "lesezeichen,inhalt,bearbeiten" + "desc": "Hinzufügen oder Bearbeiten von Lesezeichen und Inhaltsverzeichnissen in PDF-Dokumenten" }, "manageCertificates": { + "tags": "zertifikate,importieren,exportieren", "title": "Zertifikate verwalten", - "desc": "Digitale Zertifikatsdateien für die PDF-Signierung importieren, exportieren oder löschen.", - "tags": "zertifikate,importieren,exportieren" + "desc": "Digitale Zertifikatsdateien für die PDF-Signierung importieren, exportieren oder löschen." }, "read": { + "tags": "anzeigen,öffnen,anzeigen", "title": "Lesen", - "desc": "PDFs anzeigen und kommentieren. Text hervorheben, zeichnen oder Kommentare für Überprüfung und Zusammenarbeit einfügen.", - "tags": "anzeigen,öffnen,anzeigen" + "desc": "PDFs anzeigen und kommentieren. Text hervorheben, zeichnen oder Kommentare für Überprüfung und Zusammenarbeit einfügen." }, "reorganizePages": { + "tags": "umordnen,neu anordnen,organisieren", "title": "Seiten neu anordnen", - "desc": "PDF-Seiten mit visueller Drag-and-Drop-Steuerung neu anordnen, duplizieren oder löschen.", - "tags": "umordnen,neu anordnen,organisieren" + "desc": "PDF-Seiten mit visueller Drag-and-Drop-Steuerung neu anordnen, duplizieren oder löschen." }, "extractPages": { + "tags": "extrahieren,auswählen,kopieren", "title": "Seiten extrahieren", - "desc": "Spezifische Seiten aus einem PDF-Dokument extrahieren", - "tags": "extrahieren,auswählen,kopieren" + "desc": "Spezifische Seiten aus einem PDF-Dokument extrahieren" }, "removePages": { + "tags": "löschen,extrahieren,ausschließen", "title": "Entfernen", - "desc": "Ungewollte Seiten aus dem PDF entfernen", - "tags": "löschen,extrahieren,ausschließen" + "desc": "Ungewollte Seiten aus dem PDF entfernen" }, "autoSizeSplitPDF": { + "tags": "auto,teilen,größe", "title": "Teilen nach Größe/Anzahl", - "desc": "Teilen Sie ein einzelnes PDF basierend auf Größe, Seitenanzahl oder Dokumentanzahl in mehrere Dokumente auf", - "tags": "auto,teilen,größe" + "desc": "Teilen Sie ein einzelnes PDF basierend auf Größe, Seitenanzahl oder Dokumentanzahl in mehrere Dokumente auf" }, - "replaceColorPdf": { - "title": "Farbe ersetzen und invertieren", - "desc": "Ersetzen Sie die Farbe des Texts und Hintergrund der PDF-Datei und invertieren Sie die komplette Farbe der PDF-Datei, um die Dateigröße zu reduzieren" + "replaceColor": { + "title": "Farbe ersetzen & invertieren", + "desc": "Farben in PDF-Dokumenten ersetzen oder invertieren" }, "devApi": { - "desc": "Link zur API-Dokumentation", "tags": "API,entwicklung,dokumentation", - "title": "API" + "title": "API", + "desc": "Link zur API-Dokumentation" }, "devFolderScanning": { + "tags": "automatisierung,ordner,scannen", "title": "Automatische Ordnerüberwachung", - "desc": "Link zum Leitfaden für automatisches Ordner-Scannen", - "tags": "automatisierung,ordner,scannen" + "desc": "Link zum Leitfaden für automatisches Ordner-Scannen" }, "devSsoGuide": { "title": "SSO-Anleitung", @@ -649,18 +770,26 @@ "desc": "Dokumentbeschränkungen und -berechtigungen ändern" }, "automate": { + "tags": "arbeitsablauf,sequenz,automatisierung", "title": "Automatisieren", - "desc": "Mehrstufige Arbeitsabläufe durch Verkettung von PDF-Aktionen erstellen. Ideal für wiederkehrende Aufgaben.", - "tags": "arbeitsablauf,sequenz,automatisierung" + "desc": "Mehrstufige Arbeitsabläufe durch Verkettung von PDF-Aktionen erstellen. Ideal für wiederkehrende Aufgaben." }, - "replaceColor": { - "desc": "Farben in PDF-Dokumenten ersetzen oder invertieren", - "title": "Farbe ersetzen & invertieren" + "overlay-pdfs": { + "desc": "Overlay one PDF on top of another", + "title": "Overlay PDFs" }, - "scannerEffect": { - "desc": "Erstellen Sie eine PDF, die aussieht, als wäre sie gescannt worden", - "tags": "scannen,simulieren,erstellen", - "title": "Scanner-Effekt" + "overlayPdfs": { + "title": "PDFs überlagern", + "desc": "PDFs über eine andere PDF überlagern", + "tags": "überlagern,kombinieren,stapeln" + }, + "fakeScan": { + "title": "Scan simulieren", + "desc": "Eine PDF erstellen, die wie gescannt aussieht" + }, + "replaceColorPdf": { + "title": "Farbe ersetzen und invertieren", + "desc": "Ersetzen Sie die Farbe des Texts und Hintergrund der PDF-Datei und invertieren Sie die komplette Farbe der PDF-Datei, um die Dateigröße zu reduzieren" } }, "landing": { @@ -701,15 +830,17 @@ "tags": "zusammenführen,seitenvorgänge,back end,serverseitig", "title": "Zusammenführen", "removeDigitalSignature": { + "label": "Digitale Signatur in der zusammengeführten Datei entfernen?", "tooltip": { - "description": "Digitale Signaturen werden beim Zusammenführen von Dateien ungültig. Aktivieren Sie diese Option, um sie aus der endgültigen zusammengeführten PDF zu entfernen.", - "title": "Digitale Signatur entfernen" + "title": "Digitale Signatur entfernen", + "description": "Digitale Signaturen werden beim Zusammenführen von Dateien ungültig. Aktivieren Sie diese Option, um sie aus der endgültigen zusammengeführten PDF zu entfernen." } }, "generateTableOfContents": { + "label": "Inhaltsverzeichnis in der zusammengeführten Datei erstellen?", "tooltip": { - "description": "Erstellt automatisch ein klickbares Inhaltsverzeichnis in der zusammengeführten PDF basierend auf den ursprünglichen Dateinamen und Seitenzahlen.", - "title": "Inhaltsverzeichnis generieren" + "title": "Inhaltsverzeichnis generieren", + "description": "Erstellt automatisch ein klickbares Inhaltsverzeichnis in der zusammengeführten PDF basierend auf den ursprünglichen Dateinamen und Seitenzahlen." } }, "submit": "Zusammenführen", @@ -727,7 +858,6 @@ } }, "split": { - "tags": "seitenoperationen,teilen,mehrseitig,ausschneiden,serverseitig", "title": "PDF aufteilen", "header": "PDF aufteilen", "desc": { @@ -849,13 +979,51 @@ "bullet1": "Lesezeichen-Ebene: Auf welcher Ebene geteilt wird (1=oberste Ebene)", "bullet2": "Metadaten einschließen: Dokumenteigenschaften beibehalten", "bullet3": "Duplikate zulassen: Wiederholte Lesezeichennamen behandeln" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" } - } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "seitenoperationen,teilen,mehrseitig,ausschneiden,serverseitig" }, "rotate": { - "tags": "serverseitig", "title": "PDF drehen", "submit": "Drehen", + "selectRotation": "Select Rotation Angle (Clockwise)", "error": { "failed": "Ein Fehler ist beim Drehen der PDF aufgetreten." }, @@ -875,7 +1043,8 @@ "title": "Steuerelemente", "text": "Verwenden Sie die Drehschaltflächen zur Anpassung der Ausrichtung. Die linke Schaltfläche dreht gegen den Uhrzeigersinn, die rechte Schaltfläche dreht im Uhrzeigersinn. Jeder Klick dreht um 90 Grad." } - } + }, + "tags": "serverseitig" }, "convert": { "title": "Umwandeln", @@ -899,6 +1068,7 @@ "color": "Farbe", "greyscale": "Graustufen", "blackwhite": "Schwarz-Weiß", + "dpi": "DPI", "output": "Ausgabe", "single": "Einzeln", "multiple": "Mehrfach", @@ -924,8 +1094,11 @@ "fileFormat": "Dateiformat", "wordDoc": "Word-Dokument", "wordDocExt": "Word-Dokument (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", "odpExt": "OpenDocument Präsentation (.odp)", "txtExt": "Einfacher Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", "selectedFiles": "Ausgewählte Dateien", "noFileSelected": "Keine Datei ausgewählt. Verwenden Sie das Dateipanel, um Dateien hinzuzufügen.", "convertFiles": "Dateien konvertieren", @@ -937,13 +1110,10 @@ "images": "Bilder", "officeDocs": "Office-Dokumente (Word, Excel, PowerPoint)", "imagesExt": "Bilder (JPG, PNG, usw.)", - "grayscale": "Graustufen", - "dpi": "DPI", "markdown": "Markdown", - "odtExt": "OpenDocument Text (.odt)", - "pptExt": "PowerPoint (.pptx)", - "rtfExt": "Rich Text Format (.rtf)", - "textRtf": "Text/RTF" + "textRtf": "Text/RTF", + "grayscale": "Graustufen", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konvertierung,img,jpg,bild,foto" @@ -981,22 +1151,35 @@ "8": "Letzte entfernen", "9": "Erste und letzte entfernen", "10": "Ungerade-Gerade-Zusammenführung", - "11": "Alle Seiten duplizieren" + "11": "Alle Seiten duplizieren", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, - "placeholder": "(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1)", "desc": { - "BOOKLET_SORT": "Seiten für den Broschüren-Druck anordnen (letzte, erste, zweite, vorletzte, …).", "CUSTOM": "Verwenden Sie eine benutzerdefinierte Sequenz von Seitenzahlen oder Ausdrücken, um eine neue Reihenfolge zu definieren.", - "DUPLEX_SORT": "Vorder- und Rückseiten verschachteln, als ob ein Duplex-Scanner alle Vorderseiten und dann alle Rückseiten gescannt hätte (1, n, 2, n-1, …).", - "DUPLICATE": "Jede Seite entsprechend der benutzerdefinierten Anzahl duplizieren (z.B. 4 dupliziert jede Seite 4×).", - "ODD_EVEN_MERGE": "Zwei PDFs durch abwechselnde Seiten zusammenführen: ungerade aus der ersten, gerade aus der zweiten.", - "ODD_EVEN_SPLIT": "Das Dokument in zwei Ausgaben aufteilen: alle ungeraden Seiten und alle geraden Seiten.", - "REMOVE_FIRST": "Die erste Seite aus dem Dokument entfernen.", - "REMOVE_FIRST_AND_LAST": "Sowohl die erste als auch die letzte Seite aus dem Dokument entfernen.", - "REMOVE_LAST": "Die letzte Seite aus dem Dokument entfernen.", "REVERSE_ORDER": "Das Dokument umkehren, sodass die letzte Seite zur ersten wird usw.", - "SIDE_STITCH_BOOKLET_SORT": "Seiten für den Seitenheft-Broschüren-Druck anordnen (optimiert für die Bindung an der Seite)." - } + "DUPLEX_SORT": "Vorder- und Rückseiten verschachteln, als ob ein Duplex-Scanner alle Vorderseiten und dann alle Rückseiten gescannt hätte (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Seiten für den Broschüren-Druck anordnen (letzte, erste, zweite, vorletzte, …).", + "SIDE_STITCH_BOOKLET_SORT": "Seiten für den Seitenheft-Broschüren-Druck anordnen (optimiert für die Bindung an der Seite).", + "ODD_EVEN_SPLIT": "Das Dokument in zwei Ausgaben aufteilen: alle ungeraden Seiten und alle geraden Seiten.", + "ODD_EVEN_MERGE": "Zwei PDFs durch abwechselnde Seiten zusammenführen: ungerade aus der ersten, gerade aus der zweiten.", + "DUPLICATE": "Jede Seite entsprechend der benutzerdefinierten Anzahl duplizieren (z.B. 4 dupliziert jede Seite 4×).", + "REMOVE_FIRST": "Die erste Seite aus dem Dokument entfernen.", + "REMOVE_LAST": "Die letzte Seite aus dem Dokument entfernen.", + "REMOVE_FIRST_AND_LAST": "Sowohl die erste als auch die letzte Seite aus dem Dokument entfernen." + }, + "placeholder": "(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1)" }, "addImage": { "tags": "img,jpg,bild,foto", @@ -1025,8 +1208,8 @@ "failed": "Ein Fehler ist beim Hinzufügen des Wasserzeichens zur PDF aufgetreten." }, "watermarkType": { - "image": "Bild", - "text": "Text" + "text": "Text", + "image": "Bild" }, "settings": { "type": "Wasserzeichen-Typ", @@ -1047,7 +1230,9 @@ "opacity": "Deckkraft (%)", "spacing": { "horizontal": "Horizontaler Abstand", - "vertical": "Vertikaler Abstand" + "vertical": "Vertikaler Abstand", + "height": "Height Spacing", + "width": "Width Spacing" }, "convertToImage": "PDF-Seiten in Bilder umwandeln" }, @@ -1190,6 +1375,10 @@ "bullet4": "Am besten für sensible oder urheberrechtlich geschützte Inhalte" } } + }, + "type": { + "1": "Text", + "2": "Image" } }, "permissions": { @@ -1263,6 +1452,26 @@ }, "submit": "Entfernen" }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, "pageSelection": { "tooltip": { "header": { @@ -1303,10 +1512,43 @@ }, "examples": { "title": "Beispiele" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", "header": { "title": "Anleitung zur Seitenauswahl" }, @@ -1379,7 +1621,6 @@ } }, "changeMetadata": { - "tags": "titel,autor,datum,erstellung,uhrzeit,herausgeber,produzent,statistiken", "header": "Metadaten ändern", "submit": "Ändern", "filenamePrefix": "metadaten", @@ -1431,8 +1672,8 @@ "trapped": { "label": "Trapped-Status", "unknown": "Unbekannt", - "false": "Falsch", - "true": "Wahr" + "true": "Wahr", + "false": "Falsch" }, "advanced": { "title": "Erweiterte Optionen" @@ -1500,7 +1741,8 @@ "bullet3": "Unknown: Trapped-Status ist nicht angegeben" } } - } + }, + "tags": "titel,autor,datum,erstellung,uhrzeit,herausgeber,produzent,statistiken" }, "fileToPDF": { "tags": "transformation,format,dokument,bild,folie,text,konvertierung,büro,dokumente,word,excel,powerpoint", @@ -1613,6 +1855,9 @@ "text": "Nachbearbeitung der finalen PDF durch Entfernung von OCR-Artefakten und Optimierung der Textebene für bessere Lesbarkeit und kleinere Dateigröße." } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1622,11 +1867,11 @@ "selectText": "Wählen Sie das Bildformat aus, in das extrahierte Bilder konvertiert werden sollen", "allowDuplicates": "Doppelte Bilder speichern", "submit": "Extrahieren", - "error": { - "failed": "Beim Extrahieren der Bilder aus der PDF ist ein Fehler aufgetreten." - }, "settings": { "title": "Einstellungen" + }, + "error": { + "failed": "Beim Extrahieren der Bilder aus der PDF ist ein Fehler aufgetreten." } }, "pdfToPDFA": { @@ -1699,14 +1944,43 @@ }, "info": "Python ist nicht installiert. Es ist zum Ausführen erforderlich." }, + "scannerImageSplit": { + "title": "Extrahierte Bilder", + "submit": "Bild-Scans extrahieren", + "error": { + "failed": "Beim Extrahieren der Bild-Scans ist ein Fehler aufgetreten." + }, + "tooltip": { + "title": "Foto-Teiler", + "whatThisDoes": "Was dies tut", + "whatThisDoesDesc": "Findet und extrahiert automatisch jedes Foto von einer gescannten Seite oder einem zusammengesetzten Bild - kein manuelles Zuschneiden erforderlich.", + "whenToUse": "Wann zu verwenden", + "useCase1": "Ganze Album-Seiten in einem Durchgang scannen", + "useCase2": "Flachbett-Stapel in separate Dateien aufteilen", + "useCase3": "Collagen in einzelne Fotos aufteilen", + "useCase4": "Fotos aus Dokumenten extrahieren", + "quickFixes": "Schnelle Lösungen", + "problem1": "Fotos nicht erkannt → Toleranz auf 30-50 erhöhen", + "problem2": "Zu viele Falscherkennungen → Mindestfläche auf 15.000-20.000 erhöhen", + "problem3": "Zuschnitte sind zu eng → Randgröße auf 5-10 erhöhen", + "problem4": "Geneigte Fotos nicht begradigt → Winkelschwelle auf ~5° senken", + "problem5": "Staub-/Rausch-Boxen → Mindest-Konturfläche auf 1000-2000 erhöhen", + "setupTips": "Einrichtungstipps", + "tip1": "Verwenden Sie einen einfachen, hellen Hintergrund", + "tip2": "Lassen Sie einen kleinen Abstand (≈1 cm) zwischen den Fotos", + "tip3": "Scannen Sie mit 300-600 DPI", + "tip4": "Reinigen Sie die Scanner-Glasplatte", + "headsUp": "Hinweis", + "headsUpDesc": "Überlappende Fotos oder Hintergründe, die farblich sehr nah an den Fotos liegen, können die Genauigkeit verringern - versuchen Sie einen helleren oder dunkleren Hintergrund und lassen Sie mehr Platz." + } + }, "sign": { - "tags": "autorisieren,initialen,gezeichnete signatur,textzeichen,bildsignatur", "title": "Signieren", "header": "PDFs signieren", "upload": "Bild hochladen", "draw": { - "clear": "Löschen", - "title": "Zeichnen Sie Ihre Unterschrift" + "title": "Zeichnen Sie Ihre Unterschrift", + "clear": "Löschen" }, "text": { "name": "Name des Unterzeichners", @@ -1716,6 +1990,7 @@ "add": "Signieren", "saved": "Gespeicherte Signaturen", "save": "Signature speichern", + "applySignatures": "Signaturen anwenden", "personalSigs": "Persönliche Signaturen", "sharedSigs": "Geteilte Signaturen", "noSavedSigs": "Es wurden keine gespeicherten Signaturen gefunden", @@ -1728,37 +2003,44 @@ "maintainRatio": "Seitenverhältnis beibehalten ein-/ausschalten", "undo": "Rückgängig", "redo": "Wiederherstellen", - "activate": "Signatur-Platzierung aktivieren", - "applySignatures": "Signaturen anwenden", - "deactivate": "Signatur-Platzierung beenden", - "error": { - "failed": "Beim Signieren der PDF ist ein Fehler aufgetreten." - }, - "image": { - "hint": "Laden Sie ein PNG- oder JPG-Bild Ihrer Unterschrift hoch", - "label": "Unterschriftsbild hochladen", - "placeholder": "Bilddatei auswählen" - }, - "instructions": { - "title": "So fügen Sie eine Unterschrift hinzu" - }, - "results": { - "title": "Signatur-Ergebnisse" - }, + "submit": "Dokument signieren", "steps": { "configure": "Signatur konfigurieren" }, - "submit": "Dokument signieren", "type": { - "canvas": "Canvas", + "title": "Signaturtyp", "draw": "Zeichnen", + "canvas": "Canvas", "image": "Bild", - "text": "Text", - "title": "Signaturtyp" - } + "text": "Text" + }, + "image": { + "label": "Unterschriftsbild hochladen", + "placeholder": "Bilddatei auswählen", + "hint": "Laden Sie ein PNG- oder JPG-Bild Ihrer Unterschrift hoch" + }, + "instructions": { + "title": "So fügen Sie eine Unterschrift hinzu", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Signatur-Platzierung aktivieren", + "deactivate": "Signatur-Platzierung beenden", + "results": { + "title": "Signatur-Ergebnisse" + }, + "error": { + "failed": "Beim Signieren der PDF ist ein Fehler aufgetreten." + }, + "tags": "autorisieren,initialen,gezeichnete signatur,textzeichen,bildsignatur" }, "flatten": { - "tags": "statisch,deaktivieren,nicht interaktiv,optimieren", "title": "Abflachen", "header": "PDFs abflachen", "flattenOnlyForms": "Nur Formulare abflachen", @@ -1773,9 +2055,11 @@ "options": { "stepTitle": "Abflachungs-Optionen", "title": "Abflachungs-Optionen", - "flattenOnlyForms.desc": "Nur Formularfelder vereinfachen, andere interaktive Elemente unverändert lassen", - "note": "Das Abflachen entfernt interaktive Elemente aus der PDF und macht sie nicht mehr bearbeitbar.", - "flattenOnlyForms": "Nur Formulare vereinfachen" + "flattenOnlyForms": { + "label": "Nur Formulare vereinfachen", + "desc": "Nur Formularfelder vereinfachen, andere interaktive Elemente unverändert lassen" + }, + "note": "Das Abflachen entfernt interaktive Elemente aus der PDF und macht sie nicht mehr bearbeitbar." }, "results": { "title": "Reduzierungs-Ergebnisse" @@ -1803,7 +2087,8 @@ "bullet3": "Kommentare und Notizen bleiben sichtbar", "bullet4": "Lesezeichen helfen weiterhin bei der Navigation" } - } + }, + "tags": "statisch,deaktivieren,nicht interaktiv,optimieren" }, "repair": { "tags": "reparieren,wiederherstellen,korrigieren,wiederherstellen", @@ -1823,7 +2108,6 @@ } }, "removeBlanks": { - "tags": "aufräumen,rationalisieren,nicht inhaltsreich,organisieren", "title": "Leere Seiten entfernen", "header": "Leere Seiten entfernen", "settings": { @@ -1865,22 +2149,29 @@ "bullet3": "Kann deaktiviert werden, um die Ausgabedateigröße zu reduzieren" } }, - "submit": "Leere Seiten entfernen" + "submit": "Leere Seiten entfernen", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "aufräumen,rationalisieren,nicht inhaltsreich,organisieren" }, "removeAnnotations": { "tags": "kommentare,hervorheben,notizen,markieren,entfernen", "title": "Kommentare entfernen", "header": "Kommentare entfernen", "submit": "Entfernen", - "error": { - "failed": "Beim Entfernen der Anmerkungen aus der PDF ist ein Fehler aufgetreten." - }, - "info": { - "description": "Dieses Werkzeug entfernt alle Anmerkungen (Kommentare, Hervorhebungen, Notizen usw.) aus Ihren PDF-Dokumenten.", - "title": "Über Anmerkungen entfernen" - }, "settings": { "title": "Einstellungen" + }, + "info": { + "title": "Über Anmerkungen entfernen", + "description": "Dieses Werkzeug entfernt alle Anmerkungen (Kommentare, Hervorhebungen, Notizen usw.) aus Ihren PDF-Dokumenten." + }, + "error": { + "failed": "Beim Entfernen der Anmerkungen aus der PDF ist ein Fehler aufgetreten." } }, "compare": { @@ -1967,7 +2258,12 @@ "bullet3": "Wählen Sie, auf welcher Seite die Signatur platziert werden soll", "bullet4": "Optionales Logo kann eingefügt werden" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, "sign": { "submit": "PDF signieren", @@ -2028,7 +2324,22 @@ "text": "Konvertieren Sie Ihre Datei mit keytool zu einem Java keystore (.jks), dann wählen Sie JKS." } } - } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Certificate Password", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo" }, "removeCertSign": { "tags": "authentifizieren,PEM,P12,offiziell,entschlüsseln", @@ -2054,7 +2365,17 @@ "header": "Mehrseitiges Layout", "pagesPerSheet": "Seiten pro Blatt:", "addBorder": "Ränder hinzufügen", - "submit": "Abschicken" + "submit": "Abschicken", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "broschüre,imposition,drucken,bindung,falten,signatur", @@ -2167,8 +2488,8 @@ "pageSize": { "label": "Ziel-Seitengröße", "keep": "Ursprüngliche Größe beibehalten", - "legal": "Legal", - "letter": "Letter" + "letter": "Letter", + "legal": "Legal" }, "submit": "Seitenskalierung anpassen", "error": { @@ -2230,7 +2551,6 @@ "tags": "farbkorrektur,abstimmung,änderung,verbesserung" }, "crop": { - "tags": "trimmen,verkleinern,bearbeiten,formen", "title": "Zuschneiden", "header": "PDF zuschneiden", "submit": "Abschicken", @@ -2241,10 +2561,22 @@ "reset": "Auf vollständiges PDF zurücksetzen", "coordinates": { "title": "Position und Größe", - "x": "X-Position", - "y": "Y-Position", - "width": "Breite", - "height": "Höhe" + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } }, "error": { "invalidArea": "Zuschneidebereich überschreitet die PDF-Grenzen", @@ -2262,7 +2594,12 @@ }, "results": { "title": "Zuschneide-Ergebnisse" - } + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "trimmen,verkleinern,bearbeiten,formen" }, "autoSplitPDF": { "tags": "qr basiert,trennen,segment scannen,organisieren", @@ -2448,6 +2785,7 @@ "export": "Herunterladen", "upload": "Hochladen", "boxRedaction": "Kasten-Zeichen-Schwärzung", + "zoom": "Zoom", "zoomIn": "Hineinzoomen", "zoomOut": "Herauszoomen", "nextPage": "Nächste Seite", @@ -2459,8 +2797,7 @@ "showLayers": "Ebenen anzeigen (Doppelklick, um alle Ebenen auf den Standardzustand zurückzusetzen)", "colourPicker": "Farbwähler", "findCurrentOutlineItem": "Aktuelles Gliederungselement finden", - "applyChanges": "Änderungen anwenden", - "zoom": "Zoom" + "applyChanges": "Änderungen anwenden" } }, "tableExtraxt": { @@ -2472,11 +2809,15 @@ "overlay-pdfs": { "tags": "overlay,überlagern", "header": "PDF mit Overlay versehen", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Basis-PDF-Datei auswählen" }, "overlayFiles": { - "label": "Overlay-PDF-Datei auswählen" + "label": "Overlay-PDF-Datei auswählen", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Overlay-Modus auswählen", @@ -2486,14 +2827,53 @@ }, "counts": { "label": "Overlay Anzahl (für Feste-Wiederholung)", - "placeholder": "Komma-separierte Anzahl eingeben (z.B.: 2,3,1)" + "placeholder": "Komma-separierte Anzahl eingeben (z.B.: 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Overlay Position auswählen", "foreground": "Vordergrund", "background": "Hintergrund" }, - "submit": "Erstellen" + "submit": "Erstellen", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "abschnitte,teilen,bearbeiten", @@ -2528,7 +2908,18 @@ "customMargin": "Benutzerdefinierter Rand", "customColor": "Benutzerdefinierte Textfarbe", "submit": "Abschicken", - "noStampSelected": "Kein Stempel ausgewählt. Kehren Sie zu Schritt 1 zurück." + "noStampSelected": "Kein Stempel ausgewählt. Kehren Sie zu Schritt 1 zurück.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "bild entfernen,seitenoperationen,back end,server side" @@ -2546,7 +2937,8 @@ "status": { "_value": "Status", "valid": "Gültig", - "invalid": "Ungültig" + "invalid": "Ungültig", + "complete": "Validation complete" }, "signer": "Unterzeichner", "date": "Datum", @@ -2573,35 +2965,115 @@ "version": "Version", "keyUsage": "Schlüsselverwendung", "selfSigned": "Selbstsigniert", - "bits": "Bits" + "bits": "Bits", + "details": "Certificate Details" }, "signature": { "info": "Signaturinformationen", "_value": "Signatur", "mathValid": "Signatur ist mathematisch gültig ABER:" }, - "selectCustomCert": "Benutzerdefinierte Zertifikatsdatei X.509 (Optional)" - }, - "replace-color": { - "title": "Farbe Ersetzen-Invertieren", - "header": "Farb-PDF Ersetzen-Invertieren", - "selectText": { - "1": "Ersetzen oder Invertieren von Farboptionen", - "2": "Standard(Standardfarben mit hohem Kontrast)", - "3": "Benutzerdefiniert(Benutzerdefinierte Farben)", - "4": "Vollinvertierung(Invertierung aller Farben)", - "5": "Farboptionen mit hohem Kontrast", - "6": "Weißer Text auf schwarzem Hintergrund", - "7": "Schwarzer Text auf weißem Hintergrund", - "8": "Gelber Text auf schwarzem Hintergrund", - "9": "Grüner Text auf schwarzem Hintergrund", - "10": "Textfarbe auswählen", - "11": "Hintergrundfarbe auswählen" + "selectCustomCert": "Benutzerdefinierte Zertifikatsdatei X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Ersetzen" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Farbe ersetzen,Seiteneinstellungen,Backend,Serverseite" + "replaceColor": { + "tags": "Farbe ersetzen,Seitenoperationen,Backend,serverseitig", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Anmelden", @@ -2634,6 +3106,11 @@ "enterEmail": "Geben Sie Ihre E-Mail-Adresse ein", "enterPassword": "Geben Sie Ihr Passwort ein", "loggingIn": "Anmeldung läuft...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", "signingIn": "Anmeldung läuft...", "login": "Anmelden", "or": "Oder", @@ -2644,6 +3121,7 @@ "cancel": "Abbrechen", "dontHaveAccount": "Sie haben noch kein Konto? Registrieren", "home": "Startseite", + "debug": "Debug", "signOut": "Abmelden", "pleaseEnterBoth": "Bitte geben Sie sowohl E-Mail als auch Passwort ein", "pleaseEnterEmail": "Bitte geben Sie Ihre E-Mail-Adresse ein", @@ -2651,11 +3129,14 @@ "passwordResetSent": "Passwort-Reset-Link wurde an {{email}} gesendet! Prüfen Sie Ihre E-Mails und folgen Sie den Anweisungen.", "failedToSignIn": "Anmeldung mit {{provider}} fehlgeschlagen: {{message}}", "unexpectedError": "Unerwarteter Fehler: {{message}}", - "debug": "Debug" + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." }, "signup": { "title": "Konto erstellen", "subtitle": "Bei Stirling PDF anmelden und loslegen", + "name": "Name", "email": "E-Mail", "password": "Passwort", "confirmPassword": "Passwort bestätigen", @@ -2674,7 +3155,11 @@ "checkEmailConfirmation": "Prüfen Sie Ihre E-Mails auf einen Bestätigungslink, um die Registrierung abzuschließen.", "accountCreatedSuccessfully": "Konto erfolgreich erstellt! Sie können sich jetzt anmelden.", "unexpectedError": "Unerwarteter Fehler: {{message}}", - "name": "Name" + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF zu einer Seite zusammenfassen", @@ -2714,10 +3199,23 @@ "adjustContrast": { "title": "Kontrast anpassen", "header": "Farben/Kontrast anpassen", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Helligkeit:", "saturation": "Sättigung:", - "download": "Herunterladen" + "download": "Herunterladen", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Komprimieren", @@ -2864,7 +3362,13 @@ "title": "Bild entfernen", "header": "Bild entfernen", "removeImage": "Bild entfernen", - "submit": "Bild entfernen" + "submit": "Bild entfernen", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "PDF nach Kapiteln aufteilen", @@ -2939,6 +3443,10 @@ "title": "Analyse", "description": "Diese Cookies helfen uns zu verstehen, wie unsere Tools genutzt werden, damit wir uns darauf konzentrieren können, die Funktionen zu entwickeln, die unserer Community am meisten am Herzen liegen. Seien Sie beruhigt – Stirling PDF kann und wird niemals den Inhalt der Dokumente verfolgen, mit denen Sie arbeiten." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, "removeMetadata": { @@ -3000,11 +3508,18 @@ "panMode": "Verschiebemodus", "rotateLeft": "Nach links drehen", "rotateRight": "Nach rechts drehen", - "toggleSidebar": "Seitenleiste umschalten" + "toggleSidebar": "Seitenleiste umschalten", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" }, "search": { "title": "PDF durchsuchen", - "placeholder": "Suchbegriff eingeben..." + "placeholder": "Suchbegriff eingeben...", + "noResults": "No results found", + "searching": "Searching..." }, "guestBanner": { "title": "Sie verwenden Stirling PDF als Gast!", @@ -3042,9 +3557,597 @@ "automate": "Automatisieren", "files": "Dateien", "activity": "Aktivität", + "help": "Help", + "account": "Account", "config": "Konfiguration", + "adminSettings": "Admin Settings", "allTools": "Alle Werkzeuge" }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, "fileUpload": { "selectFile": "Datei auswählen", "selectFiles": "Dateien auswählen", @@ -3069,6 +4172,9 @@ "addFiles": "Dateien hinzufügen", "dragFilesInOrClick": "Dateien hineinziehen oder \"Dateien hinzufügen\" klicken zum Durchsuchen" }, + "fileEditor": { + "addFiles": "Add Files" + }, "fileManager": { "title": "PDF-Dateien hochladen", "subtitle": "Dateien zum Speicher hinzufügen für einfachen Zugriff in allen Tools", @@ -3097,17 +4203,22 @@ "lastModified": "Zuletzt geändert", "toolChain": "Angewendete Werkzeuge", "restore": "Wiederherstellen", + "unzip": "Unzip", "searchFiles": "Dateien suchen...", "recent": "Kürzlich", "localFiles": "Lokale Dateien", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", "myFiles": "Meine Dateien", "noRecentFiles": "Keine kürzlichen Dateien gefunden", - "dropFilesHint": "Dateien hier ablegen zum Hochladen", "googleDriveNotAvailable": "Google Drive-Integration nicht verfügbar", "openFiles": "Dateien öffnen", "openFile": "Datei öffnen", "details": "Dateidetails", + "fileName": "Name", + "fileFormat": "Format", "fileSize": "Größe", + "fileVersion": "Version", "totalSelected": "Gesamt ausgewählt", "dropFilesHere": "Dateien hier ablegen", "selectAll": "Alle auswählen", @@ -3118,11 +4229,17 @@ "download": "Herunterladen", "delete": "Löschen", "unsupported": "Nicht unterstützt", - "fileFormat": "Format", - "fileName": "Name", - "fileVersion": "Version", - "googleDrive": "Google Drive", - "googleDriveShort": "Drive" + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "Dateien hier ablegen zum Hochladen" }, "storage": { "temporaryNotice": "Dateien werden temporär in Ihrem Browser gespeichert und können automatisch gelöscht werden", @@ -3138,8 +4255,10 @@ "desc": "Potentiell schädliche Elemente aus PDF-Dateien entfernen.", "submit": "PDF Bereinigen", "completed": "Bereinigung erfolgreich abgeschlossen", - "error.generic": "Bereinigung fehlgeschlagen", - "error.failed": "Ein Fehler ist bei der Bereinigung der PDF aufgetreten.", + "error": { + "generic": "Bereinigung fehlgeschlagen", + "failed": "Ein Fehler ist bei der Bereinigung der PDF aufgetreten." + }, "filenamePrefix": "bereinigt", "sanitizationResults": "Bereinigungsergebnisse", "steps": { @@ -3154,21 +4273,27 @@ "title": "Bereinigungs-Optionen", "note": "Wählen Sie die Elemente aus, die Sie aus der PDF entfernen möchten. Mindestens eine Option muss ausgewählt werden.", "removeJavaScript": { + "label": "Remove JavaScript", "desc": "JavaScript-Aktionen und Skripte aus der PDF entfernen" }, "removeEmbeddedFiles": { + "label": "Remove Embedded Files", "desc": "Alle in der PDF eingebetteten Dateien entfernen" }, "removeXMPMetadata": { + "label": "Remove XMP Metadata", "desc": "XMP-Metadaten aus der PDF entfernen" }, "removeMetadata": { + "label": "Remove Document Metadata", "desc": "Dokumentinformations-Metadaten (Titel, Autor usw.) entfernen" }, "removeLinks": { + "label": "Remove Links", "desc": "Externe Links und Launch-Aktionen aus der PDF entfernen" }, "removeFonts": { + "label": "Remove Fonts", "desc": "Eingebettete Schriftarten aus der PDF entfernen" } } @@ -3198,8 +4323,8 @@ "keyLength": { "label": "Verschlüsselungsschlüssellänge", "40bit": "40-bit (Niedrig)", - "256bit": "256-bit (Hoch)", - "128bit": "128-bit (Standard)" + "128bit": "128-bit (Standard)", + "256bit": "256-bit (Hoch)" } }, "results": { @@ -3391,9 +4516,14 @@ "remaining": "verbleibend", "used": "verwendet", "available": "verfügbar", - "cancel": "Abbrechen" + "cancel": "Abbrechen", + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { "title": "Kontoeinstellungen", @@ -3440,56 +4570,583 @@ } }, "AddAttachmentsRequest": { - "addMoreFiles": "Weitere Dateien hinzufügen...", "attachments": "Anhänge auswählen", "info": "Wählen Sie Dateien aus, die Sie Ihrer PDF anhängen möchten. Diese Dateien werden eingebettet und über das Anhangs-Panel der PDF zugänglich sein.", + "selectFiles": "Dateien zum Anhängen auswählen", "placeholder": "Dateien auswählen...", + "addMoreFiles": "Weitere Dateien hinzufügen...", + "selectedFiles": "Ausgewählte Dateien", + "submit": "Anhänge hinzufügen", "results": { "title": "Anhangs-Ergebnisse" }, - "selectFiles": "Dateien zum Anhängen auswählen", - "selectedFiles": "Ausgewählte Dateien", - "submit": "Anhänge hinzufügen" - }, - "applyAndContinue": "Anwenden & Fortfahren", - "discardChanges": "Änderungen verwerfen", - "exportAndContinue": "Exportieren & Fortfahren", - "keepWorking": "Weiterarbeiten", - "logOut": "Abmelden", - "replaceColor": { - "tags": "Farbe ersetzen,Seitenoperationen,Backend,serverseitig" - }, - "scannerImageSplit": { "error": { - "failed": "Beim Extrahieren der Bild-Scans ist ein Fehler aufgetreten." - }, - "submit": "Bild-Scans extrahieren", - "title": "Extrahierte Bilder", - "tooltip": { - "headsUp": "Hinweis", - "headsUpDesc": "Überlappende Fotos oder Hintergründe, die farblich sehr nah an den Fotos liegen, können die Genauigkeit verringern - versuchen Sie einen helleren oder dunkleren Hintergrund und lassen Sie mehr Platz.", - "problem1": "Fotos nicht erkannt → Toleranz auf 30-50 erhöhen", - "problem2": "Zu viele Falscherkennungen → Mindestfläche auf 15.000-20.000 erhöhen", - "problem3": "Zuschnitte sind zu eng → Randgröße auf 5-10 erhöhen", - "problem4": "Geneigte Fotos nicht begradigt → Winkelschwelle auf ~5° senken", - "problem5": "Staub-/Rausch-Boxen → Mindest-Konturfläche auf 1000-2000 erhöhen", - "quickFixes": "Schnelle Lösungen", - "setupTips": "Einrichtungstipps", - "tip1": "Verwenden Sie einen einfachen, hellen Hintergrund", - "tip2": "Lassen Sie einen kleinen Abstand (≈1 cm) zwischen den Fotos", - "tip3": "Scannen Sie mit 300-600 DPI", - "tip4": "Reinigen Sie die Scanner-Glasplatte", - "title": "Foto-Teiler", - "useCase1": "Ganze Album-Seiten in einem Durchgang scannen", - "useCase2": "Flachbett-Stapel in separate Dateien aufteilen", - "useCase3": "Collagen in einzelne Fotos aufteilen", - "useCase4": "Fotos aus Dokumenten extrahieren", - "whatThisDoes": "Was dies tut", - "whatThisDoesDesc": "Findet und extrahiert automatisch jedes Foto von einer gescannten Seite oder einem zusammengesetzten Bild - kein manuelles Zuschneiden erforderlich.", - "whenToUse": "Wann zu verwenden" + "failed": "Add attachments operation failed" } }, "termsAndConditions": "Allgemeine Geschäftsbedingungen", - "unsavedChanges": "Sie haben ungespeicherte Änderungen an Ihrer PDF. Was möchten Sie tun?", - "unsavedChangesTitle": "Ungespeicherte Änderungen" -} \ No newline at end of file + "logOut": "Abmelden", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Ersetzen oder Invertieren von Farboptionen", + "2": "Standard(Standardfarben mit hohem Kontrast)", + "3": "Benutzerdefiniert(Benutzerdefinierte Farben)", + "4": "Vollinvertierung(Invertierung aller Farben)", + "5": "Farboptionen mit hohem Kontrast", + "6": "Weißer Text auf schwarzem Hintergrund", + "7": "Schwarzer Text auf weißem Hintergrund", + "8": "Gelber Text auf schwarzem Hintergrund", + "9": "Grüner Text auf schwarzem Hintergrund", + "10": "Textfarbe auswählen", + "11": "Hintergrundfarbe auswählen", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Ersetzen", + "title": "Farbe Ersetzen-Invertieren", + "header": "Farb-PDF Ersetzen-Invertieren" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "replaceColorPdf": { + "tags": "Farbe ersetzen,Seiteneinstellungen,Backend,Serverseite" + } +} diff --git a/frontend/public/locales/el-GR/translation.json b/frontend/public/locales/el-GR/translation.json index a98d3fff7..2af4b53e5 100644 --- a/frontend/public/locales/el-GR/translation.json +++ b/frontend/public/locales/el-GR/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Προσαρμοσμένο κείμενο", "numberPagesDesc": "Ποιες σελίδες να αριθμηθούν, προεπιλογή 'all', δέχεται επίσης 1-5 ή 2,5,9 κλπ", "customNumberDesc": "Προεπιλογή σε {n}, δέχεται επίσης 'Σελίδα {n} από {total}', 'Κείμενο-{n}', '{filename}-{n}", - "submit": "Προσθήκη αριθμών σελίδων" + "submit": "Προσθήκη αριθμών σελίδων", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Προσαρμοσμένη επιλογή σελίδων (Εισάγετε μια λίστα αριθμών σελίδων χωρισμένη με κόμματα 1,5,6 ή συναρτήσεις όπως 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Επιλέξτε PDF(s)", "multiPdfPrompt": "Επιλέξτε PDFs (2+)", "multiPdfDropPrompt": "Επιλέξτε (ή σύρετε & αφήστε) όλα τα PDF που χρειάζεστε", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Προειδοποίηση: Αυτή η διαδικασία μπορεί να διαρκέσει έως ένα λεπτό ανάλογα με το μέγεθος του αρχείου", "pageOrderPrompt": "Προσαρμοσμένη σειρά σελίδων (Εισάγετε μια λίστα αριθμών σελίδων χωρισμένη με κόμματα ή συναρτήσεις όπως 2n+1):", - "pageSelectionPrompt": "Προσαρμοσμένη επιλογή σελίδων (Εισάγετε μια λίστα αριθμών σελίδων χωρισμένη με κόμματα 1,5,6 ή συναρτήσεις όπως 2n+1):", "goToPage": "Μετάβαση", "true": "Αληθές", "false": "Ψευδές", "unknown": "Άγνωστο", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Αποθήκευση", "saveToBrowser": "Αποθήκευση στον περιηγητή", + "download": "Λήψη", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Κλείσιμο", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "αρχεία επιλεγμένα", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Δεν έχουν προστεθεί αγαπημένα", "downloadComplete": "Η λήψη ολοκληρώθηκε", "bored": "Βαριέστε την αναμονή;", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "Το PDF έχει προστασία κωδικού και είτε δεν δόθηκε κωδικός ή ήταν λανθασμένος", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Σφάλμα", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Συγγνώμη για το πρόβλημα!", "needHelp": "Χρειάζεστε βοήθεια / Βρήκατε πρόβλημα;", "contactTip": "Εάν εξακολουθείτε να αντιμετωπίζετε προβλήματα, μη διστάσετε να επικοινωνήσετε μαζί μας για βοήθεια. Μπορείτε να υποβάλετε ένα ticket στη σελίδα μας στο GitHub ή να επικοινωνήσετε μαζί μας μέσω Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Υποβολή ticket", "discordSubmit": "Discord - Υποβολή αιτήματος υποστήριξης" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Διαγραφή", "username": "Όνομα χρήστη", "password": "Κωδικός", @@ -82,6 +169,7 @@ "green": "Πράσινο", "blue": "Μπλε", "custom": "Προσαρμογή...", + "comingSoon": "Coming soon", "WorkInProgess": "Εργασία σε εξέλιξη, μπορεί να μην λειτουργεί ή να έχει σφάλματα, παρακαλώ αναφέρετε τυχόν προβλήματα!", "poweredBy": "Με την υποστήριξη του", "yes": "Ναι", @@ -115,12 +203,14 @@ "page": "Σελίδα", "pages": "Σελίδες", "loading": "Φόρτωση...", + "review": "Review", "addToDoc": "Προσθήκη στο έγγραφο", "reset": "Επαναφορά", "apply": "Εφαρμογή", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Πολιτική απορρήτου", + "iAgreeToThe": "I agree to all of the", "terms": "Όροι και προϋποθέσεις", "accessibility": "Προσβασιμότητα", "cookie": "Πολιτική cookies", @@ -160,6 +250,7 @@ "title": "Θέλετε να κάνετε το Stirling PDF καλύτερο;", "paragraph1": "Το Stirling PDF διαθέτει προαιρετικά analytics για να μας βοηθήσει να βελτιώσουμε το προϊόν. Δεν παρακολουθούμε προσωπικές πληροφορίες ή περιεχόμενο αρχείων.", "paragraph2": "Παρακαλούμε σκεφτείτε να ενεργοποιήσετε τα analytics για να βοηθήσετε το Stirling-PDF να αναπτυχθεί και να μας επιτρέψετε να κατανοήσουμε καλύτερα τους χρήστες μας.", + "learnMore": "Learn more", "enable": "Ενεργοποίηση analytics", "disable": "Απενεργοποίηση analytics", "settings": "Μπορείτε να αλλάξετε τις ρυθμίσεις για τα analytics στο αρχείο config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Αποθήκευση εισόδων φόρμας", "help": "Ενεργοποίηση για αποθήκευση προηγούμενων εισόδων για μελλοντική χρήση" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Εισαγωγή/Εξαγωγή βάσης δεδομένων", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Πολυεργαλείο PDF", "desc": "Συγχώνευση, Περιστροφή, Αναδιάταξη, Διαχωρισμός και Αφαίρεση σελίδων" }, "merge": { + "tags": "combine,join,unite", "title": "Συγχώνευση", "desc": "Εύκολη συγχώνευση πολλών PDF σε ένα." }, "split": { + "tags": "divide,separate,break", "title": "Διαχωρισμός", "desc": "Διαχωρισμός PDF σε πολλαπλά έγγραφα" }, "rotate": { + "tags": "turn,flip,orient", "title": "Περιστροφή", "desc": "Εύκολη περιστροφή των PDF σας." }, + "convert": { + "tags": "transform,change", + "title": "Μετατροπή", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Οργάνωση", + "desc": "Αφαίρεση/Αναδιάταξη σελίδων σε οποιαδήποτε σειρά" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Προσθήκη εικόνας", + "desc": "Προσθήκη εικόνας σε συγκεκριμένη θέση στο PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Προσθήκη υδατογραφήματος", + "desc": "Προσθήκη προσαρμοσμένου υδατογραφήματος στο έγγραφο PDF." + }, + "removePassword": { + "tags": "unlock", + "title": "Αφαίρεση κωδικού", + "desc": "Αφαίρεση προστασίας κωδικού από το έγγραφο PDF." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Συμπίεση", + "desc": "Συμπίεση PDF για μείωση του μεγέθους αρχείου." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Αλλαγή μεταδεδομένων", + "desc": "Αλλαγή/Αφαίρεση/Προσθήκη μεταδεδομένων από ένα έγγραφο PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Καθαρισμός σαρώσεων", + "desc": "Καθαρισμός σαρώσεων και ανίχνευση κειμένου από εικόνες μέσα σε PDF και επαναπροσθήκη ως κείμενο." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Εξαγωγή εικόνων", + "desc": "Εξαγωγή όλων των εικόνων από PDF και αποθήκευση σε zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Υπογραφή", + "desc": "Προσθήκη υπογραφής σε PDF με σχεδίαση, κείμενο ή εικόνα" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Ισοπέδωση", + "desc": "Αφαίρεση όλων των διαδραστικών στοιχείων και φορμών από ένα PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Υπογραφή με πιστοποιητικό", + "desc": "Υπογραφή PDF με πιστοποιητικό/κλειδί (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Επιδιόρθωση", + "desc": "Προσπάθεια επιδιόρθωσης κατεστραμμένου/χαλασμένου PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Αφαίρεση κενών σελίδων", + "desc": "Ανίχνευση και αφαίρεση κενών σελίδων από ένα έγγραφο" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Αφαίρεση σχολίων", + "desc": "Αφαίρεση όλων των σχολίων/επισημάνσεων από ένα PDF" + }, + "compare": { + "tags": "difference", + "title": "Σύγκριση", + "desc": "Σύγκριση και εμφάνιση διαφορών μεταξύ 2 εγγράφων PDF" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Αφαίρεση υπογραφής πιστοποιητικού", + "desc": "Αφαίρεση υπογραφής πιστοποιητικού από PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Διάταξη πολλαπλών σελίδων", + "desc": "Συγχώνευση πολλαπλών σελίδων ενός εγγράφου PDF σε μία σελίδα" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Προσαρμογή μεγέθους/κλίμακας σελίδας", + "desc": "Αλλαγή του μεγέθους/κλίμακας μιας σελίδας και/ή του περιεχομένου της." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Προσθήκη αριθμών σελίδων", + "desc": "Προσθήκη αριθμών σελίδων σε όλο το έγγραφο σε συγκεκριμένη θέση" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Προσαρμογή χρωμάτων/αντίθεσης", + "desc": "Προσαρμογή αντίθεσης, κορεσμού και φωτεινότητας ενός PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Περικοπή PDF", + "desc": "Περικοπή PDF για μείωση του μεγέθους του (διατηρεί το κείμενο!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Αυτόματος διαχωρισμός σελίδων", + "desc": "Αυτόματος διαχωρισμός σαρωμένου PDF με φυσικό σαρωμένο διαχωριστή σελίδων QR Code" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Λήψη ΟΛΩΝ των πληροφοριών του PDF", + "desc": "Λήψη όλων των δυνατών πληροφοριών για τα PDF" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "Ενιαία μεγάλη σελίδα", + "desc": "Συγχώνευση όλων των σελίδων PDF σε μία μεγάλη σελίδα" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Εμφάνιση Javascript", + "desc": "Αναζήτηση και εμφάνιση οποιουδήποτε JS ενσωματωμένου σε PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Χειροκίνητη απόκρυψη", + "desc": "Απόκρυψη σε PDF βάσει επιλεγμένου κειμένου, σχεδιασμένων σχημάτων και/ή επιλεγμένων σελίδων" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Αφαίρεση εικόνας", + "desc": "Αφαίρεση εικόνας από PDF για μείωση μεγέθους αρχείου" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Διαχωρισμός PDF ανά κεφάλαια", + "desc": "Διαχωρισμός ενός PDF σε πολλαπλά αρχεία βάσει της δομής κεφαλαίων." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Επικύρωση υπογραφής PDF", + "desc": "Επαλήθευση ψηφιακών υπογραφών και πιστοποιητικών σε έγγραφα PDF" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Εξαγωγή σελίδων", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Αφαίρεση", + "desc": "Διαγραφή ανεπιθύμητων σελίδων από το έγγραφο PDF." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Αυτόματος διαχωρισμός ανά μέγεθος/πλήθος", + "desc": "Διαχωρισμός ενός PDF σε πολλαπλά έγγραφα βάσει μεγέθους, αριθμού σελίδων ή αριθμού εγγράφων" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Προσθήκη κωδικού", + "desc": "Κρυπτογράφηση του εγγράφου PDF με κωδικό." + }, + "changePermissions": { + "title": "Αλλαγή δικαιωμάτων", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Επικάλυψη PDF πάνω σε άλλο PDF", + "title": "Επικάλυψη PDF" + }, "imageToPDF": { "title": "Εικόνα σε PDF", "desc": "Μετατροπή εικόνας (PNG, JPEG, GIF) σε PDF." @@ -355,18 +786,6 @@ "title": "PDF σε εικόνα", "desc": "Μετατροπή PDF σε εικόνα. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Οργάνωση", - "desc": "Αφαίρεση/Αναδιάταξη σελίδων σε οποιαδήποτε σειρά" - }, - "addImage": { - "title": "Προσθήκη εικόνας", - "desc": "Προσθήκη εικόνας σε συγκεκριμένη θέση στο PDF" - }, - "watermark": { - "title": "Προσθήκη υδατογραφήματος", - "desc": "Προσθήκη προσαρμοσμένου υδατογραφήματος στο έγγραφο PDF." - }, "permissions": { "title": "Αλλαγή δικαιωμάτων", "desc": "Αλλαγή των δικαιωμάτων του εγγράφου PDF" @@ -375,38 +794,10 @@ "title": "Αφαίρεση", "desc": "Διαγραφή ανεπιθύμητων σελίδων από το έγγραφο PDF." }, - "addPassword": { - "title": "Προσθήκη κωδικού", - "desc": "Κρυπτογράφηση του εγγράφου PDF με κωδικό." - }, - "removePassword": { - "title": "Αφαίρεση κωδικού", - "desc": "Αφαίρεση προστασίας κωδικού από το έγγραφο PDF." - }, - "compress": { - "title": "Συμπίεση", - "desc": "Συμπίεση PDF για μείωση του μεγέθους αρχείου." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Αλλαγή μεταδεδομένων", - "desc": "Αλλαγή/Αφαίρεση/Προσθήκη μεταδεδομένων από ένα έγγραφο PDF" - }, "fileToPDF": { "title": "Μετατροπή αρχείου σε PDF", "desc": "Μετατροπή σχεδόν οποιουδήποτε αρχείου σε PDF (DOCX, PNG, XLS, PPT, TXT και άλλα)" }, - "ocr": { - "title": "OCR / Καθαρισμός σαρώσεων", - "desc": "Καθαρισμός σαρώσεων και ανίχνευση κειμένου από εικόνες μέσα σε PDF και επαναπροσθήκη ως κείμενο." - }, - "extractImages": { - "title": "Εξαγωγή εικόνων", - "desc": "Εξαγωγή όλων των εικόνων από PDF και αποθήκευση σε zip" - }, "pdfToPDFA": { "title": "PDF σε PDF/A", "desc": "Μετατροπή PDF σε PDF/A για μακροχρόνια αποθήκευση" @@ -435,70 +826,14 @@ "title": "Ανίχνευση/Διαχωρισμός σαρωμένων φωτογραφιών", "desc": "Διαχωρισμός πολλαπλών φωτογραφιών από μια φωτογραφία/PDF" }, - "sign": { - "title": "Υπογραφή", - "desc": "Προσθήκη υπογραφής σε PDF με σχεδίαση, κείμενο ή εικόνα" - }, - "flatten": { - "title": "Ισοπέδωση", - "desc": "Αφαίρεση όλων των διαδραστικών στοιχείων και φορμών από ένα PDF" - }, - "repair": { - "title": "Επιδιόρθωση", - "desc": "Προσπάθεια επιδιόρθωσης κατεστραμμένου/χαλασμένου PDF" - }, - "removeBlanks": { - "title": "Αφαίρεση κενών σελίδων", - "desc": "Ανίχνευση και αφαίρεση κενών σελίδων από ένα έγγραφο" - }, - "removeAnnotations": { - "title": "Αφαίρεση σχολίων", - "desc": "Αφαίρεση όλων των σχολίων/επισημάνσεων από ένα PDF" - }, - "compare": { - "title": "Σύγκριση", - "desc": "Σύγκριση και εμφάνιση διαφορών μεταξύ 2 εγγράφων PDF" - }, - "certSign": { - "title": "Υπογραφή με πιστοποιητικό", - "desc": "Υπογραφή PDF με πιστοποιητικό/κλειδί (PEM/P12)" - }, - "removeCertSign": { - "title": "Αφαίρεση υπογραφής πιστοποιητικού", - "desc": "Αφαίρεση υπογραφής πιστοποιητικού από PDF" - }, - "pageLayout": { - "title": "Διάταξη πολλαπλών σελίδων", - "desc": "Συγχώνευση πολλαπλών σελίδων ενός εγγράφου PDF σε μία σελίδα" - }, - "scalePages": { - "title": "Προσαρμογή μεγέθους/κλίμακας σελίδας", - "desc": "Αλλαγή του μεγέθους/κλίμακας μιας σελίδας και/ή του περιεχομένου της." - }, "pipeline": { "title": "Pipeline", "desc": "Εκτέλεση πολλαπλών ενεργειών σε PDF ορίζοντας scripts pipeline" }, - "addPageNumbers": { - "title": "Προσθήκη αριθμών σελίδων", - "desc": "Προσθήκη αριθμών σελίδων σε όλο το έγγραφο σε συγκεκριμένη θέση" - }, "auto-rename": { "title": "Αυτόματη μετονομασία αρχείου PDF", "desc": "Αυτόματη μετονομασία ενός PDF με βάση την ανιχνευμένη κεφαλίδα" }, - "adjustContrast": { - "title": "Προσαρμογή χρωμάτων/αντίθεσης", - "desc": "Προσαρμογή αντίθεσης, κορεσμού και φωτεινότητας ενός PDF" - }, - "crop": { - "title": "Περικοπή PDF", - "desc": "Περικοπή PDF για μείωση του μεγέθους του (διατηρεί το κείμενο!)" - }, - "autoSplitPDF": { - "title": "Αυτόματος διαχωρισμός σελίδων", - "desc": "Αυτόματος διαχωρισμός σαρωμένου PDF με φυσικό σαρωμένο διαχωριστή σελίδων QR Code" - }, "sanitizePDF": { "title": "Εξυγίανση", "desc": "Αφαίρεση scripts και άλλων στοιχείων από αρχεία PDF" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Λήψη ΟΛΩΝ των πληροφοριών του PDF", - "desc": "Λήψη όλων των δυνατών πληροφοριών για τα PDF" - }, "pageExtracter": { "title": "Εξαγωγή σελίδας(ων)", "desc": "Εξαγωγή επιλεγμένων σελίδων από PDF" }, - "pdfToSinglePage": { - "title": "Ενιαία μεγάλη σελίδα", - "desc": "Συγχώνευση όλων των σελίδων PDF σε μία μεγάλη σελίδα" - }, - "showJS": { - "title": "Εμφάνιση Javascript", - "desc": "Αναζήτηση και εμφάνιση οποιουδήποτε JS ενσωματωμένου σε PDF" - }, "autoRedact": { "title": "Αυτόματη απόκρυψη", "desc": "Αυτόματη απόκρυψη (μαύρισμα) κειμένου σε PDF βάσει εισαγόμενου κειμένου" }, - "redact": { - "title": "Χειροκίνητη απόκρυψη", - "desc": "Απόκρυψη σε PDF βάσει επιλεγμένου κειμένου, σχεδιασμένων σχημάτων και/ή επιλεγμένων σελίδων" - }, "PDFToCSV": { "title": "PDF σε CSV", "desc": "Εξαγωγή πινάκων από PDF και μετατροπή σε CSV" @@ -551,10 +870,6 @@ "title": "Αυτόματος διαχωρισμός ανά μέγεθος/πλήθος", "desc": "Διαχωρισμός ενός PDF σε πολλαπλά έγγραφα βάσει μεγέθους, αριθμού σελίδων ή αριθμού εγγράφων" }, - "overlay-pdfs": { - "title": "Επικάλυψη PDF", - "desc": "Επικάλυψη PDF πάνω σε άλλο PDF" - }, "split-by-sections": { "title": "Διαχωρισμός PDF ανά ενότητες", "desc": "Διαίρεση κάθε σελίδας ενός PDF σε μικρότερες οριζόντιες και κάθετες ενότητες" @@ -563,43 +878,17 @@ "title": "Προσθήκη σφραγίδας σε PDF", "desc": "Προσθήκη κειμένου ή εικόνων σφραγίδας σε καθορισμένες θέσεις" }, - "removeImage": { - "title": "Αφαίρεση εικόνας", - "desc": "Αφαίρεση εικόνας από PDF για μείωση μεγέθους αρχείου" - }, - "splitByChapters": { - "title": "Διαχωρισμός PDF ανά κεφάλαια", - "desc": "Διαχωρισμός ενός PDF σε πολλαπλά αρχεία βάσει της δομής κεφαλαίων." - }, - "validateSignature": { - "title": "Επικύρωση υπογραφής PDF", - "desc": "Επαλήθευση ψηφιακών υπογραφών και πιστοποιητικών σε έγγραφα PDF" - }, "replace-color": { "title": "Αντικατάσταση και αναστροφή χρώματος", "desc": "Αντικατάσταση χρώματος για κείμενο και φόντο σε PDF και αναστροφή πλήρους χρώματος για μείωση μεγέθους αρχείου" }, - "convert": { - "title": "Μετατροπή" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Εξαγωγή σελίδων" - }, - "removePages": { - "title": "Αφαίρεση", - "desc": "Διαγραφή ανεπιθύμητων σελίδων από το έγγραφο PDF." - }, "removeImagePdf": { "title": "Αφαίρεση εικόνας", "desc": "Αφαίρεση εικόνας από PDF για μείωση μεγέθους αρχείου" }, - "autoSizeSplitPDF": { - "title": "Αυτόματος διαχωρισμός ανά μέγεθος/πλήθος", - "desc": "Διαχωρισμός ενός PDF σε πολλαπλά έγγραφα βάσει μεγέθους, αριθμού σελίδων ή αριθμού εγγράφων" - }, "adjust-contrast": { "title": "Προσαρμογή χρωμάτων/αντίθεσης", "desc": "Προσαρμογή αντίθεσης, κορεσμού και φωτεινότητας ενός PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Αντικατάσταση και αναστροφή χρώματος", "desc": "Αντικατάσταση χρώματος για κείμενο και φόντο σε PDF και αναστροφή πλήρους χρώματος για μείωση μεγέθους αρχείου" - }, - "changePermissions": { - "title": "Αλλαγή δικαιωμάτων" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "προβολή,ανάγνωση,σχολιασμός,κείμενο,εικόνα", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "συγχώνευση,λειτουργίες σελίδων,backend,πλευρά διακομιστή", "title": "Συγχώνευση", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Συγχώνευση", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Όνομα αρχείου", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Συγχώνευση πολλαπλών PDF (2+)", "sortByName": "Ταξινόμηση κατά όνομα", "sortByDate": "Ταξινόμηση κατά ημερομηνία", - "removeCertSign": "Αφαίρεση ψηφιακής υπογραφής στο συγχωνευμένο αρχείο;", - "submit": "Συγχώνευση", - "sortBy": { - "filename": "Όνομα αρχείου" - } + "removeCertSign": "Αφαίρεση ψηφιακής υπογραφής στο συγχωνευμένο αρχείο;" }, "split": { - "tags": "λειτουργίες σελίδων,διαίρεση,πολλαπλές σελίδες,κοπή,πλευρά διακομιστή", "title": "Διαχωρισμός PDF", "header": "Διαχωρισμός PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Εισάγετε σελίδες για διαχωρισμό:", "submit": "Διαχωρισμός", "steps": { + "chooseMethod": "Choose Method", "settings": "Ρυθμίσεις" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Μέγεθος αρχείου" + "name": "Μέγεθος αρχείου", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Μέγεθος αρχείου" + "label": "Μέγεθος αρχείου", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "λειτουργίες σελίδων,διαίρεση,πολλαπλές σελίδες,κοπή,πλευρά διακομιστή" }, "rotate": { - "tags": "πλευρά διακομιστή", "title": "Περιστροφή PDF", + "submit": "Περιστροφή", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "πλευρά διακομιστή", "header": "Περιστροφή PDF", - "selectAngle": "Επιλέξτε γωνία περιστροφής (σε πολλαπλάσια των 90 μοιρών):", - "submit": "Περιστροφή" + "selectAngle": "Επιλέξτε γωνία περιστροφής (σε πολλαπλάσια των 90 μοιρών):" + }, + "convert": { + "title": "Μετατροπή", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Ρυθμίσεις", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Χρώμα", + "greyscale": "Κλίμακα του γκρι", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Γέμισμα σελίδας", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "Το PDF περιέχει ψηφιακή υπογραφή. Αυτή θα αφαιρεθεί στο επόμενο βήμα.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Κλίμακα του γκρι", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "μετατροπή,εικόνα,jpg,φωτογραφία" @@ -727,7 +1263,33 @@ "8": "Αφαίρεση τελευταίας", "9": "Αφαίρεση πρώτης και τελευταίας", "10": "Συγχώνευση μονών-ζυγών", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(π.χ. 1,3,2 ή 4-8,2,10-12 ή 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Προσθήκη εικόνας", "submit": "Προσθήκη εικόνας" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "κείμενο,επαναλαμβανόμενο,ετικέτα,ιδιοκτησία,πνευματικά δικαιώματα,εμπορικό σήμα,εικόνα,jpg,φωτογραφία", "title": "Προσθήκη υδατογραφήματος", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Προσθήκη υδατογραφήματος", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Κείμενο", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Μέγεθος γραμματοσειράς", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Κείμενο", + "2": "Εικόνα" + }, + "tags": "κείμενο,επαναλαμβανόμενο,ετικέτα,ιδιοκτησία,πνευματικά δικαιώματα,εμπορικό σήμα,εικόνα,jpg,φωτογραφία", "header": "Προσθήκη υδατογραφήματος", "customColor": "Προσαρμοσμένο χρώμα κειμένου", "selectText": { @@ -755,17 +1506,6 @@ "8": "Τύπος υδατογραφήματος:", "9": "Εικόνα υδατογραφήματος:", "10": "Μετατροπή PDF σε PDF-Εικόνα" - }, - "submit": "Προσθήκη υδατογραφήματος", - "type": { - "1": "Κείμενο", - "2": "Εικόνα" - }, - "watermarkType": { - "text": "Κείμενο" - }, - "settings": { - "fontSize": "Μέγεθος γραμματοσειράς" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "αφαίρεση σελίδων,διαγραφή σελίδων", "title": "Αφαίρεση", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Αφαίρεση" }, - "addPassword": { - "tags": "ασφάλεια,ασφάλεια", - "title": "Προσθήκη κωδικού", - "header": "Προσθήκη κωδικού (Κρυπτογράφηση)", - "selectText": { - "1": "Επιλέξτε PDF για κρυπτογράφηση", - "2": "Κωδικός χρήστη", - "3": "Μήκος κλειδιού κρυπτογράφησης", - "4": "Οι υψηλότερες τιμές είναι ισχυρότερες, αλλά οι χαμηλότερες τιμές έχουν καλύτερη συμβατότητα.", - "5": "Δικαιώματα προς ορισμό (Συνιστάται να χρησιμοποιείται μαζί με κωδικό ιδιοκτήτη)", - "6": "Αποτροπή συναρμολόγησης εγγράφου", - "7": "Αποτροπή εξαγωγής περιεχομένου", - "8": "Αποτροπή εξαγωγής για προσβασιμότητα", - "9": "Αποτροπή συμπλήρωσης φόρμας", - "10": "Αποτροπή τροποποίησης", - "11": "Αποτροπή τροποποίησης σχολιασμών", - "12": "Αποτροπή εκτύπωσης", - "13": "Αποτροπή εκτύπωσης σε διαφορετικές μορφές", - "14": "Κωδικός ιδιοκτήτη", - "15": "Περιορίζει τι μπορεί να γίνει με το έγγραφο μετά το άνοιγμά του (Δεν υποστηρίζεται από όλα τα προγράμματα ανάγνωσης)", - "16": "Περιορίζει το άνοιγμα του ίδιου του εγγράφου" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Κρυπτογράφηση", "tooltip": { - "permissions": { - "title": "Αλλαγή δικαιωμάτων" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "ασφάλεια,αποκρυπτογράφηση,ασφάλεια,αφαίρεση κωδικού,διαγραφή κωδικού", - "title": "Αφαίρεση κωδικού", - "header": "Αφαίρεση κωδικού (Αποκρυπτογράφηση)", - "selectText": { - "1": "Επιλέξτε PDF για αποκρυπτογράφηση", - "2": "Κωδικός" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Αφαίρεση", - "desc": "Αφαίρεση προστασίας κωδικού από το έγγραφο PDF.", - "password": { - "stepTitle": "Αφαίρεση κωδικού", - "label": "Τρέχων κωδικός" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "τίτλος,συγγραφέας,ημερομηνία,δημιουργία,χρόνος,εκδότης,παραγωγός,στατιστικά", - "title": "Τίτλος:", "header": "Αλλαγή μεταδεδομένων", + "submit": "Αλλαγή", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "τίτλος,συγγραφέας,ημερομηνία,δημιουργία,χρόνος,εκδότης,παραγωγός,στατιστικά", "selectText": { "1": "Παρακαλώ επεξεργαστείτε τις μεταβλητές που επιθυμείτε να αλλάξετε", "2": "Διαγραφή όλων των μεταδεδομένων", @@ -856,15 +1877,7 @@ "4": "Άλλα μεταδεδομένα:", "5": "Προσθήκη προσαρμοσμένης καταχώρησης μεταδεδομένων" }, - "author": "Συγγραφέας:", - "creationDate": "Ημερομηνία δημιουργίας (yyyy/MM/dd HH:mm:ss):", - "creator": "Δημιουργός:", - "keywords": "Λέξεις-κλειδιά:", - "modDate": "Ημερομηνία τροποποίησης (yyyy/MM/dd HH:mm:ss):", - "producer": "Παραγωγός:", - "subject": "Θέμα:", - "trapped": "Παγιδευμένο:", - "submit": "Αλλαγή" + "modDate": "Ημερομηνία τροποποίησης (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "μετατροπή,μορφή,έγγραφο,εικόνα,παρουσίαση,κείμενο,μετατροπή,γραφείο,έγγραφα,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "αναγνώριση,κείμενο,εικόνα,σάρωση,ανάγνωση,αναγνώριση,ανίχνευση,επεξεργάσιμο", "title": "OCR / Καθαρισμός σαρώσεων", + "desc": "Καθαρισμός σαρώσεων και ανίχνευση κειμένου από εικόνες μέσα σε PDF και επαναπροσθήκη ως κείμενο.", "header": "Καθαρισμός σαρώσεων / OCR (Οπτική αναγνώριση χαρακτήρων)", "selectText": { "1": "Επιλέξτε γλώσσες που θα ανιχνευθούν μέσα στο PDF (Αυτές που εμφανίζονται είναι αυτές που ανιχνεύονται αυτή τη στιγμή):", @@ -896,23 +1910,89 @@ "help": "Παρακαλώ διαβάστε αυτή την τεκμηρίωση για το πώς να το χρησιμοποιήσετε για άλλες γλώσσες ή/και χρήση εκτός docker", "credit": "Αυτή η υπηρεσία χρησιμοποιεί qpdf και Tesseract για OCR.", "submit": "Επεξεργασία PDF με OCR", - "desc": "Καθαρισμός σαρώσεων και ανίχνευση κειμένου από εικόνες μέσα σε PDF και επαναπροσθήκη ως κείμενο.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Ρυθμίσεις", "ocrMode": { - "label": "Λειτουργία OCR" + "label": "Λειτουργία OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Γλώσσες" + "label": "Γλώσσες", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Λειτουργία OCR" + "title": "Λειτουργία OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Γλώσσες" + "title": "Γλώσσες", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Εξαγωγή εικόνων", "selectText": "Επιλέξτε μορφή εικόνας για μετατροπή των εξαγόμενων εικόνων", "allowDuplicates": "Αποθήκευση διπλότυπων εικόνων", - "submit": "Εξαγωγή" + "submit": "Εξαγωγή", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "αρχείο,μακροχρόνιο,πρότυπο,μετατροπή,αποθήκευση,διατήρηση", @@ -993,17 +2079,53 @@ }, "info": "Η Python δεν είναι εγκατεστημένη. Απαιτείται για εκτέλεση." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "εξουσιοδότηση,αρχικά,σχεδιασμένη-υπογραφή,υπογραφή-κειμένου,υπογραφή-εικόνας", "title": "Υπογραφή", "header": "Υπογραφή PDF", "upload": "Μεταφόρτωση εικόνας", - "draw": "Σχεδίαση υπογραφής", - "text": "Εισαγωγή κειμένου", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Καθαρισμός", "add": "Προσθήκη", "saved": "Αποθηκευμένες υπογραφές", "save": "Αποθήκευση υπογραφής", + "applySignatures": "Apply Signatures", "personalSigs": "Προσωπικές υπογραφές", "sharedSigs": "Κοινόχρηστες υπογραφές", "noSavedSigs": "Δεν βρέθηκαν αποθηκευμένες υπογραφές", @@ -1015,42 +2137,179 @@ "previous": "Προηγούμενη σελίδα", "maintainRatio": "Εναλλαγή διατήρησης αναλογίας διαστάσεων", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "εξουσιοδότηση,αρχικά,σχεδιασμένη-υπογραφή,υπογραφή-κειμένου,υπογραφή-εικόνας" }, "flatten": { - "tags": "στατικό,απενεργοποίηση,μη-διαδραστικό,απλοποίηση", "title": "Ισοπέδωση", "header": "Ισοπέδωση PDF", "flattenOnlyForms": "Ισοπέδωση μόνο φορμών", "submit": "Ισοπέδωση", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Ρυθμίσεις" }, "options": { - "flattenOnlyForms": "Ισοπέδωση μόνο φορμών" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Ισοπέδωση μόνο φορμών", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "στατικό,απενεργοποίηση,μη-διαδραστικό,απλοποίηση" }, "repair": { "tags": "επιδιόρθωση,αποκατάσταση,διόρθωση,ανάκτηση", "title": "Επιδιόρθωση", "header": "Επιδιόρθωση PDF", - "submit": "Επιδιόρθωση" + "submit": "Επιδιόρθωση", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "καθαρισμός,απλοποίηση,χωρίς-περιεχόμενο,οργάνωση", "title": "Αφαίρεση κενών σελίδων", "header": "Αφαίρεση κενών σελίδων", - "threshold": "Όριο λευκότητας εικονοστοιχείων:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Αφαίρεση κενών σελίδων", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "καθαρισμός,απλοποίηση,χωρίς-περιεχόμενο,οργάνωση", "thresholdDesc": "Όριο για τον προσδιορισμό πόσο λευκό πρέπει να είναι ένα εικονοστοιχείο για να θεωρηθεί 'Λευκό'. 0 = Μαύρο, 255 καθαρό λευκό.", - "whitePercent": "Ποσοστό λευκού (%):", - "whitePercentDesc": "Ποσοστό της σελίδας που πρέπει να είναι 'λευκά' εικονοστοιχεία για να αφαιρεθεί", - "submit": "Αφαίρεση κενών σελίδων" + "whitePercentDesc": "Ποσοστό της σελίδας που πρέπει να είναι 'λευκά' εικονοστοιχεία για να αφαιρεθεί" }, "removeAnnotations": { "tags": "σχόλια,επισήμανση,σημειώσεις,επισημάνσεις,αφαίρεση", "title": "Αφαίρεση σχολίων", "header": "Αφαίρεση σχολίων", - "submit": "Αφαίρεση" + "submit": "Αφαίρεση", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "διαφοροποίηση,αντιπαραβολή,αλλαγές,ανάλυση", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "πιστοποίηση,PEM,P12,επίσημο,κρυπτογράφηση", "title": "Υπογραφή με πιστοποιητικό", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Τοποθεσία", + "logoTitle": "Logo", + "name": "Όνομα", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Εισάγετε τον κωδικό πρόσβασης του Keystore ή του ιδιωτικού κλειδιού (εάν υπάρχει):", + "passwordOptional": "Leave empty if no password", + "reason": "Αιτία", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Εμφάνιση λογότυπου", "header": "Υπογραφή PDF με το πιστοποιητικό σας (Σε εξέλιξη)", "selectPDF": "Επιλέξτε αρχείο PDF για υπογραφή:", "jksNote": "Σημείωση: Εάν ο τύπος του πιστοποιητικού σας δεν αναφέρεται παρακάτω, παρακαλώ μετατρέψτε το σε αρχείο Java Keystore (.jks) χρησιμοποιώντας το εργαλείο γραμμής εντολών keytool. Στη συνέχεια, επιλέξτε την επιλογή αρχείου .jks παρακάτω.", @@ -1089,13 +2484,7 @@ "selectCert": "Επιλέξτε το αρχείο πιστοποιητικού σας (μορφή X.509, μπορεί να είναι .pem ή .der):", "selectP12": "Επιλέξτε το αρχείο PKCS#12 Keystore (.p12 ή .pfx) (Προαιρετικό, εάν παρέχεται, θα πρέπει να περιέχει το ιδιωτικό κλειδί και το πιστοποιητικό σας):", "selectJKS": "Επιλέξτε το αρχείο Java Keystore (.jks ή .keystore):", - "certType": "Τύπος πιστοποιητικού", - "password": "Εισάγετε τον κωδικό πρόσβασης του Keystore ή του ιδιωτικού κλειδιού (εάν υπάρχει):", "showSig": "Εμφάνιση υπογραφής", - "reason": "Αιτία", - "location": "Τοποθεσία", - "name": "Όνομα", - "showLogo": "Εμφάνιση λογότυπου", "submit": "Υπογραφή PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Αφαίρεση υπογραφής πιστοποιητικού", "header": "Αφαίρεση της ψηφιακής υπογραφής από το PDF", "selectPDF": "Επιλέξτε ένα αρχείο PDF:", - "submit": "Αφαίρεση υπογραφής" + "submit": "Αφαίρεση υπογραφής", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "συγχώνευση,σύνθεση,ενιαία-προβολή,οργάνωση", @@ -1111,16 +2511,157 @@ "header": "Διάταξη πολλαπλών σελίδων", "pagesPerSheet": "Σελίδες ανά φύλλο:", "addBorder": "Προσθήκη περιγραμμάτων", - "submit": "Υποβολή" + "submit": "Υποβολή", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "αλλαγή μεγέθους,τροποποίηση,διάσταση,προσαρμογή", "title": "Προσαρμογή κλίμακας σελίδας", "header": "Προσαρμογή κλίμακας σελίδας", "pageSize": "Μέγεθος σελίδας του εγγράφου.", "keepPageSize": "Αρχικό μέγεθος", "scaleFactor": "Επίπεδο ζουμ (περικοπή) σελίδας.", - "submit": "Υποβολή" + "submit": "Υποβολή", + "tags": "αλλαγή μεγέθους,τροποποίηση,διάσταση,προσαρμογή" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "αρίθμηση,ετικέτα,οργάνωση,ευρετήριο" @@ -1129,16 +2670,83 @@ "tags": "αυτόματη-ανίχνευση,βάσει-κεφαλίδας,οργάνωση,επανετικέτα", "title": "Αυτόματη μετονομασία", "header": "Αυτόματη μετονομασία PDF", - "submit": "Αυτόματη μετονομασία" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Αυτόματη μετονομασία", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "διόρθωση-χρωμάτων,συντονισμός,τροποποίηση,βελτίωση" }, "crop": { - "tags": "περικοπή,συρρίκνωση,επεξεργασία,σχήμα", "title": "Περικοπή", "header": "Περικοπή PDF", - "submit": "Υποβολή" + "submit": "Υποβολή", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "περικοπή,συρρίκνωση,επεξεργασία,σχήμα" }, "autoSplitPDF": { "tags": "QR-based,διαχωρισμός,σάρωση-τμήματος,οργάνωση", @@ -1221,24 +2829,124 @@ "downloadJS": "Λήψη Javascript", "submit": "Εμφάνιση" }, - "autoRedact": { - "tags": "απόκρυψη,κρύψιμο,μαύρισμα,μαύρο,μαρκαδόρος,κρυμμένο", - "title": "Αυτόματη απόκρυψη", - "header": "Αυτόματη απόκρυψη", - "colorLabel": "Χρώμα", - "textsToRedactLabel": "Κείμενο προς απόκρυψη (διαχωρισμένο ανά γραμμή)", - "textsToRedactPlaceholder": "π.χ. \\nΕμπιστευτικό \\nΆκρως απόρρητο", - "useRegexLabel": "Χρήση Regex", - "wholeWordSearchLabel": "Αναζήτηση ολόκληρης λέξης", - "customPaddingLabel": "Προσαρμοσμένο επιπλέον περιθώριο", - "convertPDFToImageLabel": "Μετατροπή PDF σε PDF-Εικόνα (Χρησιμοποιείται για την αφαίρεση κειμένου πίσω από το πλαίσιο)", - "submitButton": "Υποβολή" - }, "redact": { "tags": "απόκρυψη,κρύψιμο,μαύρισμα,μαύρο,μαρκαδόρος,κρυμμένο,χειροκίνητο", "title": "Χειροκίνητη απόκρυψη", - "header": "Χειροκίνητη απόκρυψη", "submit": "Απόκρυψη", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Προχωρημένα" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Προσθήκη", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Σελίδες", + "placeholder": "(π.χ. 1,2,8 ή 4,7,12-16 ή 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Εξαγωγή", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Χειροκίνητη απόκρυψη", "textBasedRedaction": "Απόκρυψη βάσει κειμένου", "pageBasedRedaction": "Απόκρυψη βάσει σελίδας", "convertPDFToImageLabel": "Μετατροπή PDF σε PDF-Εικόνα (Χρησιμοποιείται για την αφαίρεση κειμένου πίσω από το πλαίσιο)", @@ -1264,22 +2972,7 @@ "showLayers": "Εμφάνιση επιπέδων (διπλό κλικ για επαναφορά όλων των επιπέδων στην προεπιλεγμένη κατάσταση)", "colourPicker": "Επιλογέας χρώματος", "findCurrentOutlineItem": "Εύρεση τρέχοντος στοιχείου περιγράμματος", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Προχωρημένα" - }, - "wordsToRedact": { - "add": "Προσθήκη" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Σελίδες", - "placeholder": "(π.χ. 1,2,8 ή 4,7,12-16 ή 2n-1)" - }, - "export": "Εξαγωγή" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,εξαγωγή πίνακα,εξαγωγή,μετατροπή" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "επικάλυψη", "header": "Επικάλυψη αρχείων PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Επιλέξτε βασικό αρχείο PDF" }, "overlayFiles": { - "label": "Επιλέξτε αρχεία PDF επικάλυψης" + "label": "Επιλέξτε αρχεία PDF επικάλυψης", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Επιλέξτε λειτουργία επικάλυψης", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "Πλήθος επικαλύψεων (για λειτουργία σταθερής επανάληψης)", - "placeholder": "Εισάγετε πλήθη διαχωρισμένα με κόμμα (π.χ. 2,3,1)" + "placeholder": "Εισάγετε πλήθη διαχωρισμένα με κόμμα (π.χ. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Επιλέξτε θέση επικάλυψης", "foreground": "Προσκήνιο", "background": "Φόντο" }, - "submit": "Υποβολή" + "submit": "Υποβολή", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "διαχωρισμός ενοτήτων,διαίρεση,προσαρμογή", @@ -1332,6 +3068,7 @@ "tags": "σφραγίδα,προσθήκη εικόνας,κεντράρισμα εικόνας,υδατογράφημα,PDF,ενσωμάτωση,προσαρμογή", "header": "Σφράγισμα PDF", "title": "Σφράγισμα PDF", + "stampSetup": "Stamp Setup", "stampType": "Τύπος σφραγίδας", "stampText": "Κείμενο σφραγίδας", "stampImage": "Εικόνα σφραγίδας", @@ -1344,7 +3081,19 @@ "overrideY": "Παράκαμψη συντεταγμένης Y", "customMargin": "Προσαρμοσμένο περιθώριο", "customColor": "Προσαρμοσμένο χρώμα κειμένου", - "submit": "Υποβολή" + "submit": "Υποβολή", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "αφαίρεση εικόνας,λειτουργίες σελίδας,backend,server side" @@ -1362,7 +3111,8 @@ "status": { "_value": "Κατάσταση", "valid": "Έγκυρη", - "invalid": "Μη έγκυρη" + "invalid": "Μη έγκυρη", + "complete": "Validation complete" }, "signer": "Υπογράφων", "date": "Ημερομηνία", @@ -1389,40 +3139,122 @@ "version": "Έκδοση", "keyUsage": "Χρήση κλειδιού", "selfSigned": "Αυτο-υπογεγραμμένο", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Πληροφορίες υπογραφής", "_value": "Υπογραφή", "mathValid": "Η υπογραφή είναι μαθηματικά έγκυρη ΑΛΛΑ:" }, - "selectCustomCert": "Προσαρμοσμένο αρχείο πιστοποιητικού X.509 (Προαιρετικό)" - }, - "replace-color": { - "title": "Αντικατάσταση-Αναστροφή χρώματος", - "header": "Αντικατάσταση-Αναστροφή χρώματος PDF", - "selectText": { - "1": "Επιλογές αντικατάστασης ή αναστροφής χρώματος", - "2": "Προεπιλογή (Προεπιλεγμένα χρώματα υψηλής αντίθεσης)", - "3": "Προσαρμογή (Προσαρμοσμένα χρώματα)", - "4": "Πλήρης αναστροφή (Αναστροφή όλων των χρωμάτων)", - "5": "Επιλογές χρωμάτων υψηλής αντίθεσης", - "6": "Λευκό κείμενο σε μαύρο φόντο", - "7": "Μαύρο κείμενο σε λευκό φόντο", - "8": "Κίτρινο κείμενο σε μαύρο φόντο", - "9": "Πράσινο κείμενο σε μαύρο φόντο", - "10": "Επιλογή χρώματος κειμένου", - "11": "Επιλογή χρώματος φόντου" + "selectCustomCert": "Προσαρμοσμένο αρχείο πιστοποιητικού X.509 (Προαιρετικό)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Αντικατάσταση" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "αντικατάσταση χρώματος,λειτουργίες σελίδας,backend,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Σύνδεση", "header": "Σύνδεση", "signin": "Σύνδεση", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Να με θυμάσαι", "invalid": "Μη έγκυρο όνομα χρήστη ή κωδικός.", "locked": "Ο λογαριασμός σας έχει κλειδωθεί.", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "Είστε ήδη συνδεδεμένοι σε", "alreadyLoggedIn2": "συσκευές. Παρακαλώ αποσυνδεθείτε από τις συσκευές και προσπαθήστε ξανά.", "toManySessions": "Έχετε πάρα πολλές ενεργές συνεδρίες", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF σε μία σελίδα", "header": "PDF σε μία σελίδα", - "submit": "Μετατροπή σε μία σελίδα" + "submit": "Μετατροπή σε μία σελίδα", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Εξαγωγή σελίδων", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "Προσαρμογή αντίθεσης", "header": "Προσαρμογή αντίθεσης", + "basic": "Basic Adjustments", "contrast": "Αντίθεση:", "brightness": "Φωτεινότητα:", "saturation": "Κορεσμός:", - "download": "Λήψη" + "download": "Λήψη", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Συμπίεση", + "desc": "Compress PDFs to reduce their file size.", "header": "Συμπίεση PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Μέγεθος αρχείου" + }, "credit": "Αυτή η υπηρεσία χρησιμοποιεί qpdf για συμπίεση/βελτιστοποίηση PDF.", "grayscale": { "label": "Εφαρμογή κλίμακας του γκρι για συμπίεση" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1491,10 +3435,7 @@ "4": "Αυτόματη λειτουργία - Αυτόματη προσαρμογή ποιότητας για επίτευξη ακριβούς μεγέθους PDF", "5": "Αναμενόμενο μέγεθος PDF (π.χ. 25MB, 10.8MB, 25KB)" }, - "submit": "Συμπίεση", - "method": { - "filesize": "Μέγεθος αρχείου" - } + "submit": "Συμπίεση" }, "decrypt": { "passwordPrompt": "Αυτό το αρχείο προστατεύεται με κωδικό πρόσβασης. Παρακαλώ εισάγετε τον κωδικό:", @@ -1595,7 +3536,13 @@ "title": "Αφαίρεση εικόνας", "header": "Αφαίρεση εικόνας", "removeImage": "Αφαίρεση εικόνας", - "submit": "Αφαίρεση εικόνας" + "submit": "Αφαίρεση εικόνας", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Διαχωρισμός PDF ανά κεφάλαια", @@ -1629,6 +3576,12 @@ }, "note": "Οι σημειώσεις έκδοσης είναι διαθέσιμες μόνο στα Αγγλικά" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Λήψη", - "convert": { - "title": "Μετατροπή", - "settings": "Ρυθμίσεις", - "color": "Χρώμα", - "greyscale": "Κλίμακα του γκρι", - "fillPage": "Γέμισμα σελίδας", - "pdfaDigitalSignatureWarning": "Το PDF περιέχει ψηφιακή υπογραφή. Αυτή θα αφαιρεθεί στο επόμενο βήμα.", - "grayscale": "Κλίμακα του γκρι" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Επιλογή όλων", - "deselectAll": "Αποεπιλογή όλων" + "deselectAll": "Αποεπιλογή όλων", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Υπογραφή" + "read": "Read", + "sign": "Υπογραφή", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Φόρτωση...", - "or": "ή" + "or": "ή", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Όνομα", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Έκδοση", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Επιλογή όλων", "deselectAll": "Αποεπιλογή όλων", "deleteSelected": "Διαγραφή επιλεγμένων", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Λήψη", - "delete": "Διαγραφή" + "delete": "Διαγραφή", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Εξυγίανση PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Ρυθμίσεις" + "files": "Files", + "settings": "Ρυθμίσεις", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Προσθήκη κωδικού", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Κρυπτογράφηση", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Αλλαγή δικαιωμάτων", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "ασφάλεια,ασφάλεια", + "header": "Προσθήκη κωδικού (Κρυπτογράφηση)", + "selectText": { + "1": "Επιλέξτε PDF για κρυπτογράφηση", + "2": "Κωδικός χρήστη", + "3": "Μήκος κλειδιού κρυπτογράφησης", + "4": "Οι υψηλότερες τιμές είναι ισχυρότερες, αλλά οι χαμηλότερες τιμές έχουν καλύτερη συμβατότητα.", + "5": "Δικαιώματα προς ορισμό (Συνιστάται να χρησιμοποιείται μαζί με κωδικό ιδιοκτήτη)", + "6": "Αποτροπή συναρμολόγησης εγγράφου", + "7": "Αποτροπή εξαγωγής περιεχομένου", + "8": "Αποτροπή εξαγωγής για προσβασιμότητα", + "9": "Αποτροπή συμπλήρωσης φόρμας", + "10": "Αποτροπή τροποποίησης", + "11": "Αποτροπή τροποποίησης σχολιασμών", + "12": "Αποτροπή εκτύπωσης", + "13": "Αποτροπή εκτύπωσης σε διαφορετικές μορφές", + "14": "Κωδικός ιδιοκτήτη", + "15": "Περιορίζει τι μπορεί να γίνει με το έγγραφο μετά το άνοιγμά του (Δεν υποστηρίζεται από όλα τα προγράμματα ανάγνωσης)", + "16": "Περιορίζει το άνοιγμα του ίδιου του εγγράφου" } }, "changePermissions": { "title": "Αλλαγή δικαιωμάτων", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Αλλαγή δικαιωμάτων", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Αποτροπή συναρμολόγησης εγγράφου" @@ -1737,10 +4580,784 @@ "label": "Αποτροπή εκτύπωσης σε διαφορετικές μορφές" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Αλλαγή δικαιωμάτων" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Αφαίρεση κωδικού", + "desc": "Αφαίρεση προστασίας κωδικού από το έγγραφο PDF.", + "tags": "ασφάλεια,αποκρυπτογράφηση,ασφάλεια,αφαίρεση κωδικού,διαγραφή κωδικού", + "password": { + "stepTitle": "Αφαίρεση κωδικού", + "label": "Τρέχων κωδικός", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Αφαίρεση", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Αφαίρεση κωδικού (Αποκρυπτογράφηση)", + "selectText": { + "1": "Επιλέξτε PDF για αποκρυπτογράφηση", + "2": "Κωδικός" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Επιλογές αντικατάστασης ή αναστροφής χρώματος", + "2": "Προεπιλογή (Προεπιλεγμένα χρώματα υψηλής αντίθεσης)", + "3": "Προσαρμογή (Προσαρμοσμένα χρώματα)", + "4": "Πλήρης αναστροφή (Αναστροφή όλων των χρωμάτων)", + "5": "Επιλογές χρωμάτων υψηλής αντίθεσης", + "6": "Λευκό κείμενο σε μαύρο φόντο", + "7": "Μαύρο κείμενο σε λευκό φόντο", + "8": "Κίτρινο κείμενο σε μαύρο φόντο", + "9": "Πράσινο κείμενο σε μαύρο φόντο", + "10": "Επιλογή χρώματος κειμένου", + "11": "Επιλογή χρώματος φόντου", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Αντικατάσταση", + "title": "Αντικατάσταση-Αναστροφή χρώματος", + "header": "Αντικατάσταση-Αναστροφή χρώματος PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "απόκρυψη,κρύψιμο,μαύρισμα,μαύρο,μαρκαδόρος,κρυμμένο", + "title": "Αυτόματη απόκρυψη", + "header": "Αυτόματη απόκρυψη", + "colorLabel": "Χρώμα", + "textsToRedactLabel": "Κείμενο προς απόκρυψη (διαχωρισμένο ανά γραμμή)", + "textsToRedactPlaceholder": "π.χ. \\nΕμπιστευτικό \\nΆκρως απόρρητο", + "useRegexLabel": "Χρήση Regex", + "wholeWordSearchLabel": "Αναζήτηση ολόκληρης λέξης", + "customPaddingLabel": "Προσαρμοσμένο επιπλέον περιθώριο", + "convertPDFToImageLabel": "Μετατροπή PDF σε PDF-Εικόνα (Χρησιμοποιείται για την αφαίρεση κειμένου πίσω από το πλαίσιο)", + "submitButton": "Υποβολή" + }, + "replaceColorPdf": { + "tags": "αντικατάσταση χρώματος,λειτουργίες σελίδας,backend,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/en-GB/translation.json b/frontend/public/locales/en-GB/translation.json index e6a86e745..2e1417bf0 100644 --- a/frontend/public/locales/en-GB/translation.json +++ b/frontend/public/locales/en-GB/translation.json @@ -473,7 +473,14 @@ "globalPopularity": "Global Popularity", "sortBy": "Sort by:", "mobile": { - "brandAlt": "Stirling PDF logo" + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" }, "multiTool": { "tags": "multiple,tools", @@ -765,16 +772,6 @@ "title": "Automate", "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." }, - "mobile": { - "brandAlt": "Stirling PDF logo", - "openFiles": "Open files", - "swipeHint": "Swipe left or right to switch views", - "tools": "Tools", - "toolsSlide": "Tool selection panel", - "viewSwitcher": "Switch workspace view", - "workbenchSlide": "Workspace panel", - "workspace": "Workspace" - }, "overlay-pdfs": { "desc": "Overlay one PDF on top of another", "title": "Overlay PDFs" @@ -817,15 +814,19 @@ "merge": { "tags": "merge,Page operations,Back end,server side", "title": "Merge", - "removeDigitalSignature": "Remove digital signature in the merged file?", - "generateTableOfContents": "Generate table of contents in the merged file?", - "removeDigitalSignature.tooltip": { - "title": "Remove Digital Signature", - "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } }, - "generateTableOfContents.tooltip": { - "title": "Generate Table of Contents", - "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } }, "submit": "Merge", "sortBy": { @@ -2035,8 +2036,10 @@ "options": { "stepTitle": "Flatten Options", "title": "Flatten Options", - "flattenOnlyForms": "Flatten only forms", - "flattenOnlyForms.desc": "Only flatten form fields, leaving other interactive elements intact", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, "note": "Flattening removes interactive elements from the PDF, making them non-editable." }, "results": { @@ -3127,13 +3130,14 @@ "passwordsDoNotMatch": "Passwords do not match", "passwordTooShort": "Password must be at least 6 characters long", "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", "nameRequired": "Name is required", "emailRequired": "Email is required", "passwordRequired": "Password is required", - "confirmPasswordRequired": "Confirm password is required", - "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", - "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", - "unexpectedError": "Unexpected error: {{message}}" + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF To Single Page", @@ -3570,45 +3574,87 @@ "description": "Configure system-wide application settings including branding and default behaviour.", "ui": "User Interface", "system": "System", - "appName": "Application Name", - "appName.description": "The name displayed in the browser tab and home page", - "appNameNavbar": "Navbar Brand", - "appNameNavbar.description": "The name displayed in the navigation bar", - "homeDescription": "Home Description", - "homeDescription.description": "The description text shown on the home page", - "defaultLocale": "Default Locale", - "defaultLocale.description": "The default language for new users (e.g., en_US, es_ES)", - "fileUploadLimit": "File Upload Limit", - "fileUploadLimit.description": "Maximum file upload size (e.g., 100MB, 1GB)", - "showUpdate": "Show Update Notifications", - "showUpdate.description": "Display notifications when a new version is available", - "showUpdateOnlyAdmin": "Show Updates to Admins Only", - "showUpdateOnlyAdmin.description": "Restrict update notifications to admin users only", - "customHTMLFiles": "Custom HTML Files", - "customHTMLFiles.description": "Allow serving custom HTML files from the customFiles directory", - "languages": "Available Languages", - "languages.description": "Languages that users can select from (leave empty to enable all languages)", - "customMetadata": "Custom Metadata", - "customMetadata.autoUpdate": "Auto Update Metadata", - "customMetadata.autoUpdate.description": "Automatically update PDF metadata on all processed documents", - "customMetadata.author": "Default Author", - "customMetadata.author.description": "Default author for PDF metadata (e.g., username)", - "customMetadata.creator": "Default Creator", - "customMetadata.creator.description": "Default creator for PDF metadata", - "customMetadata.producer": "Default Producer", - "customMetadata.producer.description": "Default producer for PDF metadata", - "customPaths": "Custom Paths", - "customPaths.description": "Configure custom file system paths for pipeline processing and external tools", - "customPaths.pipeline": "Pipeline Directories", - "customPaths.pipeline.watchedFoldersDir": "Watched Folders Directory", - "customPaths.pipeline.watchedFoldersDir.description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)", - "customPaths.pipeline.finishedFoldersDir": "Finished Folders Directory", - "customPaths.pipeline.finishedFoldersDir.description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)", - "customPaths.operations": "External Tool Paths", - "customPaths.operations.weasyprint": "WeasyPrint Executable", - "customPaths.operations.weasyprint.description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)", - "customPaths.operations.unoconvert": "Unoconvert Executable", - "customPaths.operations.unoconvert.description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } }, "security": { "title": "Security", @@ -3618,68 +3664,124 @@ "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." }, "authentication": "Authentication", - "enableLogin": "Enable Login", - "enableLogin.description": "Require users to log in before accessing the application", - "loginMethod": "Login Method", - "loginMethod.description": "The authentication method to use for user login", - "loginMethod.all": "All Methods", - "loginMethod.normal": "Username/Password Only", - "loginMethod.oauth2": "OAuth2 Only", - "loginMethod.saml2": "SAML2 Only", - "loginAttemptCount": "Login Attempt Limit", - "loginAttemptCount.description": "Maximum number of failed login attempts before account lockout", - "loginResetTimeMinutes": "Login Reset Time (minutes)", - "loginResetTimeMinutes.description": "Time before failed login attempts are reset", - "csrfDisabled": "Disable CSRF Protection", - "csrfDisabled.description": "Disable Cross-Site Request Forgery protection (not recommended)", - "initialLogin": "Initial Login", - "initialLogin.username": "Initial Username", - "initialLogin.username.description": "The username for the initial admin account", - "initialLogin.password": "Initial Password", - "initialLogin.password.description": "The password for the initial admin account", - "jwt": "JWT Configuration", - "jwt.secureCookie": "Secure Cookie", - "jwt.secureCookie.description": "Require HTTPS for JWT cookies (recommended for production)", - "jwt.keyRetentionDays": "Key Retention Days", - "jwt.keyRetentionDays.description": "Number of days to retain old JWT keys for verification", - "jwt.persistence": "Enable Key Persistence", - "jwt.persistence.description": "Store JWT keys persistently to survive server restarts", - "jwt.enableKeyRotation": "Enable Key Rotation", - "jwt.enableKeyRotation.description": "Automatically rotate JWT signing keys periodically", - "jwt.enableKeyCleanup": "Enable Key Cleanup", - "jwt.enableKeyCleanup.description": "Automatically remove expired JWT keys", - "audit": "Audit Logging", - "audit.enabled": "Enable Audit Logging", - "audit.enabled.description": "Track user actions and system events for compliance and security monitoring", - "audit.level": "Audit Level", - "audit.level.description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE", - "audit.retentionDays": "Audit Retention (days)", - "audit.retentionDays.description": "Number of days to retain audit logs", - "htmlUrlSecurity": "HTML URL Security", - "htmlUrlSecurity.description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", - "htmlUrlSecurity.enabled": "Enable URL Security", - "htmlUrlSecurity.enabled.description": "Enable URL security restrictions for HTML to PDF conversions", - "htmlUrlSecurity.level": "Security Level", - "htmlUrlSecurity.level.description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", - "htmlUrlSecurity.level.max": "Maximum (Whitelist Only)", - "htmlUrlSecurity.level.medium": "Medium (Block Internal)", - "htmlUrlSecurity.level.off": "Off (No Restrictions)", - "htmlUrlSecurity.advanced": "Advanced Settings", - "htmlUrlSecurity.allowedDomains": "Allowed Domains (Whitelist)", - "htmlUrlSecurity.allowedDomains.description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX", - "htmlUrlSecurity.blockedDomains": "Blocked Domains (Blacklist)", - "htmlUrlSecurity.blockedDomains.description": "One domain per line (e.g., malicious.com). Additional domains to block", - "htmlUrlSecurity.internalTlds": "Internal TLDs", - "htmlUrlSecurity.internalTlds.description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns", - "htmlUrlSecurity.networkBlocking": "Network Blocking", - "htmlUrlSecurity.blockPrivateNetworks": "Block Private Networks", - "htmlUrlSecurity.blockPrivateNetworks.description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)", - "htmlUrlSecurity.blockLocalhost": "Block Localhost", - "htmlUrlSecurity.blockLocalhost.description": "Block localhost and loopback addresses (127.x.x.x, ::1)", - "htmlUrlSecurity.blockLinkLocal": "Block Link-Local Addresses", - "htmlUrlSecurity.blockLinkLocal.description": "Block link-local addresses (169.254.x.x, fe80::/10)", - "htmlUrlSecurity.blockCloudMetadata": "Block Cloud Metadata Endpoints", - "htmlUrlSecurity.blockCloudMetadata.description": "Block cloud provider metadata endpoints (169.254.169.254)" + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } }, "connections": { "title": "Connections", @@ -3690,146 +3792,254 @@ "disconnect": "Disconnect", "disconnected": "Provider disconnected successfully", "disconnectError": "Failed to disconnect provider", - "ssoAutoLogin": "SSO Auto Login", - "ssoAutoLogin.enable": "Enable SSO Auto Login", - "ssoAutoLogin.description": "Automatically redirect to SSO login when authentication is required", - "oauth2": "OAuth2", - "oauth2.enabled": "Enable OAuth2", - "oauth2.enabled.description": "Allow users to authenticate using OAuth2 providers", - "oauth2.provider": "Provider", - "oauth2.provider.description": "The OAuth2 provider to use for authentication", - "oauth2.issuer": "Issuer URL", - "oauth2.issuer.description": "The OAuth2 provider issuer URL", - "oauth2.clientId": "Client ID", - "oauth2.clientId.description": "The OAuth2 client ID from your provider", - "oauth2.clientSecret": "Client Secret", - "oauth2.clientSecret.description": "The OAuth2 client secret from your provider", - "oauth2.useAsUsername": "Use as Username", - "oauth2.useAsUsername.description": "The OAuth2 claim to use as the username (e.g., email, sub)", - "oauth2.autoCreateUser": "Auto Create Users", - "oauth2.autoCreateUser.description": "Automatically create user accounts on first OAuth2 login", - "oauth2.blockRegistration": "Block Registration", - "oauth2.blockRegistration.description": "Prevent new user registration via OAuth2", - "oauth2.scopes": "OAuth2 Scopes", - "oauth2.scopes.description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)", - "saml2": "SAML2", - "saml2.enabled": "Enable SAML2", - "saml2.enabled.description": "Allow users to authenticate using SAML2 providers", - "saml2.provider": "Provider", - "saml2.provider.description": "The SAML2 provider name", - "saml2.registrationId": "Registration ID", - "saml2.registrationId.description": "The SAML2 registration identifier", - "saml2.autoCreateUser": "Auto Create Users", - "saml2.autoCreateUser.description": "Automatically create user accounts on first SAML2 login", - "saml2.blockRegistration": "Block Registration", - "saml2.blockRegistration.description": "Prevent new user registration via SAML2" + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } }, "database": { "title": "Database", "description": "Configure custom database connection settings for enterprise deployments.", "configuration": "Database Configuration", - "enableCustom": "Enable Custom Database", - "enableCustom.description": "Use your own custom database configuration instead of the default embedded database", - "customUrl": "Custom Database URL", - "customUrl.description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used.", - "type": "Database Type", - "type.description": "Type of database (not used if custom URL is provided)", - "hostName": "Host Name", - "hostName.description": "Database server hostname (not used if custom URL is provided)", - "port": "Port", - "port.description": "Database server port (not used if custom URL is provided)", - "name": "Database Name", - "name.description": "Name of the database (not used if custom URL is provided)", - "username": "Username", - "username.description": "Database authentication username", - "password": "Password", - "password.description": "Database authentication password" + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } }, "privacy": { "title": "Privacy", "description": "Configure privacy and data collection settings.", "analytics": "Analytics & Tracking", - "enableAnalytics": "Enable Analytics", - "enableAnalytics.description": "Collect anonymous usage analytics to help improve the application", - "metricsEnabled": "Enable Metrics", - "metricsEnabled.description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, "searchEngine": "Search Engine Visibility", - "googleVisibility": "Google Visibility", - "googleVisibility.description": "Allow search engines to index this application" + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } }, "advanced": { "title": "Advanced", "description": "Configure advanced features and experimental functionality.", "features": "Feature Flags", "processing": "Processing", - "endpoints": "Endpoints", - "endpoints.manage": "Manage API Endpoints", - "endpoints.description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints.", - "enableAlphaFunctionality": "Enable Alpha Features", - "enableAlphaFunctionality.description": "Enable experimental and alpha-stage features (may be unstable)", - "enableUrlToPDF": "Enable URL to PDF", - "enableUrlToPDF.description": "Allow conversion of web pages to PDF documents", - "maxDPI": "Maximum DPI", - "maxDPI.description": "Maximum DPI for image processing (0 = unlimited)", - "tessdataDir": "Tessdata Directory", - "tessdataDir.description": "Path to the tessdata directory for OCR language files", - "disableSanitize": "Disable HTML Sanitization", - "disableSanitize.description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities", - "tempFileManagement": "Temp File Management", - "tempFileManagement.description": "Configure temporary file storage and cleanup behavior", - "tempFileManagement.baseTmpDir": "Base Temp Directory", - "tempFileManagement.baseTmpDir.description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)", - "tempFileManagement.libreofficeDir": "LibreOffice Temp Directory", - "tempFileManagement.libreofficeDir.description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)", - "tempFileManagement.systemTempDir": "System Temp Directory", - "tempFileManagement.systemTempDir.description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)", - "tempFileManagement.prefix": "Temp File Prefix", - "tempFileManagement.prefix.description": "Prefix for temp file names", - "tempFileManagement.maxAgeHours": "Max Age (hours)", - "tempFileManagement.maxAgeHours.description": "Maximum age in hours before temp files are cleaned up", - "tempFileManagement.cleanupIntervalMinutes": "Cleanup Interval (minutes)", - "tempFileManagement.cleanupIntervalMinutes.description": "How often to run cleanup (in minutes)", - "tempFileManagement.startupCleanup": "Startup Cleanup", - "tempFileManagement.startupCleanup.description": "Clean up old temp files on application startup", - "tempFileManagement.cleanupSystemTemp": "Cleanup System Temp", - "tempFileManagement.cleanupSystemTemp.description": "Whether to clean broader system temp directory (use with caution)", - "processExecutor": "Process Executor Limits", - "processExecutor.description": "Configure session limits and timeouts for each process executor", - "processExecutor.sessionLimit": "Session Limit", - "processExecutor.sessionLimit.description": "Maximum concurrent instances", - "processExecutor.timeout": "Timeout (minutes)", - "processExecutor.timeout.description": "Maximum execution time", - "processExecutor.libreOffice": "LibreOffice", - "processExecutor.pdfToHtml": "PDF to HTML", - "processExecutor.qpdf": "QPDF", - "processExecutor.tesseract": "Tesseract OCR", - "processExecutor.pythonOpenCv": "Python OpenCV", - "processExecutor.weasyPrint": "WeasyPrint", - "processExecutor.installApp": "Install App", - "processExecutor.calibre": "Calibre", - "processExecutor.ghostscript": "Ghostscript", - "processExecutor.ocrMyPdf": "OCRmyPDF" + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } }, "mail": { "title": "Mail Server", "description": "Configure SMTP settings for sending email notifications.", "smtp": "SMTP Configuration", - "enabled": "Enable Mail", - "enabled.description": "Enable email notifications and SMTP functionality", - "host": "SMTP Host", - "host.description": "The hostname or IP address of your SMTP server", - "port": "SMTP Port", - "port.description": "The port number for SMTP connection (typically 25, 465, or 587)", - "username": "SMTP Username", - "username.description": "Username for SMTP authentication", - "password": "SMTP Password", - "password.description": "Password for SMTP authentication", - "from": "From Address", - "from.description": "The email address to use as the sender", - "enableInvites": "Enable Email Invites", - "enableInvites.description": "Allow admins to invite users via email with auto-generated passwords", - "frontendUrl": "Frontend URL", - "frontendUrl.description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } }, "legal": { "title": "Legal Documents", @@ -3838,25 +4048,39 @@ "title": "Legal Responsibility Warning", "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." }, - "termsAndConditions": "Terms and Conditions", - "termsAndConditions.description": "URL or filename to terms and conditions", - "privacyPolicy": "Privacy Policy", - "privacyPolicy.description": "URL or filename to privacy policy", - "accessibilityStatement": "Accessibility Statement", - "accessibilityStatement.description": "URL or filename to accessibility statement", - "cookiePolicy": "Cookie Policy", - "cookiePolicy.description": "URL or filename to cookie policy", - "impressum": "Impressum", - "impressum.description": "URL or filename to impressum (required in some jurisdictions)" + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } }, "premium": { "title": "Premium & Enterprise", "description": "Configure your premium or enterprise license key.", "license": "License Configuration", - "key": "License Key", - "key.description": "Enter your premium or enterprise license key", - "enabled": "Enable Premium Features", - "enabled.description": "Enable license key checks for pro/enterprise features", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, "movedFeatures": { "title": "Premium Features Distributed", "message": "Premium and Enterprise features are now organized in their respective sections:" @@ -3865,25 +4089,39 @@ "features": { "title": "Features", "description": "Configure optional features and functionality.", - "serverCertificate": "Server Certificate", - "serverCertificate.description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", - "serverCertificate.enabled": "Enable Server Certificate", - "serverCertificate.enabled.description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option", - "serverCertificate.organizationName": "Organization Name", - "serverCertificate.organizationName.description": "Organization name for generated certificates", - "serverCertificate.validity": "Certificate Validity (days)", - "serverCertificate.validity.description": "Number of days the certificate will be valid", - "serverCertificate.regenerateOnStartup": "Regenerate on Startup", - "serverCertificate.regenerateOnStartup.description": "Generate new certificate on each application startup" + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } }, "endpoints": { "title": "API Endpoints", "description": "Control which API endpoints and endpoint groups are available.", "management": "Endpoint Management", - "toRemove": "Disabled Endpoints", - "toRemove.description": "Select individual endpoints to disable", - "groupsToRemove": "Disabled Endpoint Groups", - "groupsToRemove.description": "Select endpoint groups to disable", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." } } @@ -3994,8 +4232,10 @@ "desc": "Remove potentially harmful elements from PDF files.", "submit": "Sanitise PDF", "completed": "Sanitisation completed successfully", - "error.generic": "Sanitisation failed", - "error.failed": "An error occurred while sanitising the PDF.", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, "filenamePrefix": "sanitised", "sanitizationResults": "Sanitisation Results", "steps": { @@ -4009,18 +4249,30 @@ "options": { "title": "Sanitisation Options", "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", - "removeJavaScript": "Remove JavaScript", - "removeJavaScript.desc": "Remove JavaScript actions and scripts from the PDF", - "removeEmbeddedFiles": "Remove Embedded Files", - "removeEmbeddedFiles.desc": "Remove any files embedded within the PDF", - "removeXMPMetadata": "Remove XMP Metadata", - "removeXMPMetadata.desc": "Remove XMP metadata from the PDF", - "removeMetadata": "Remove Document Metadata", - "removeMetadata.desc": "Remove document information metadata (title, author, etc.)", - "removeLinks": "Remove Links", - "removeLinks.desc": "Remove external links and launch actions from the PDF", - "removeFonts": "Remove Fonts", - "removeFonts.desc": "Remove embedded fonts from the PDF" + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } } }, "addPassword": { @@ -4389,34 +4641,6 @@ "undoStorageError": "Undo completed but some files could not be saved to storage", "undoSuccess": "Operation undone successfully", "unsupported": "Unsupported", - "signup": { - "title": "Create an account", - "subtitle": "Join Stirling PDF to get started", - "name": "Name", - "email": "Email", - "password": "Password", - "confirmPassword": "Confirm password", - "enterName": "Enter your name", - "enterEmail": "Enter your email", - "enterPassword": "Enter your password", - "confirmPasswordPlaceholder": "Confirm password", - "or": "or", - "creatingAccount": "Creating Account...", - "signUp": "Sign Up", - "alreadyHaveAccount": "Already have an account? Sign in", - "pleaseFillAllFields": "Please fill in all fields", - "passwordsDoNotMatch": "Passwords do not match", - "passwordTooShort": "Password must be at least 6 characters long", - "invalidEmail": "Please enter a valid email address", - "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", - "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", - "unexpectedError": "Unexpected error: {{message}}", - "useEmailInstead": "Use Email Instead", - "nameRequired": "Name is required", - "emailRequired": "Email is required", - "passwordRequired": "Password is required", - "confirmPasswordRequired": "Please confirm your password" - }, "onboarding": { "welcomeModal": { "title": "Welcome to Stirling PDF!", @@ -4458,8 +4682,10 @@ "loading": "Loading people...", "searchMembers": "Search members...", "addMembers": "Add Members", - "inviteMembers": "Invite Members", - "inviteMembers.subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members.", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, "user": "User", "role": "Role", "team": "Team", diff --git a/frontend/public/locales/en-US/translation.json b/frontend/public/locales/en-US/translation.json index f0b241bf9..2fa6fab55 100644 --- a/frontend/public/locales/en-US/translation.json +++ b/frontend/public/locales/en-US/translation.json @@ -1,7 +1,4 @@ { - "language": { - "direction": "ltr" - }, "toolPanel": { "modePrompt": { "title": "Choose how you browse tools", @@ -16,9 +13,31 @@ "dismiss": "Maybe later" }, "fullscreen": { - "showDetails": "Show Details" + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" } }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", + "language": { + "direction": "ltr" + }, "addPageNumbers": { "fontSize": "Font Size", "fontName": "Font Name", @@ -35,8 +54,26 @@ "customTextDesc": "Custom Text", "numberPagesDesc": "Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc", "customNumberDesc": "Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n}", - "submit": "Add Page Numbers" + "submit": "Add Page Numbers", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Select PDF(s)", "multiPdfPrompt": "Select PDFs (2+)", "multiPdfDropPrompt": "Select (or drag & drop) all PDFs you require", @@ -47,7 +84,6 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Warning: This process can take up to a minute depending on file-size", "pageOrderPrompt": "Custom Page Order (Enter a comma-separated list of page numbers or Functions like 2n+1) :", - "pageSelectionPrompt": "Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :", "goToPage": "Go", "true": "True", "false": "False", @@ -58,13 +94,30 @@ "save": "Save", "saveToBrowser": "Save to Browser", "download": "Download", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", "editYourNewFiles": "Edit your new file(s)", "close": "Close", - "chooseFile": "Choose File", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "{{count}} files selected", "files": { "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size", "placeholder": "Select a PDF file in the main view to get started" }, "noFavourites": "No favorites added", @@ -72,7 +125,6 @@ "bored": "Bored Waiting?", "alphabet": "Alphabet", "downloadPdf": "Download PDF", - "text": "Text", "font": "Font", "selectFillter": "-- Select --", @@ -88,6 +140,7 @@ "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Error", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Sorry for the issue!", "needHelp": "Need help / Found an issue?", "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:", @@ -105,6 +158,7 @@ "warning": { "tooltipTitle": "Warning" }, + "edit": "Edit", "delete": "Delete", "username": "Username", "password": "Password", @@ -116,6 +170,7 @@ "green": "Green", "blue": "Blue", "custom": "Custom...", + "comingSoon": "Coming soon", "WorkInProgess": "Work in progress, May not work or be buggy, Please report any problems!", "poweredBy": "Powered by", "yes": "Yes", @@ -156,6 +211,7 @@ "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Privacy Policy", + "iAgreeToThe": "I agree to all of the", "terms": "Terms and Conditions", "accessibility": "Accessibility", "cookie": "Cookie Policy", @@ -195,6 +251,7 @@ "title": "Do you want make Stirling PDF better?", "paragraph1": "Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.", "paragraph2": "Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.", + "learnMore": "Learn more", "enable": "Enable analytics", "disable": "Disable analytics", "settings": "You can change the settings for analytics in the config/settings.yml file" @@ -238,6 +295,54 @@ "cacheInputs": { "name": "Save form inputs", "help": "Enable to store previously used inputs for future runs" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -309,8 +414,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -325,7 +432,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Database Import/Export", @@ -366,6 +475,16 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { "tags": "multiple,tools", "title": "PDF Multi Tool", @@ -386,15 +505,10 @@ "title": "Rotate", "desc": "Easily rotate your PDFs." }, - "imageToPDF": { - "tags": "convert,image,transform", - "title": "Image to PDF", - "desc": "Convert a image (PNG, JPEG, GIF) to PDF." - }, - "pdfToImage": { - "tags": "convert,image,extract", - "title": "PDF to Image", - "desc": "Convert a PDF to a image. (PNG, JPEG, GIF)" + "convert": { + "tags": "transform,change", + "title": "Convert", + "desc": "Convert files between different formats" }, "pdfOrganiser": { "tags": "organize,rearrange,reorder", @@ -406,31 +520,16 @@ "title": "Add image", "desc": "Adds a image onto a set location on the PDF" }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, "watermark": { "tags": "stamp,mark,overlay", "title": "Add Watermark", "desc": "Add a custom watermark to your PDF document." }, - "permissions": { - "tags": "permissions,security,access", - "title": "Change Permissions", - "desc": "Change the permissions of your PDF document" - }, - "pageRemover": { - "tags": "remove,delete,pages", - "title": "Remove", - "desc": "Delete unwanted pages from your PDF document." - }, - "addPassword": { - "tags": "password,encrypt,secure", - "title": "Add Password", - "desc": "Encrypt your PDF document with a password." - }, - "changePermissions": { - "tags": "permissions,restrictions,security", - "title": "Change Permissions", - "desc": "Change document restrictions and permissions." - }, "removePassword": { "tags": "unlock,remove,password", "title": "Remove Password", @@ -441,11 +540,6 @@ "title": "Compress", "desc": "Compress PDFs to reduce their file size." }, - "sanitize": { - "tags": "clean,purge,remove", - "title": "Sanitize", - "desc": "Remove potentially harmful elements from PDF files." - }, "unlockPDFForms": { "tags": "unlock,enable,edit", "title": "Unlock PDF Forms", @@ -456,11 +550,6 @@ "title": "Change Metadata", "desc": "Change/Remove/Add metadata from a PDF document" }, - "fileToPDF": { - "tags": "convert,transform,change", - "title": "Convert file to PDF", - "desc": "Convert nearly any file to PDF (DOCX, PNG, XLS, PPT, TXT and more)" - }, "ocr": { "tags": "extract,scan", "title": "OCR / Cleanup scans", @@ -471,6 +560,253 @@ "title": "Extract Images", "desc": "Extracts all images from a PDF and saves them to zip" }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Sign", + "desc": "Adds signature to PDF by drawing, text or image" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Flatten", + "desc": "Remove all interactive elements and forms from a PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Sign with Certificate", + "desc": "Signs a PDF with a Certificate/Key (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Repair", + "desc": "Tries to repair a corrupt/broken PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Remove Blank pages", + "desc": "Detects and removes blank pages from a document" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Remove Annotations", + "desc": "Removes all comments/annotations from a PDF" + }, + "compare": { + "tags": "difference", + "title": "Compare", + "desc": "Compares and shows the differences between 2 PDF Documents" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Remove Certificate Sign", + "desc": "Remove certificate signature from PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Multi-Page Layout", + "desc": "Merge multiple pages of a PDF document into a single page" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Adjust page size/scale", + "desc": "Change the size/scale of a page and/or its contents." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Add Page Numbers", + "desc": "Add Page numbers throughout a document in a set location" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Adjust Colors/Contrast", + "desc": "Adjust Colors/Contrast, Saturation and Brightness of a PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Crop PDF", + "desc": "Crop a PDF to reduce its size (maintains text!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Auto Split Pages", + "desc": "Auto Split Scanned PDF with physical scanned page splitter QR Code" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitize", + "desc": "Remove potentially harmful elements from PDF files." + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Get ALL Info on PDF", + "desc": "Grabs any and all information possible on PDFs" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "Single Large Page", + "desc": "Merges all PDF pages into one large single page" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Show Javascript", + "desc": "Searches and displays any JS injected into a PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Remove image", + "desc": "Remove image from PDF to reduce file size" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Split PDF by Chapters", + "desc": "Split a PDF into multiple files based on its chapter structure." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extract Pages", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Remove Pages", + "desc": "Remove specific pages from a PDF document" + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Auto Split by Size/Count", + "desc": "Automatically split PDFs by file size or page count" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Add Password", + "desc": "Encrypt your PDF document with a password.", + "tags": "password,encrypt,secure" + }, + "changePermissions": { + "title": "Change Permissions", + "desc": "Change document restrictions and permissions.", + "tags": "permissions,restrictions,security" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Overlays PDFs on-top of another PDF", + "title": "Overlay PDFs", + "tags": "overlay,combine,stack" + }, + "imageToPDF": { + "tags": "convert,image,transform", + "title": "Image to PDF", + "desc": "Convert a image (PNG, JPEG, GIF) to PDF." + }, + "pdfToImage": { + "tags": "convert,image,extract", + "title": "PDF to Image", + "desc": "Convert a PDF to a image. (PNG, JPEG, GIF)" + }, + "permissions": { + "tags": "permissions,security,access", + "title": "Change Permissions", + "desc": "Change the permissions of your PDF document" + }, + "pageRemover": { + "tags": "remove,delete,pages", + "title": "Remove", + "desc": "Delete unwanted pages from your PDF document." + }, + "fileToPDF": { + "tags": "convert,transform,change", + "title": "Convert file to PDF", + "desc": "Convert nearly any file to PDF (DOCX, PNG, XLS, PPT, TXT and more)" + }, "pdfToPDFA": { "tags": "convert,archive,long-term", "title": "PDF to PDF/A", @@ -506,91 +842,16 @@ "title": "Detect/Split Scanned photos", "desc": "Splits multiple photos from within a photo/PDF" }, - "sign": { - "tags": "signature,autograph", - "title": "Sign", - "desc": "Adds signature to PDF by drawing, text or image" - }, - "flatten": { - "tags": "simplify,remove,interactive", - "title": "Flatten", - "desc": "Remove all interactive elements and forms from a PDF" - }, - "repair": { - "tags": "fix,restore", - "title": "Repair", - "desc": "Tries to repair a corrupt/broken PDF" - }, - "removeBlanks": { - "tags": "delete,clean,empty", - "title": "Remove Blank pages", - "desc": "Detects and removes blank pages from a document" - }, - "removeAnnotations": { - "tags": "delete,clean,strip", - "title": "Remove Annotations", - "desc": "Removes all comments/annotations from a PDF" - }, - "compare": { - "tags": "difference", - "title": "Compare", - "desc": "Compares and shows the differences between 2 PDF Documents" - }, - "certSign": { - "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", - "title": "Sign with Certificate", - "desc": "Signs a PDF with a Certificate/Key (PEM/P12)" - }, - "removeCertSign": { - "tags": "remove,delete,unlock", - "title": "Remove Certificate Sign", - "desc": "Remove certificate signature from PDF" - }, - "pageLayout": { - "tags": "layout,arrange,combine", - "title": "Multi-Page Layout", - "desc": "Merge multiple pages of a PDF document into a single page" - }, - "bookletImposition": { - "tags": "booklet,print,binding", - "title": "Booklet Imposition", - "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" - }, - "scalePages": { - "tags": "resize,adjust,scale", - "title": "Adjust page size/scale", - "desc": "Change the size/scale of a page and/or its contents." - }, "pipeline": { "tags": "automation,script,workflow", "title": "Pipeline", "desc": "Run multiple actions on PDFs by defining pipeline scripts" }, - "addPageNumbers": { - "tags": "number,pagination,count", - "title": "Add Page Numbers", - "desc": "Add Page numbers throughout a document in a set location" - }, "auto-rename": { "tags": "auto-detect,header-based,organize,relabel", "title": "Auto Rename PDF File", "desc": "Auto renames a PDF file based on its detected header" }, - "adjustContrast": { - "tags": "contrast,brightness,saturation", - "title": "Adjust Colors/Contrast", - "desc": "Adjust Colors/Contrast, Saturation and Brightness of a PDF" - }, - "crop": { - "tags": "trim,cut,resize", - "title": "Crop PDF", - "desc": "Crop a PDF to reduce its size (maintains text!)" - }, - "autoSplitPDF": { - "tags": "auto,split,QR", - "title": "Auto Split Pages", - "desc": "Auto Split Scanned PDF with physical scanned page splitter QR Code" - }, "sanitizePDF": { "tags": "clean,purge,remove", "title": "Sanitize", @@ -616,33 +877,15 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "tags": "info,metadata,details", - "title": "Get ALL Info on PDF", - "desc": "Grabs any and all information possible on PDFs" - }, "pageExtracter": { "title": "Extract page(s)", "desc": "Extracts select pages from PDF" }, - "pdfToSinglePage": { - "title": "Single Large Page", - "desc": "Merges all PDF pages into one large single page" - }, - "showJS": { - "title": "Show Javascript", - "desc": "Searches and displays any JS injected into a PDF" - }, "autoRedact": { "tags": "auto,redact,censor", "title": "Auto Redact", "desc": "Auto Redacts(Blacks out) text in a PDF based on input text" }, - "redact": { - "tags": "censor,blackout,hide", - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "tags": "convert,csv,table", "title": "PDF to CSV", @@ -653,11 +896,6 @@ "title": "Auto Split by Size/Count", "desc": "Split a single PDF into multiple documents based on size, page count, or document count" }, - "overlay-pdfs": { - "tags": "overlay,combine,stack", - "title": "Overlay PDFs", - "desc": "Overlays PDFs on-top of another PDF" - }, "split-by-sections": { "tags": "split,sections,divide", "title": "Split PDF by Sections", @@ -668,26 +906,6 @@ "title": "Add Stamp to PDF", "desc": "Add text or add image stamps at set locations" }, - "removeImage": { - "tags": "remove,delete,clean", - "title": "Remove image", - "desc": "Remove image from PDF to reduce file size" - }, - "splitByChapters": { - "tags": "split,chapters,structure", - "title": "Split PDF by Chapters", - "desc": "Split a PDF into multiple files based on its chapter structure." - }, - "validateSignature": { - "tags": "validate,verify,certificate", - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, - "swagger": { - "tags": "API,documentation,test", - "title": "API Documentation", - "desc": "View API documentation and test endpoints" - }, "replace-color": { "tags": "color,replace,invert", "title": "Replace and Invert Color", @@ -731,14 +949,39 @@ "merge": { "tags": "merge,Page operations,Back end,server side", "title": "Merge", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Merge", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "File Name", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Merge multiple PDFs (2+)", "sortByName": "Sort by name", "sortByDate": "Sort by date", - "removeCertSign": "Remove digital signature in the merged file?", - "submit": "Merge" + "removeCertSign": "Remove digital signature in the merged file?" }, "split": { - "tags": "Page operations,divide,Multi Page,cut,server side", "title": "Split PDF", "header": "Split PDF", "desc": { @@ -752,14 +995,297 @@ "8": "Document #6: Page 10" }, "splitPages": "Enter pages to split on:", - "submit": "Split" + "submit": "Split", + "steps": { + "chooseMethod": "Choose Method", + "settings": "Settings" + }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, + "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, + "bySize": { + "name": "File Size", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" + } + }, + "value": { + "fileSize": { + "label": "File Size", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" + } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Page operations,divide,Multi Page,cut,server side" }, "rotate": { - "tags": "server side", "title": "Rotate PDF", + "submit": "Rotate", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "server side", "header": "Rotate PDF", - "selectAngle": "Select rotation angle (in multiples of 90 degrees):", - "submit": "Rotate" + "selectAngle": "Select rotation angle (in multiples of 90 degrees):" + }, + "convert": { + "title": "Convert", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Settings", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Color Type", + "color": "Color", + "greyscale": "Greyscale", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Fill Page", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "The PDF contains a digital signature. This will be removed in the next step.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Greyscale", + "errorConversion": "An error occurred while converting the file.", + "sanitize": { + "submit": "Sanitize PDF", + "completed": "Sanitization completed successfully", + "error": { + "generic": "Sanitization failed", + "failed": "An error occurred while sanitizing the PDF." + }, + "filenamePrefix": "sanitized", + "sanitizationResults": "Sanitization Results", + "steps": { + "files": "Files", + "settings": "Settings", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitization Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + } }, "imageToPdf": { "tags": "conversion,img,jpg,picture,photo" @@ -797,7 +1323,20 @@ "8": "Remove Last", "9": "Remove First and Last", "10": "Odd-Even Merge", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, "desc": { "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", @@ -822,6 +1361,261 @@ "upload": "Add image", "submit": "Add image" }, + "attachments": { + "tags": "attachments,add,remove,embed,file", + "title": "Add Attachments", + "header": "Add Attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add Attachments" + }, + "watermark": { + "title": "Add Watermark", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Add Watermark", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Text", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Font Size", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Color", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colors.", + "bullet1": "Customizable fonts and languages", + "bullet2": "Adjustable colors and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Color Selection", + "text": "Choose a color that provides good contrast with your document content.", + "bullet1": "Light gray (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colors for high contrast", + "bullet3": "Custom colors for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering.", + "bullet1": "Roman/Latin for Western languages", + "bullet2": "Arabic for Arabic script", + "bullet3": "Japanese, Korean, Chinese for Asian languages", + "bullet4": "Thai for Thai script" + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Flatten PDF pages to images for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + }, + "content": { + "header": { + "title": "Content Configuration" + }, + "text": { + "title": "Text Settings", + "text": "Configure your text watermark appearance and language support.", + "bullet1": "Enter your watermark text", + "bullet2": "Adjust font size (8-72pt)", + "bullet3": "Select language/script support", + "bullet4": "Choose custom colors" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text.", + "bullet1": "Roman/Latin for Western languages", + "bullet2": "Arabic for Arabic script", + "bullet3": "Japanese, Korean, Chinese for Asian languages", + "bullet4": "Thai for Thai script" + } + }, + "style": { + "header": { + "title": "Style & Positioning" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + } + }, + "advanced": { + "header": { + "title": "Advanced Options" + }, + "conversion": { + "title": "PDF to Image Conversion", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + }, + "security": { + "title": "Security Considerations", + "text": "Image-based PDFs provide additional protection against unauthorized editing and content extraction." + } + } + }, + "type": { + "1": "Text", + "2": "Image" + }, + "tags": "Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo", + "header": "Add Watermark" + }, "permissions": { "tags": "read,write,edit,print", "title": "Change Permissions", @@ -974,12 +1768,48 @@ "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" }, - "examples": { "title": "Examples" } + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" + } } }, "bulkSelection": { "syntaxError": "There is a syntax issue. See Page Selection tips for help.", - "header": { "title": "Page Selection Guide" }, + "header": { + "title": "Page Selection Guide" + }, "syntax": { "title": "Syntax Basics", "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", @@ -1049,9 +1879,128 @@ } }, "changeMetadata": { - "tags": "Title,author,date,creation,time,publisher,producer,stats", - "title": "Title:", "header": "Change Metadata", + "submit": "Change", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Title,author,date,creation,time,publisher,producer,stats", "selectText": { "1": "Please edit the variables you wish to change", "2": "Delete all metadata", @@ -1059,15 +2008,7 @@ "4": "Other Metadata:", "5": "Add Custom Metadata Entry" }, - "author": "Author:", - "creationDate": "Creation Date (yyyy/MM/dd HH:mm:ss):", - "creator": "Creator:", - "keywords": "Keywords:", - "modDate": "Modification Date (yyyy/MM/dd HH:mm:ss):", - "producer": "Producer:", - "subject": "Subject:", - "trapped": "Trapped:", - "submit": "Change" + "modDate": "Modification Date (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint", @@ -1099,7 +2040,91 @@ }, "help": "Please read this documentation on how to use this for other languages and/or use not in docker", "credit": "This service uses qpdf and Tesseract for OCR.", - "submit": "Process PDF with OCR" + "submit": "Process PDF with OCR", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, + "settings": { + "title": "Settings", + "ocrMode": { + "label": "OCR Mode", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" + }, + "languages": { + "label": "Languages", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" + } + }, + "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, + "mode": { + "title": "OCR Mode", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." + }, + "languages": { + "title": "Languages", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } + } + }, + "error": { + "failed": "OCR operation failed" + } }, "extractImages": { "tags": "picture,photo,save,archive,zip,capture,grab", @@ -1185,16 +2210,53 @@ }, "info": "Python is not installed. It is required to run." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { "title": "Sign", "header": "Sign PDFs", "upload": "Upload Image", - "draw": "Draw Signature", - "text": "Text Input", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Clear", "add": "Add", "saved": "Saved Signatures", "save": "Save Signature", + "applySignatures": "Apply Signatures", "personalSigs": "Personal Signatures", "sharedSigs": "Shared Signatures", "noSavedSigs": "No saved signatures found", @@ -1206,14 +2268,92 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + } }, "flatten": { - "tags": "static,deactivate,non-interactive,streamline", "title": "Flatten", "header": "Flatten PDFs", "flattenOnlyForms": "Flatten only forms", - "submit": "Flatten" + "submit": "Flatten", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "steps": { + "settings": "Settings" + }, + "options": { + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "static,deactivate,non-interactive,streamline" }, "repair": { "tags": "fix,restore,correction,recover", @@ -1233,7 +2373,6 @@ } }, "removeBlanks": { - "tags": "cleanup,streamline,non-content,organize", "title": "Remove Blanks", "header": "Remove Blank Pages", "settings": { @@ -1275,7 +2414,14 @@ "bullet3": "Can be disabled to reduce output file size" } }, - "submit": "Remove blank pages" + "submit": "Remove blank pages", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "cleanup,streamline,non-content,organize" }, "removeAnnotations": { "tags": "comments,highlight,notes,markup,remove", @@ -1323,6 +2469,142 @@ "certSign": { "tags": "authenticate,PEM,P12,official,encrypt", "title": "Certificate Signing", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Enter Your Keystore or Private Key Password (If Any):", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo", "header": "Sign a PDF with your certificate (Work in progress)", "selectPDF": "Select a PDF File for Signing:", "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.", @@ -1330,13 +2612,7 @@ "selectCert": "Select Your Certificate File (X.509 format, could be .pem or .der):", "selectP12": "Select Your PKCS#12 Keystore File (.p12 or .pfx) (Optional, If provided, it should contain your private key and certificate):", "selectJKS": "Select Your Java Keystore File (.jks or .keystore):", - "certType": "Certificate Type", - "password": "Enter Your Keystore or Private Key Password (If Any):", "showSig": "Show Signature", - "reason": "Reason", - "location": "Location", - "name": "Name", - "showLogo": "Show Logo", "submit": "Sign PDF" }, "removeCertSign": { @@ -1363,27 +2639,158 @@ "header": "Multi Page Layout", "pagesPerSheet": "Pages per sheet:", "addBorder": "Add Borders", - "submit": "Submit" + "submit": "Submit", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "booklet,imposition,printing,binding,folding,signature", "title": "Booklet Imposition", "header": "Booklet Imposition", "submit": "Create Booklet", - "files": { + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } }, "error": { "failed": "An error occurred while creating the booklet imposition." - } + }, + "files": {} }, "scalePages": { - "tags": "resize,modify,dimension,adapt", "title": "Adjust page-scale", "header": "Adjust page-scale", "pageSize": "Size of a page of the document.", "keepPageSize": "Original Size", "scaleFactor": "Zoom level (crop) of a page.", - "submit": "Submit" + "submit": "Submit", + "tags": "resize,modify,dimension,adapt" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginate,label,organize,index" @@ -1392,6 +2799,7 @@ "tags": "auto-detect,header-based,organize,relabel", "title": "Auto Rename", "header": "Auto Rename PDF", + "description": "Automatically finds the title from your PDF content and uses it as the filename.", "submit": "Auto Rename", "files": { "placeholder": "Select a PDF file in the main view to get started" @@ -1419,10 +2827,55 @@ "tags": "color-correction,tune,modify,enhance" }, "crop": { - "tags": "trim,shrink,edit,shape", "title": "Crop", "header": "Crop PDF", - "submit": "Submit" + "submit": "Submit", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "trim,shrink,edit,shape" }, "autoSplitPDF": { "tags": "QR-based,separate,scan-segment,organize", @@ -1505,24 +2958,124 @@ "downloadJS": "Download Javascript", "submit": "Show" }, - "autoRedact": { - "tags": "Redact,Hide,black out,black,marker,hidden", - "title": "Auto Redact", - "header": "Auto Redact", - "colorLabel": "Color", - "textsToRedactLabel": "Text to Redact (line-separated)", - "textsToRedactPlaceholder": "e.g. \\nConfidential \\nTop-Secret", - "useRegexLabel": "Use Regex", - "wholeWordSearchLabel": "Whole Word Search", - "customPaddingLabel": "Custom Extra Padding", - "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", - "submitButton": "Submit" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Redact", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Advanced" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Add", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pages", + "placeholder": "(e.g. 1,2,8 or 4,7,12-16 or 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1578,7 +3131,8 @@ "counts": { "label": "Overlay Counts (for Fixed Repeat Mode)", "placeholder": "Enter comma-separated counts (e.g., 2,3,1)", - "item": "Count for file" + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Select Overlay Position", @@ -1619,6 +3173,9 @@ "title": "Counts (Fixed Repeat only)", "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." } }, "split-by-sections": { @@ -1654,7 +3211,18 @@ "customMargin": "Custom Margin", "customColor": "Custom Text Color", "submit": "Submit", - "noStampSelected": "No stamp selected. Return to Step 1." + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Remove Image,Page operations,Back end,server side" @@ -1672,7 +3240,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1699,40 +3268,122 @@ "version": "Version", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Replace-Invert Color PDF", - "selectText": { - "1": "Replace or Invert color Options", - "2": "Default(Default high contrast colors)", - "3": "Custom(Customized colors)", - "4": "Full-Invert(Invert all colors)", - "5": "High contrast color options", - "6": "white text on black background", - "7": "Black text on white background", - "8": "Yellow text on black background", - "9": "Green text on black background", - "10": "Choose text Color", - "11": "Choose background Color" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Replace" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Replace Color,Page operations,Back end,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Sign in", "header": "Sign in", "signin": "Sign in", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Remember me", "invalid": "Invalid username or password.", "locked": "Your account has been locked.", @@ -1751,7 +3402,67 @@ "alreadyLoggedIn": "You are already logged in to", "alreadyLoggedIn2": "devices. Please log out of the devices and try again.", "toManySessions": "You have too many active sessions", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF To Single Page", @@ -1795,15 +3506,55 @@ "contrast": "Contrast:", "brightness": "Brightness:", "saturation": "Saturation:", - "download": "Download" + "download": "Download", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Compress", + "desc": "Compress PDFs to reduce their file size.", "header": "Compress PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "File Size" + }, "credit": "This service uses qpdf for PDF Compress/Optimisation.", "grayscale": { "label": "Apply Grayscale for Compression" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1915,11 +3666,11 @@ "header": "Remove Images", "removeImage": "Remove Images", "submit": "Remove Images", - "results": { - "title": "Remove Images Results" - }, "error": { "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" } }, "splitByChapters": { @@ -1995,83 +3746,857 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "convert": { + "removeMetadata": { + "submit": "Remove Metadata" + }, + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } + }, + "quickAccess": { + "read": "Read", + "sign": "Sign", + "automate": "Automate", "files": "Files", - "selectFilesPlaceholder": "Select files in the main view to get started", - "settings": "Settings", - "conversionCompleted": "Conversion completed", - "results": "Results", - "defaultFilename": "converted_file", - "conversionResults": "Conversion Results", - "converting": "Converting...", - "convertFiles": "Convert Files", - "downloadConverted": "Download Converted File", - "convertFrom": "Convert from", - "convertTo": "Convert to", - "sourceFormatPlaceholder": "Source format", - "targetFormatPlaceholder": "Target format", - "selectSourceFormatFirst": "Select a source format first", - "imageOptions": "Image Options", - "colorType": "Color Type", - "color": "Color", - "greyscale": "Greyscale", - "blackwhite": "Black & White", - "dpi": "DPI", - "output": "Output", - "single": "Single", - "multiple": "Multiple", - "pdfOptions": "PDF Options", - "fitOption": "Fit Option", - "maintainAspectRatio": "Maintain Aspect Ratio", - "fitDocumentToPage": "Fit Document to Page", - "fillPage": "Fill Page", - "autoRotate": "Auto Rotate", - "autoRotateDescription": "Automatically rotate images to better fit the PDF page", - "combineImages": "Combine Images", - "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", - "webOptions": "Web to PDF Options", - "zoomLevel": "Zoom Level", - "emailOptions": "Email to PDF Options", - "includeAttachments": "Include email attachments", - "maxAttachmentSize": "Maximum attachment size (MB)", - "includeAllRecipients": "Include CC and BCC recipients in header", - "downloadHtml": "Download HTML intermediate file instead of PDF", - "pdfaOptions": "PDF/A Options", - "outputFormat": "Output Format", - "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", - "pdfaDigitalSignatureWarning": "The PDF contains a digital signature. This will be removed in the next step.", - "sanitize": { - "submit": "Sanitize PDF", - "completed": "Sanitization completed successfully", - "error.generic": "Sanitization failed", - "error.failed": "An error occurred while sanitizing the PDF.", - "filenamePrefix": "sanitized", - "sanitizationResults": "Sanitization Results", - "steps": { - "files": "Files", - "settings": "Settings", - "results": "Results" + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" }, - "files": { - "placeholder": "Select a PDF file in the main view to get started" + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } }, - "options": { - "title": "Sanitization Options", - "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", - "removeJavaScript": "Remove JavaScript", - "removeJavaScript.desc": "Remove JavaScript actions and scripts from the PDF", - "removeEmbeddedFiles": "Remove Embedded Files", - "removeEmbeddedFiles.desc": "Remove any files embedded within the PDF", - "removeXMPMetadata": "Remove XMP Metadata", - "removeXMPMetadata.desc": "Remove XMP metadata from the PDF", - "removeMetadata": "Remove Document Metadata", - "removeMetadata.desc": "Remove document information metadata (title, author, etc.)", - "removeLinks": "Remove Links", - "removeLinks.desc": "Remove external links and launch actions from the PDF", - "removeFonts": "Remove Fonts", - "removeFonts.desc": "Remove embedded fonts from the PDF" + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, + "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Loading...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" + }, + "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", + "fileName": "Name", + "fileFormat": "Format", + "fileSize": "Size", + "fileVersion": "Version", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", + "download": "Download", + "delete": "Delete", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" + }, + "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", + "submit": "Sanitise PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", + "steps": { + "files": "Files", + "settings": "Settings", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" } } }, @@ -2085,7 +4610,6 @@ "failed": "An error occurred while encrypting the PDF." }, "passwords": { - "title": "Passwords", "stepTitle": "Passwords & Encryption", "completed": "Passwords configured", "user": { @@ -2095,10 +4619,8 @@ "owner": { "label": "Owner Password", "placeholder": "Enter owner password" - } - }, - "permissions": { - "stepTitle": "Document Permissions" + }, + "title": "Passwords" }, "encryption": { "keyLength": { @@ -2132,12 +4654,16 @@ "title": "Change Permissions", "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." } + }, + "permissions": { + "stepTitle": "Document Permissions" } }, "changePermissions": { + "title": "Document Permissions", + "desc": "Change document restrictions and permissions.", "completed": "Permissions changed", "submit": "Change Permissions", - "title": "Document Permissions", "error": { "failed": "An error occurred while changing PDF permissions." }, @@ -2182,257 +4708,6 @@ } } }, - "watermark": { - "tags": "Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo", - "title": "Add Watermark", - "desc": "Add text or image watermarks to PDF files", - "header": "Add Watermark", - "completed": "Watermark added", - "submit": "Add Watermark", - "filenamePrefix": "watermarked", - "error": { - "failed": "An error occurred while adding watermark to the PDF." - }, - "watermarkType": { - "text": "Text", - "image": "Image" - }, - "settings": { - "type": "Watermark Type", - "text": { - "label": "Watermark Text", - "placeholder": "Enter watermark text" - }, - "image": { - "label": "Watermark Image", - "choose": "Choose Image", - "selected": "Selected: {{filename}}" - }, - "fontSize": "Font Size", - "alphabet": "Font/Language", - "color": "Watermark Color", - "rotation": "Rotation (degrees)", - "opacity": "Opacity (%)", - "spacing": { - "horizontal": "Horizontal Spacing", - "vertical": "Vertical Spacing" - }, - "convertToImage": "Flatten PDF pages to images" - }, - "alphabet": { - "roman": "Roman/Latin", - "arabic": "Arabic", - "japanese": "Japanese", - "korean": "Korean", - "chinese": "Chinese", - "thai": "Thai" - }, - "steps": { - "type": "Watermark Type", - "wording": "Wording", - "textStyle": "Style", - "file": "Watermark File", - "formatting": "Formatting" - }, - "results": { - "title": "Watermark Results" - }, - "tooltip": { - "language": { - "title": "Language Support", - "text": "Choose the appropriate language setting to ensure proper font rendering for your text." - }, - "appearance": { - "title": "Appearance Settings", - "text": "Control how your watermark looks and blends with the document.", - "bullet1": "Rotation: -360° to 360° for angled watermarks", - "bullet2": "Opacity: 0-100% for transparency control", - "bullet3": "Lower opacity creates subtle watermarks" - }, - "spacing": { - "title": "Spacing Control", - "text": "Adjust the spacing between repeated watermarks across the page.", - "bullet1": "Width spacing: Horizontal distance between watermarks", - "bullet2": "Height spacing: Vertical distance between watermarks", - "bullet3": "Higher values create more spread out patterns" - }, - "type": { - "header": { - "title": "Watermark Type Selection" - }, - "description": { - "title": "Choose Your Watermark", - "text": "Select between text or image watermarks based on your needs." - }, - "text": { - "title": "Text Watermarks", - "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colors.", - "bullet1": "Customizable fonts and languages", - "bullet2": "Adjustable colors and transparency", - "bullet3": "Ideal for legal or branding text" - }, - "image": { - "title": "Image Watermarks", - "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", - "bullet1": "Upload any image format", - "bullet2": "Maintains image quality", - "bullet3": "Perfect for logos and stamps" - } - }, - "content": { - "header": { - "title": "Content Configuration" - }, - "text": { - "title": "Text Settings", - "text": "Configure your text watermark appearance and language support.", - "bullet1": "Enter your watermark text", - "bullet2": "Adjust font size (8-72pt)", - "bullet3": "Select language/script support", - "bullet4": "Choose custom colors" - }, - "language": { - "title": "Language Support", - "text": "Choose the appropriate language setting to ensure proper font rendering for your text.", - "bullet1": "Roman/Latin for Western languages", - "bullet2": "Arabic for Arabic script", - "bullet3": "Japanese, Korean, Chinese for Asian languages", - "bullet4": "Thai for Thai script" - } - }, - "style": { - "header": { - "title": "Style & Positioning" - }, - "appearance": { - "title": "Appearance Settings", - "text": "Control how your watermark looks and blends with the document.", - "bullet1": "Rotation: -360° to 360° for angled watermarks", - "bullet2": "Opacity: 0-100% for transparency control", - "bullet3": "Lower opacity creates subtle watermarks" - }, - "spacing": { - "title": "Spacing Control", - "text": "Adjust the spacing between repeated watermarks across the page.", - "bullet1": "Width spacing: Horizontal distance between watermarks", - "bullet2": "Height spacing: Vertical distance between watermarks", - "bullet3": "Higher values create more spread out patterns" - } - }, - "wording": { - "header": { - "title": "Text Content" - }, - "text": { - "title": "Watermark Text", - "text": "Enter the text that will appear as your watermark across the document.", - "bullet1": "Keep it concise for better readability", - "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", - "bullet3": "Emoji characters are not supported and will be filtered out" - } - }, - "textStyle": { - "header": { - "title": "Text Style" - }, - "language": { - "title": "Language Support", - "text": "Choose the appropriate language setting to ensure proper font rendering.", - "bullet1": "Roman/Latin for Western languages", - "bullet2": "Arabic for Arabic script", - "bullet3": "Japanese, Korean, Chinese for Asian languages", - "bullet4": "Thai for Thai script" - }, - "color": { - "title": "Color Selection", - "text": "Choose a color that provides good contrast with your document content.", - "bullet1": "Light gray (#d3d3d3) for subtle watermarks", - "bullet2": "Black or dark colors for high contrast", - "bullet3": "Custom colors for branding purposes" - } - }, - "file": { - "header": { - "title": "Image Upload" - }, - "upload": { - "title": "Image Selection", - "text": "Upload an image file to use as your watermark.", - "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", - "bullet2": "PNG with transparency works best", - "bullet3": "Higher resolution images maintain quality better" - }, - "recommendations": { - "title": "Best Practices", - "text": "Tips for optimal image watermark results.", - "bullet1": "Use logos or stamps with transparent backgrounds", - "bullet2": "Simple designs work better than complex images", - "bullet3": "Consider the final document size when choosing resolution" - } - }, - "formatting": { - "header": { - "title": "Formatting & Layout" - }, - "size": { - "title": "Size Control", - "text": "Adjust the size of your watermark (text or image).", - "bullet1": "Larger sizes create more prominent watermarks" - }, - "appearance": { - "title": "Appearance Settings", - "text": "Control how your watermark looks and blends with the document.", - "bullet1": "Rotation: -360° to 360° for angled watermarks", - "bullet2": "Opacity: 0-100% for transparency control", - "bullet3": "Lower opacity creates subtle watermarks" - }, - "spacing": { - "title": "Spacing Control", - "text": "Adjust the spacing between repeated watermarks across the page.", - "bullet1": "Horizontal spacing: Distance between watermarks left to right", - "bullet2": "Vertical spacing: Distance between watermarks top to bottom", - "bullet3": "Higher values create more spread out patterns" - }, - "security": { - "title": "Security Option", - "text": "Flatten PDF pages to images for enhanced security.", - "bullet1": "Prevents text selection and copying", - "bullet2": "Makes watermarks harder to remove", - "bullet3": "Results in larger file sizes", - "bullet4": "Best for sensitive or copyrighted content" - } - }, - "advanced": { - "header": { - "title": "Advanced Options" - }, - "conversion": { - "title": "PDF to Image Conversion", - "text": "Convert the final PDF to an image-based format for enhanced security.", - "bullet1": "Prevents text selection and copying", - "bullet2": "Makes watermarks harder to remove", - "bullet3": "Results in larger file sizes", - "bullet4": "Best for sensitive or copyrighted content" - }, - "security": { - "title": "Security Considerations", - "text": "Image-based PDFs provide additional protection against unauthorized editing and content extraction." - } - } - } - }, - "rightRail": { - "closePdf": "Close PDF", - "closeSelected": "Close Selected Files", - "selectAll": "Select All", - "deselectAll": "Deselect All", - "selectByNumber": "Select by Page Numbers", - "deleteSelected": "Delete Selected Pages", - "toggleTheme": "Toggle Theme", - "exportAll": "Export PDF", - "downloadSelected": "Download Selected Files", - "downloadAll": "Download All" - }, "removePassword": { "title": "Remove Password", "desc": "Remove password protection from your PDF document.", @@ -2455,6 +4730,78 @@ "title": "Decrypted PDFs" } }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, "automation": { "suggested": { "securePdfIngestion": "Secure PDF Ingestion", @@ -2467,8 +4814,66 @@ "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." } }, - "automate": { - "copyToSaved": "Copy to Saved" + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } }, "AddAttachmentsRequest": { "attachments": "Select Attachments", @@ -2480,11 +4885,587 @@ "submit": "Add Attachments", "results": { "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" } }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", "addAttachments": { "error": { "failed": "An error occurred while adding attachments to the PDF." } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or Invert color Options", + "2": "Default(Default high contrast colors)", + "3": "Custom(Customized colors)", + "4": "Full-Invert(Invert all colors)", + "5": "High contrast color options", + "6": "white text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color", + "header": "Replace-Invert Color PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Redact,Hide,black out,black,marker,hidden", + "title": "Auto Redact", + "header": "Auto Redact", + "colorLabel": "Color", + "textsToRedactLabel": "Text to Redact (line-separated)", + "textsToRedactPlaceholder": "e.g. \\nConfidential \\nTop-Secret", + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "submitButton": "Submit" + }, + "replaceColorPdf": { + "tags": "Replace Color,Page operations,Back end,server side" } } diff --git a/frontend/public/locales/es-ES/translation.json b/frontend/public/locales/es-ES/translation.json index b7315b217..266babc32 100644 --- a/frontend/public/locales/es-ES/translation.json +++ b/frontend/public/locales/es-ES/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "Tiene cambios sin guardar en su PDF. ¿Qué le gustaría hacer?", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Cambios sin Guardar", + "keepWorking": "Seguir trabajando", + "discardChanges": "Descartar cambios", + "applyAndContinue": "Aplicar y continuar", + "exportAndContinue": "Exportar y continuar", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Texto personalizado", "numberPagesDesc": "Qué páginas numerar, por defecto 'todas', también acepta 1-5 o 2,5,9 etc", "customNumberDesc": "Por defecto a {n}, también acepta 'Página {n} de {total}', 'Texto-{n}', '{filename}-{n}", - "submit": "Añadir Números de Página" + "submit": "Añadir Números de Página", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Selección personalizada de páginas (Introduzca una lista de números de página separados por comas 1,5,6 o funciones como 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Seleccionar PDF(s)", "multiPdfPrompt": "Seleccionar PDFs (2+)", "multiPdfDropPrompt": "Seleccione (o arrastre y suelte) todos los PDF que necesite", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "son demasiado grandes. El tamaño máximo permitido es", "processTimeWarning": "Advertencia: este proceso puede tardar hasta un minuto dependiendo del tamaño del archivo", "pageOrderPrompt": "Orden personalizado de páginas (Introduzca una lista de números de página separados por coma o funciones como 2n+1):", - "pageSelectionPrompt": "Selección personalizada de páginas (Introduzca una lista de números de página separados por comas 1,5,6 o funciones como 2n+1):", "goToPage": "Ir a página", "true": "Verdadero", "false": "Falso", "unknown": "Desconocido", + "app": { + "description": "La alternativa gratuita a Adobe Acrobat (más de 10 millones de descargas)" + }, "save": "Guardar", "saveToBrowser": "Guardar en el navegador", + "download": "Descargar", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Haga clic para deshacer la última operación y restaurar los archivos originales", + "undo": "Deshacer", + "moreOptions": "Más Opciones", + "editYourNewFiles": "Editar sus nuevos archivos", "close": "Cerrar", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Archivo seleccionado: {{filename}}", + "chooseFile": "Elegir Archivo", "filesSelected": "{{count}} archivos seleccionados", + "files": { + "title": "Archivos", + "upload": "Cargar", + "uploadFiles": "Cargar Archivos", + "addFiles": "Agregar archivos", + "selectFromWorkbench": "Seleccione archivos del área de trabajo o ", + "selectMultipleFromWorkbench": "Seleccione al menos {{count}} archivos del área de trabajo o ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "No se agregaron favoritos", "downloadComplete": "Descarga completada", "bored": "¿Aburrido de esperar?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "El documento PDF está protegido con contraseña y no se ha proporcionado o es incorrecta", + "encryptedPdfMustRemovePassword": "Este PDF está cifrado o protegido con contraseña. Por favor desbloquéelo antes de convertir a PDF/A.", + "incorrectPasswordProvided": "La contraseña del PDF es incorrecta o no fue proporcionada.", "_value": "Error", + "dismissAllErrors": "Descartar Todos los Errores", "sorry": "¡Disculpe por el problema!", "needHelp": "¿Necesita ayuda / Encontró un fallo?", "contactTip": "Si sigue teniendo problemas, no dude en contactarnos para solicitar ayuda. Puede enviar un ticket en nuestra página de GitHub o contactarnos a través de Discord:", @@ -69,11 +152,12 @@ "showStack": "Mostrar seguimiento de pila", "copyStack": "Copiar seguimiento de pila", "githubSubmit": "GitHub - Enviar un ticket", - "discordSubmit": "Discord - Enviar publicación de soporte", - "dismissAllErrors": "Descartar Todos los Errores", - "encryptedPdfMustRemovePassword": "Este PDF está cifrado o protegido con contraseña. Por favor desbloquéelo antes de convertir a PDF/A.", - "incorrectPasswordProvided": "La contraseña del PDF es incorrecta o no fue proporcionada." + "discordSubmit": "Discord - Enviar publicación de soporte" }, + "warning": { + "tooltipTitle": "Advertencia" + }, + "edit": "Editar", "delete": "Borrar", "username": "Nombre de usuario", "password": "Contraseña", @@ -85,7 +169,8 @@ "green": "Verde", "blue": "Azul", "custom": "Personalizado...", - "WorkInProgress": "Tarea en progreso, puede no funcionar o ralentizarse; ¡por favor, informe de cualquier problema!", + "comingSoon": "Próximamente", + "WorkInProgess": "Work in progress, May not work or be buggy, Please report any problems!", "poweredBy": "Desarrollado por", "yes": "Sí", "no": "No", @@ -118,18 +203,19 @@ "page": "Página", "pages": "Páginas", "loading": "Cargando...", + "review": "Revisar", "addToDoc": "Agregar al Documento", "reset": "Restablecer", "apply": "Aplicar", "noFileSelected": "No ha seleccionado ningún archivo. Por favor, cargue uno.", "legal": { "privacy": "Política de Privacidad", + "iAgreeToThe": "Acepto todos los", "terms": "Términos y Condiciones", "accessibility": "Accesibilidad", "cookie": "Política de Cookies", "impressum": "Aviso legal", - "showCookieBanner": "Preferencias de cookies", - "iAgreeToThe": "Acepto todos los" + "showCookieBanner": "Preferencias de cookies" }, "pipeline": { "header": "Menú de automatización (Alfa)", @@ -164,6 +250,7 @@ "title": "¿Quieres mejorar Stirling PDF?", "paragraph1": "Stirling PDF ha optado por analíticas para ayudarnos a mejorar el producto. No rastreamos ninguna información personal ni contenido de archivos.", "paragraph2": "Considere habilitar analíticas para ayudar a Stirling-PDF a crecer y permitirnos comprender mejor a nuestros usuarios.", + "learnMore": "Learn more", "enable": "Habilitar analíticas", "disable": "Deshabilitar analíticas", "settings": "Puede cambiar la configuración de analíticas en el archivo config/settings.yml" @@ -207,6 +294,54 @@ "cacheInputs": { "name": "Guardar entradas del formulario", "help": "Habilitar guardar entradas previamente utilizadas para futuras acciones" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -278,8 +413,10 @@ "top20": "Top 20", "all": "Todas", "refresh": "Refrescar", - "includeHomepage": "Incluir página de inicio ('/')", - "includeLoginPage": "Incluir página de inicio de sesión ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Funciones totales", "totalVisits": "Visitas totales", "showing": "Mostrando", @@ -294,7 +431,9 @@ "top": "Lo más usado", "numberOfVisits": "Número de visitas", "visitsTooltip": "Visitas: {0} ({1}% del total)", - "retry": "Reintentar" + "retry": "Reintentar", + "includeHomepage": "Incluir página de inicio ('/')", + "includeLoginPage": "Incluir página de inicio de sesión ('/login')" }, "database": { "title": "Importar/Exportar base de datos", @@ -335,25 +474,309 @@ "alphabetical": "Alfabético", "globalPopularity": "Las más populares", "sortBy": "Ordenado por:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "múltiple,herramientas", "title": "Multi-herramienta PDF", - "desc": "Combinar, rotar, reorganizar y eliminar páginas", - "tags": "múltiple,herramientas" + "desc": "Combinar, rotar, reorganizar y eliminar páginas" }, "merge": { + "tags": "combinar,unir,juntar", "title": "Unir", - "desc": "Unir fácilmente múltiples PDFs en uno", - "tags": "combinar,unir,juntar" + "desc": "Unir fácilmente múltiples PDFs en uno" }, "split": { + "tags": "dividir,separar,partir", "title": "Dividir", - "desc": "Dividir PDFs en múltiples documentos", - "tags": "dividir,separar,partir" + "desc": "Dividir PDFs en múltiples documentos" }, "rotate": { + "tags": "girar,voltear,orientar", "title": "Rotar", - "desc": "Rotar fácilmente sus PDFs", - "tags": "girar,voltear,orientar" + "desc": "Rotar fácilmente sus PDFs" + }, + "convert": { + "tags": "transformar,cambiar", + "title": "Convertir", + "desc": "Convertir archivos entre diferentes formatos" + }, + "pdfOrganiser": { + "tags": "organizar,reorganizar,reordenar", + "title": "Organizador", + "desc": "Eliminar o reorganizar páginas en cualquier orden" + }, + "addImage": { + "tags": "insertar,incrustar,colocar", + "title": "Agregar imagen al PDF", + "desc": "Agregar una imagen en el PDF en una ubicación establecida (en desarrollo)" + }, + "addAttachments": { + "tags": "incrustar,adjuntar,incluir", + "title": "Agregar Adjuntos", + "desc": "Agregar o eliminar archivos incrustados (adjuntos) a/desde un PDF" + }, + "watermark": { + "tags": "sello,marca,superposición", + "title": "Añadir marca de agua", + "desc": "Agregar marcas de agua de texto o imagen a archivos PDF" + }, + "removePassword": { + "tags": "desbloquear", + "title": "Quitar contraseña", + "desc": "Quitar protección por contraseña del documento PDF" + }, + "compress": { + "tags": "reducir,disminuir,optimizar", + "title": "Comprimir", + "desc": "Comprimir PDFs para reducir el tamaño del archivo" + }, + "unlockPDFForms": { + "tags": "desbloquear,habilitar,editar", + "title": "Desbloquear Formularios PDF", + "desc": "Elimine la propiedad de solo lectura de los campos de formulario en un documento PDF." + }, + "changeMetadata": { + "tags": "editar,modificar,actualizar", + "title": "Cambiar metadatos", + "desc": "Cambiar, eliminar o agregar metadatos del documento PDF" + }, + "ocr": { + "tags": "extraer,escanear", + "title": "Ejecutar OCR en PDF y/o tareas de limpieza", + "desc": "Limpiar escaneos y detectar texto en imágenes dentro de un PDF para volver a agregarlo como texto editable" + }, + "extractImages": { + "tags": "extraer,guardar,exportar", + "title": "Extraer imágenes", + "desc": "Extraer todas las imágenes de un PDF y guardarlas en ZIP" + }, + "scannerImageSplit": { + "tags": "detectar,dividir,fotos", + "title": "Detectar y Dividir Fotos Escaneadas", + "desc": "Detecte y divida fotos escaneadas en páginas separadas" + }, + "sign": { + "tags": "firma,autógrafo", + "title": "Firmar", + "desc": "Añadir firma a PDF mediante dibujo, texto o imagen" + }, + "flatten": { + "tags": "simplificar,eliminar,interactivo", + "title": "Eliminar interactividad", + "desc": "Eliminar todos los elementos interactivos y formularios de un PDF" + }, + "certSign": { + "tags": "autenticar,PEM,P12,oficial,cifrar,firmar,certificado,PKCS12,JKS,servidor,manual,auto", + "title": "Firmar con certificado", + "desc": "Firmar un PDF con certificado/clave digital (PEM/P12)" + }, + "repair": { + "tags": "reparar,restaurar", + "title": "Reparar", + "desc": "Intentar reparar un PDF corrupto/roto" + }, + "removeBlanks": { + "tags": "eliminar,limpiar,vacío", + "title": "Eliminar páginas en blanco", + "desc": "Detectar y eliminar páginas en blanco de un documento" + }, + "removeAnnotations": { + "tags": "eliminar,limpiar,quitar", + "title": "Eliminar Anotaciones", + "desc": "Eliminar todos los comentarios/anotaciones de un PDF" + }, + "compare": { + "tags": "diferencia", + "title": "Comparar", + "desc": "Comparar y mostrar las diferencias entre 2 documentos PDF" + }, + "removeCertSign": { + "tags": "eliminar,borrar,desbloquear", + "title": "Quitar firma de certificado", + "desc": "Eliminar firma de certificado del PDF" + }, + "pageLayout": { + "tags": "diseño,organizar,combinar", + "title": "Diseño de varias páginas", + "desc": "Combinar múltiples páginas de un documento PDF en una sola página" + }, + "bookletImposition": { + "tags": "folleto,imprimir,encuadernación", + "title": "Imposición de Folleto", + "desc": "Crear folletos con ordenamiento de páginas adecuado para impresión y encuadernación" + }, + "scalePages": { + "tags": "redimensionar,ajustar,escalar", + "title": "Escalar/ajustar tamaño de página", + "desc": "Escalar/cambiar el tamaño de una pagina y/o su contenido" + }, + "addPageNumbers": { + "tags": "número,paginación,contar", + "title": "Añadir números de página", + "desc": "Añadir números de página en un documento en una ubicación concreta" + }, + "autoRename": { + "tags": "auto-detectar,basado-en-encabezado,organizar,reetiquetar", + "title": "Renombrar Automáticamente Archivo PDF", + "desc": "Renombra automáticamente un archivo PDF basándose en su encabezado detectado" + }, + "adjustContrast": { + "tags": "contraste,brillo,saturación", + "title": "Ajustar Color/Contraste", + "desc": "Ajustar Contraste, Saturación y Brillo de un PDF" + }, + "crop": { + "tags": "recortar,cortar,redimensionar", + "title": "Recortar PDF", + "desc": "Recortar un PDF para reducir su tamaño (¡conservando el texto!)" + }, + "autoSplitPDF": { + "tags": "auto,dividir,QR", + "title": "Auto Dividir Páginas", + "desc": "Dividir automáticamente PDF escaneado usando códigos QR divisores" + }, + "sanitize": { + "tags": "limpiar,purgar,eliminar", + "title": "Desinfectar", + "desc": "Eliminar elementos potencialmente peligrosos de archivos PDF" + }, + "getPdfInfo": { + "tags": "info,metadatos,detalles", + "title": "Obtener toda la información en PDF", + "desc": "Obtiene toda la información posible de archivos PDF" + }, + "pdfToSinglePage": { + "tags": "combinar,fusionar,individual", + "title": "PDF a una sola página", + "desc": "Unir todas las páginas del PDF en una sola página" + }, + "showJS": { + "tags": "javascript,código,script", + "title": "Mostrar Javascript", + "desc": "Busca y muestra cualquier JS contenido en un PDF" + }, + "redact": { + "tags": "censurar,ocultar,tapar", + "title": "Redactar", + "desc": "Ocultar texto confidencial en PDF" + }, + "splitBySections": { + "tags": "dividir,secciones,separar", + "title": "Dividir PDF por Secciones", + "desc": "Divida cada página de un PDF en secciones horizontales y verticales más pequeñas" + }, + "addStamp": { + "tags": "sello,marca,timbre", + "title": "Agregar Sello a PDF", + "desc": "Agregar sellos de texto o imagen en ubicaciones establecidas" + }, + "removeImage": { + "tags": "eliminar,borrar,limpiar", + "title": "Eliminar imagen", + "desc": "Eliminar imagen del PDF para reducir el tamaño de archivo" + }, + "splitByChapters": { + "tags": "dividir,capítulos,estructura", + "title": "Dividir PDF por capítulos", + "desc": "Divida un PDF en varios archivos según su estructura de capítulos." + }, + "validateSignature": { + "tags": "validar,verificar,certificado", + "title": "Validar firma del PDF", + "desc": "Verificar firmas digitales y certificados en documentos PDF" + }, + "swagger": { + "tags": "API,documentación,prueba", + "title": "Documentación de API", + "desc": "Vea la documentación de la API y pruebe los endpoints" + }, + "scannerEffect": { + "tags": "escanear,simular,crear", + "title": "Efecto de Escáner", + "desc": "Cree un PDF que parezca escaneado" + }, + "editTableOfContents": { + "tags": "marcadores,contenidos,editar", + "title": "Editar Tabla de Contenidos", + "desc": "Agregar o editar marcadores y tabla de contenidos en documentos PDF" + }, + "manageCertificates": { + "tags": "certificados,importar,exportar", + "title": "Administrar Certificados", + "desc": "Importar, exportar o eliminar archivos de certificados digitales utilizados para firmar PDFs." + }, + "read": { + "tags": "ver,abrir,mostrar", + "title": "Leer", + "desc": "Ver y anotar PDFs. Resaltar texto, dibujar o insertar comentarios para revisión y colaboración." + }, + "reorganizePages": { + "tags": "reorganizar,reordenar,organizar", + "title": "Reorganizar Páginas", + "desc": "Reorganice, duplique o elimine páginas PDF con control visual de arrastrar y soltar." + }, + "extractPages": { + "tags": "extraer,seleccionar,copiar", + "title": "Extraer Páginas", + "desc": "Extraer páginas específicas de un documento PDF" + }, + "removePages": { + "tags": "eliminar,extraer,excluir", + "title": "Eliminar", + "desc": "Eliminar páginas no deseadas del documento PDF" + }, + "autoSizeSplitPDF": { + "tags": "auto,dividir,tamaño", + "title": "Auto dividir por tamaño/conteo", + "desc": "Divide un solo PDF en múltiples documentos según su tamaño, número de páginas, o número de documento" + }, + "replaceColor": { + "title": "Reemplazar e Invertir Color", + "desc": "Reemplace o invierta colores en documentos PDF" + }, + "devApi": { + "tags": "API,desarrollo,documentación", + "title": "API", + "desc": "Enlace a la documentación de API" + }, + "devFolderScanning": { + "tags": "automatización,carpeta,escaneo", + "title": "Escaneo Automatizado de Carpetas", + "desc": "Enlace a la guía de escaneo automatizado de carpetas" + }, + "devSsoGuide": { + "title": "Guía de SSO", + "desc": "Enlace a la guía de SSO" + }, + "devAirgapped": { + "title": "Configuración Aislada", + "desc": "Enlace a la guía de configuración aislada" + }, + "addPassword": { + "title": "Proteger con contraseña", + "desc": "Cifrar documento PDF con contraseña" + }, + "changePermissions": { + "title": "Cambiar permisos", + "desc": "Modificar restricciones y permisos del documento" + }, + "automate": { + "tags": "flujo-de-trabajo,secuencia,automatización", + "title": "Automatizar", + "desc": "Crear flujos de trabajo de múltiples pasos encadenando acciones de PDF. Ideal para tareas recurrentes." + }, + "overlay-pdfs": { + "desc": "Superponer PDFs encima de otro PDF", + "title": "Superponer PDFs" }, "imageToPDF": { "title": "Imagen a PDF", @@ -363,21 +786,6 @@ "title": "PDF a Imagen", "desc": "Convertir un PDF a una imagen (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organizador", - "desc": "Eliminar o reorganizar páginas en cualquier orden", - "tags": "organizar,reorganizar,reordenar" - }, - "addImage": { - "title": "Agregar imagen al PDF", - "desc": "Agregar una imagen en el PDF en una ubicación establecida (en desarrollo)", - "tags": "insertar,incrustar,colocar" - }, - "watermark": { - "title": "Añadir marca de agua", - "desc": "Agregar marcas de agua de texto o imagen a archivos PDF", - "tags": "sello,marca,superposición" - }, "permissions": { "title": "Cambiar permisos", "desc": "Cambiar los permisos del documento PDF" @@ -386,44 +794,10 @@ "title": "Eliminar páginas", "desc": "Eliminar páginas no deseadas del documento PDF" }, - "addPassword": { - "title": "Proteger con contraseña", - "desc": "Cifrar documento PDF con contraseña" - }, - "removePassword": { - "title": "Quitar contraseña", - "desc": "Quitar protección por contraseña del documento PDF", - "tags": "desbloquear" - }, - "compress": { - "title": "Comprimir", - "desc": "Comprimir PDFs para reducir el tamaño del archivo", - "tags": "reducir,disminuir,optimizar" - }, - "unlockPDFForms": { - "title": "Desbloquear Formularios PDF", - "desc": "Elimine la propiedad de solo lectura de los campos de formulario en un documento PDF.", - "tags": "desbloquear,habilitar,editar" - }, - "changeMetadata": { - "title": "Cambiar metadatos", - "desc": "Cambiar, eliminar o agregar metadatos del documento PDF", - "tags": "editar,modificar,actualizar" - }, "fileToPDF": { "title": "Convertir archivo a PDF", "desc": "Convertir casi cualquier archivo a PDF (DOCX, PNG, XLS, PPT, TXT y más)" }, - "ocr": { - "title": "Ejecutar OCR en PDF y/o tareas de limpieza", - "desc": "Limpiar escaneos y detectar texto en imágenes dentro de un PDF para volver a agregarlo como texto editable", - "tags": "extraer,escanear" - }, - "extractImages": { - "title": "Extraer imágenes", - "desc": "Extraer todas las imágenes de un PDF y guardarlas en ZIP", - "tags": "extraer,guardar,exportar" - }, "pdfToPDFA": { "title": "Convertir PDF a PDF/A", "desc": "Convertir PDF a PDF/A para almacenamiento a largo plazo y cumplimiento de estándares" @@ -452,84 +826,14 @@ "title": "Detectar/Dividir fotos escaneadas", "desc": "Dividir varias fotos dentro de una foto/PDF" }, - "sign": { - "title": "Firmar", - "desc": "Añadir firma a PDF mediante dibujo, texto o imagen", - "tags": "firma,autógrafo" - }, - "flatten": { - "title": "Eliminar interactividad", - "desc": "Eliminar todos los elementos interactivos y formularios de un PDF", - "tags": "simplificar,eliminar,interactivo" - }, - "repair": { - "title": "Reparar", - "desc": "Intentar reparar un PDF corrupto/roto", - "tags": "reparar,restaurar" - }, - "removeBlanks": { - "title": "Eliminar páginas en blanco", - "desc": "Detectar y eliminar páginas en blanco de un documento", - "tags": "eliminar,limpiar,vacío" - }, - "removeAnnotations": { - "title": "Eliminar Anotaciones", - "desc": "Eliminar todos los comentarios/anotaciones de un PDF", - "tags": "eliminar,limpiar,quitar" - }, - "compare": { - "title": "Comparar", - "desc": "Comparar y mostrar las diferencias entre 2 documentos PDF", - "tags": "diferencia" - }, - "certSign": { - "title": "Firmar con certificado", - "desc": "Firmar un PDF con certificado/clave digital (PEM/P12)", - "tags": "autenticar,PEM,P12,oficial,cifrar,firmar,certificado,PKCS12,JKS,servidor,manual,auto" - }, - "removeCertSign": { - "title": "Quitar firma de certificado", - "desc": "Eliminar firma de certificado del PDF", - "tags": "eliminar,borrar,desbloquear" - }, - "pageLayout": { - "title": "Diseño de varias páginas", - "desc": "Combinar múltiples páginas de un documento PDF en una sola página", - "tags": "diseño,organizar,combinar" - }, - "scalePages": { - "title": "Escalar/ajustar tamaño de página", - "desc": "Escalar/cambiar el tamaño de una pagina y/o su contenido", - "tags": "redimensionar,ajustar,escalar" - }, "pipeline": { "title": "Automatización", "desc": "Ejecutar varias tareas a PDFs definiendo una secuencia de comandos" }, - "addPageNumbers": { - "title": "Añadir números de página", - "desc": "Añadir números de página en un documento en una ubicación concreta", - "tags": "número,paginación,contar" - }, "auto-rename": { "title": "Renombrar archivo automáticamente", "desc": "Renombrar automáticamente un archivo PDF según el encabezamiento detectado" }, - "adjustContrast": { - "title": "Ajustar Color/Contraste", - "desc": "Ajustar Contraste, Saturación y Brillo de un PDF", - "tags": "contraste,brillo,saturación" - }, - "crop": { - "title": "Recortar PDF", - "desc": "Recortar un PDF para reducir su tamaño (¡conservando el texto!)", - "tags": "recortar,cortar,redimensionar" - }, - "autoSplitPDF": { - "title": "Auto Dividir Páginas", - "desc": "Dividir automáticamente PDF escaneado usando códigos QR divisores", - "tags": "auto,dividir,QR" - }, "sanitizePDF": { "title": "Desinfectar", "desc": "Eliminar scripts y otros elementos de los archivos PDF" @@ -550,34 +854,14 @@ "title": "PDF a Markdown", "desc": "Convierte cualquier PDF a Markdown" }, - "getPdfInfo": { - "title": "Obtener toda la información en PDF", - "desc": "Obtiene toda la información posible de archivos PDF", - "tags": "info,metadatos,detalles" - }, "pageExtracter": { "title": "Extraer página(s)", "desc": "Extraer las páginas seleccionadas del PDF" }, - "pdfToSinglePage": { - "title": "PDF a una sola página", - "desc": "Unir todas las páginas del PDF en una sola página", - "tags": "combinar,fusionar,individual" - }, - "showJS": { - "title": "Mostrar Javascript", - "desc": "Busca y muestra cualquier JS contenido en un PDF", - "tags": "javascript,código,script" - }, "autoRedact": { "title": "Auto Redactar", "desc": "Redactar automáticamente (ocultar) texto en un PDF según el texto introducido" }, - "redact": { - "title": "Redactar", - "desc": "Ocultar texto confidencial en PDF", - "tags": "censurar,ocultar,tapar" - }, "PDFToCSV": { "title": "PDF a CSV", "desc": "Extraer Tablas de un PDF convirtiéndolas a CSV" @@ -586,10 +870,6 @@ "title": "Auto dividir por tamaño/conteo", "desc": "Divide un solo PDF en múltiples documentos según su tamaño, número de páginas, o número de documento" }, - "overlay-pdfs": { - "title": "Superponer PDFs", - "desc": "Superponer PDFs encima de otro PDF" - }, "split-by-sections": { "title": "Dividir PDF por Secciones", "desc": "Dividir cada página de un PDF en secciones verticales y horizontales más pequeñas" @@ -598,52 +878,17 @@ "title": "Añadir Sello a PDF", "desc": "Añadir texto o sello de imagen en ubicaciones específicas" }, - "removeImage": { - "title": "Eliminar imagen", - "desc": "Eliminar imagen del PDF para reducir el tamaño de archivo", - "tags": "eliminar,borrar,limpiar" - }, - "splitByChapters": { - "title": "Dividir PDF por capítulos", - "desc": "Divida un PDF en varios archivos según su estructura de capítulos.", - "tags": "dividir,capítulos,estructura" - }, - "validateSignature": { - "title": "Validar firma del PDF", - "desc": "Verificar firmas digitales y certificados en documentos PDF", - "tags": "validar,verificar,certificado" - }, "replace-color": { "title": "Reemplazar e Invertir Color", "desc": "Reemplaza el color del texto y el fondo en el PDF e invierte el color completo del PDF para reducir el tamaño del archivo" }, - "convert": { - "title": "Convertir", - "desc": "Convertir archivos entre diferentes formatos", - "tags": "transformar,cambiar" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Extraer Páginas", - "desc": "Extraer páginas específicas de un documento PDF", - "tags": "extraer,seleccionar,copiar" - }, - "removePages": { - "title": "Eliminar", - "desc": "Eliminar páginas no deseadas del documento PDF", - "tags": "eliminar,extraer,excluir" - }, "removeImagePdf": { "title": "Eliminar imagen", "desc": "Eliminar imagen del PDF> para reducir el tamaño de archivo" }, - "autoSizeSplitPDF": { - "title": "Auto dividir por tamaño/conteo", - "desc": "Divide un solo PDF en múltiples documentos según su tamaño, número de páginas, o número de documento", - "tags": "auto,dividir,tamaño" - }, "adjust-contrast": { "title": "Ajustar Color/Contraste", "desc": "Ajustar Contraste, Saturación y Brillo de un PDF" @@ -652,108 +897,16 @@ "title": "Reemplazar e Invertir Color", "desc": "Reemplaza el color del texto y el fondo en el PDF e invierte el color completo del PDF para reducir el tamaño del archivo" }, - "changePermissions": { - "title": "Cambiar permisos", - "desc": "Modificar restricciones y permisos del documento" - }, - "addAttachments": { - "desc": "Agregar o eliminar archivos incrustados (adjuntos) a/desde un PDF", - "tags": "incrustar,adjuntar,incluir", - "title": "Agregar Adjuntos" - }, - "addStamp": { - "desc": "Agregar sellos de texto o imagen en ubicaciones establecidas", - "tags": "sello,marca,timbre", - "title": "Agregar Sello a PDF" - }, - "autoRename": { - "desc": "Renombra automáticamente un archivo PDF basándose en su encabezado detectado", - "tags": "auto-detectar,basado-en-encabezado,organizar,reetiquetar", - "title": "Renombrar Automáticamente Archivo PDF" - }, - "automate": { - "desc": "Crear flujos de trabajo de múltiples pasos encadenando acciones de PDF. Ideal para tareas recurrentes.", - "tags": "flujo-de-trabajo,secuencia,automatización", - "title": "Automatizar" - }, - "bookletImposition": { - "desc": "Crear folletos con ordenamiento de páginas adecuado para impresión y encuadernación", - "tags": "folleto,imprimir,encuadernación", - "title": "Imposición de Folleto" - }, - "devAirgapped": { - "desc": "Enlace a la guía de configuración aislada", - "title": "Configuración Aislada" - }, - "devApi": { - "desc": "Enlace a la documentación de API", - "tags": "API,desarrollo,documentación", - "title": "API" - }, - "devFolderScanning": { - "desc": "Enlace a la guía de escaneo automatizado de carpetas", - "tags": "automatización,carpeta,escaneo", - "title": "Escaneo Automatizado de Carpetas" - }, - "devSsoGuide": { - "desc": "Enlace a la guía de SSO", - "title": "Guía de SSO" - }, - "editTableOfContents": { - "desc": "Agregar o editar marcadores y tabla de contenidos en documentos PDF", - "tags": "marcadores,contenidos,editar", - "title": "Editar Tabla de Contenidos" - }, - "manageCertificates": { - "desc": "Importar, exportar o eliminar archivos de certificados digitales utilizados para firmar PDFs.", - "tags": "certificados,importar,exportar", - "title": "Administrar Certificados" - }, "overlayPdfs": { "desc": "Superpone PDFs sobre otro PDF", "tags": "superponer,combinar,apilar", "title": "Superponer PDFs" - }, - "read": { - "desc": "Ver y anotar PDFs. Resaltar texto, dibujar o insertar comentarios para revisión y colaboración.", - "tags": "ver,abrir,mostrar", - "title": "Leer" - }, - "reorganizePages": { - "desc": "Reorganice, duplique o elimine páginas PDF con control visual de arrastrar y soltar.", - "tags": "reorganizar,reordenar,organizar", - "title": "Reorganizar Páginas" - }, - "replaceColor": { - "desc": "Reemplace o invierta colores en documentos PDF", - "title": "Reemplazar e Invertir Color" - }, - "sanitize": { - "desc": "Eliminar elementos potencialmente peligrosos de archivos PDF", - "tags": "limpiar,purgar,eliminar", - "title": "Desinfectar" - }, - "scannerEffect": { - "desc": "Cree un PDF que parezca escaneado", - "tags": "escanear,simular,crear", - "title": "Efecto de Escáner" - }, - "scannerImageSplit": { - "desc": "Detecte y divida fotos escaneadas en páginas separadas", - "tags": "detectar,dividir,fotos", - "title": "Detectar y Dividir Fotos Escaneadas" - }, - "splitBySections": { - "desc": "Divida cada página de un PDF en secciones horizontales y verticales más pequeñas", - "tags": "dividir,secciones,separar", - "title": "Dividir PDF por Secciones" - }, - "swagger": { - "desc": "Vea la documentación de la API y pruebe los endpoints", - "tags": "API,documentación,prueba", - "title": "Documentación de API" } }, + "landing": { + "addFiles": "Agregar Archivos", + "uploadFromComputer": "Cargar desde el ordenador" + }, "viewPdf": { "tags": "ver,leer,anotar,texto,imagen", "title": "Ver/Editar PDF", @@ -787,38 +940,39 @@ "merge": { "tags": "Unir,Operaciones de página,Back end,Backend", "title": "Unir", - "header": "Unir múltiples PDFs (2+)", - "sortByName": "Ordenar por nombre", - "sortByDate": "Ordenar por fecha", - "removeCertSign": "¿Eliminar la firma digital en el archivo unido?", + "removeDigitalSignature": { + "label": "¿Eliminar la firma digital en el archivo combinado?", + "tooltip": { + "title": "Eliminar Firma Digital", + "description": "Las firmas digitales se invalidarán al combinar archivos. Marque esto para eliminarlas del PDF combinado final." + } + }, + "generateTableOfContents": { + "label": "¿Generar tabla de contenidos en el archivo combinado?", + "tooltip": { + "title": "Generar Tabla de Contenidos", + "description": "Crea automáticamente una tabla de contenidos seleccionable en el PDF combinado basada en los nombres de archivo originales y los números de página." + } + }, "submit": "Unir", "sortBy": { - "filename": "Nombre de Archivo", - "ascending": "Ascendente", - "dateModified": "Fecha de Modificación", - "descending": "Descendente", "description": "Los archivos se combinarán en el orden en que se seleccionen. Arrastre para reordenar o ordene a continuación.", "label": "Ordenar Por", + "filename": "Nombre de Archivo", + "dateModified": "Fecha de Modificación", + "ascending": "Ascendente", + "descending": "Descendente", "sort": "Ordenar" }, "error": { "failed": "Se produjo un error al combinar los PDF." }, - "generateTableOfContents": { - "tooltip": { - "description": "Crea automáticamente una tabla de contenidos seleccionable en el PDF combinado basada en los nombres de archivo originales y los números de página.", - "title": "Generar Tabla de Contenidos" - } - }, - "removeDigitalSignature": { - "tooltip": { - "description": "Las firmas digitales se invalidarán al combinar archivos. Marque esto para eliminarlas del PDF combinado final.", - "title": "Eliminar Firma Digital" - } - } + "header": "Unir múltiples PDFs (2+)", + "sortByName": "Ordenar por nombre", + "sortByDate": "Ordenar por fecha", + "removeCertSign": "¿Eliminar la firma digital en el archivo unido?" }, "split": { - "tags": "Operaciones de página,dividir,Multi-página,cortar,Backend", "title": "Dividir PDF", "header": "Dividir PDF", "desc": { @@ -834,63 +988,11 @@ "splitPages": "Introducir las páginas para dividir:", "submit": "Dividir", "steps": { - "settings": "Configuración", - "chooseMethod": "Elegir Método" + "chooseMethod": "Elegir Método", + "settings": "Configuración" }, - "methods": { - "bySize": { - "name": "Tamaño de archivo", - "desc": "Limitar tamaño máximo de archivo", - "tooltip": "Especificar tamaño máximo de archivo (ej. 10MB, 500KB)" - }, - "byChapters": { - "desc": "Dividir en límites de marcadores", - "name": "Capítulos", - "tooltip": "Usa marcadores de PDF para determinar puntos de división" - }, - "byDocCount": { - "desc": "Crear número específico de archivos", - "name": "Cantidad de Documentos", - "tooltip": "Ingrese cuántos archivos desea crear" - }, - "byPageCount": { - "desc": "Páginas fijas por archivo", - "name": "Cantidad de Páginas", - "tooltip": "Ingrese el número de páginas para cada archivo dividido" - }, - "byPageDivider": { - "desc": "División automática con hojas divisoras", - "name": "Divisor de Páginas", - "tooltip": "Use hojas divisoras con código QR entre documentos al escanear" - }, - "byPages": { - "desc": "Extraer páginas específicas (1,3,5-10)", - "name": "Números de Página", - "tooltip": "Ingrese números de página separados por comas o rangos con guiones" - }, - "bySections": { - "desc": "Dividir páginas en secciones de cuadrícula", - "name": "Secciones", - "tooltip": "Dividir cada página en secciones horizontales y verticales" - }, - "prefix": { - "splitAt": "Dividir en", - "splitBy": "Dividir por" - } - }, - "value": { - "fileSize": { - "label": "Tamaño de archivo", - "placeholder": "ej. 10MB, 500KB" - }, - "docCount": { - "label": "Número de Archivos", - "placeholder": "ej. 3, 5" - }, - "pageCount": { - "label": "Páginas por Archivo", - "placeholder": "ej. 5, 10" - } + "settings": { + "selectMethodFirst": "Por favor, seleccione primero un método de división" }, "error": { "failed": "Se produjo un error al dividir el PDF." @@ -899,56 +1001,144 @@ "label": "Elegir método de división", "placeholder": "Seleccione cómo dividir el PDF" }, - "settings": { - "selectMethodFirst": "Por favor, seleccione primero un método de división" - }, - "tooltip": { - "byChapters": { - "bullet1": "Nivel de Marcador: En qué nivel dividir (1=nivel superior)", - "bullet2": "Incluir Metadatos: Preservar propiedades del documento", - "bullet3": "Permitir Duplicados: Manejar nombres de marcadores repetidos", - "text": "Use marcadores de PDF para dividir automáticamente en límites de capítulos. Requiere PDFs con estructura de marcadores.", - "title": "Dividir por Capítulos" - }, - "byCount": { - "bullet1": "Cantidad de Páginas: Número fijo de páginas por archivo", - "bullet2": "Cantidad de Documentos: Número fijo de archivos de salida", - "bullet3": "Útil para flujos de trabajo de procesamiento por lotes", - "text": "Crear múltiples PDFs con un número específico de páginas o documentos cada uno.", - "title": "Dividir por Cantidad" + "methods": { + "prefix": { + "splitAt": "Dividir en", + "splitBy": "Dividir por" }, "byPages": { - "bullet1": "Puntos de división únicos: 3,7 (divide después de las páginas 3 y 7)", - "bullet2": "Puntos de división por rango: 3-8 (divide antes de la página 3 y después de la página 8)", - "bullet3": "Mixto: 2,5-10,15 (divide después de la página 2, antes de la página 5, después de la página 10 y después de la página 15)", - "text": "Divida su PDF en números de página específicos. Usar 'n' divide después de la página n. Usar 'n-m' divide antes de la página n y después de la página m.", - "title": "Dividir en Números de Página" + "name": "Números de Página", + "desc": "Extraer páginas específicas (1,3,5-10)", + "tooltip": "Ingrese números de página separados por comas o rangos con guiones" }, "bySections": { - "bullet1": "Horizontal: Número de filas a crear", - "bullet2": "Vertical: Número de columnas a crear", - "bullet3": "Combinar: Unir todas las secciones en un PDF", - "text": "Divida cada página en una cuadrícula de secciones. Útil para dividir documentos con múltiples columnas o extraer áreas específicas.", - "title": "Dividir por Secciones de Cuadrícula" + "name": "Secciones", + "desc": "Dividir páginas en secciones de cuadrícula", + "tooltip": "Dividir cada página en secciones horizontales y verticales" }, "bySize": { - "bullet1": "Use MB para archivos más grandes (ej. 10MB)", - "bullet2": "Use KB para archivos más pequeños (ej. 500KB)", - "bullet3": "El sistema dividirá en límites de página", - "text": "Crear múltiples PDFs que no excedan un tamaño de archivo especificado. Ideal para limitaciones de tamaño de archivo o archivos adjuntos de correo electrónico.", - "title": "Dividir por Tamaño de Archivo" + "name": "Tamaño de archivo", + "desc": "Limitar tamaño máximo de archivo", + "tooltip": "Especificar tamaño máximo de archivo (ej. 10MB, 500KB)" }, + "byPageCount": { + "name": "Cantidad de Páginas", + "desc": "Páginas fijas por archivo", + "tooltip": "Ingrese el número de páginas para cada archivo dividido" + }, + "byDocCount": { + "name": "Cantidad de Documentos", + "desc": "Crear número específico de archivos", + "tooltip": "Ingrese cuántos archivos desea crear" + }, + "byChapters": { + "name": "Capítulos", + "desc": "Dividir en límites de marcadores", + "tooltip": "Usa marcadores de PDF para determinar puntos de división" + }, + "byPageDivider": { + "name": "Divisor de Páginas", + "desc": "División automática con hojas divisoras", + "tooltip": "Use hojas divisoras con código QR entre documentos al escanear" + } + }, + "value": { + "fileSize": { + "label": "Tamaño de archivo", + "placeholder": "ej. 10MB, 500KB" + }, + "pageCount": { + "label": "Páginas por Archivo", + "placeholder": "ej. 5, 10" + }, + "docCount": { + "label": "Número de Archivos", + "placeholder": "ej. 3, 5" + } + }, + "tooltip": { "header": { "title": "Resumen de Métodos de División" + }, + "byPages": { + "title": "Dividir en Números de Página", + "text": "Divida su PDF en números de página específicos. Usar 'n' divide después de la página n. Usar 'n-m' divide antes de la página n y después de la página m.", + "bullet1": "Puntos de división únicos: 3,7 (divide después de las páginas 3 y 7)", + "bullet2": "Puntos de división por rango: 3-8 (divide antes de la página 3 y después de la página 8)", + "bullet3": "Mixto: 2,5-10,15 (divide después de la página 2, antes de la página 5, después de la página 10 y después de la página 15)" + }, + "bySections": { + "title": "Dividir por Secciones de Cuadrícula", + "text": "Divida cada página en una cuadrícula de secciones. Útil para dividir documentos con múltiples columnas o extraer áreas específicas.", + "bullet1": "Horizontal: Número de filas a crear", + "bullet2": "Vertical: Número de columnas a crear", + "bullet3": "Combinar: Unir todas las secciones en un PDF" + }, + "bySize": { + "title": "Dividir por Tamaño de Archivo", + "text": "Crear múltiples PDFs que no excedan un tamaño de archivo especificado. Ideal para limitaciones de tamaño de archivo o archivos adjuntos de correo electrónico.", + "bullet1": "Use MB para archivos más grandes (ej. 10MB)", + "bullet2": "Use KB para archivos más pequeños (ej. 500KB)", + "bullet3": "El sistema dividirá en límites de página" + }, + "byCount": { + "title": "Dividir por Cantidad", + "text": "Crear múltiples PDFs con un número específico de páginas o documentos cada uno.", + "bullet1": "Cantidad de Páginas: Número fijo de páginas por archivo", + "bullet2": "Cantidad de Documentos: Número fijo de archivos de salida", + "bullet3": "Útil para flujos de trabajo de procesamiento por lotes" + }, + "byChapters": { + "title": "Dividir por Capítulos", + "text": "Use marcadores de PDF para dividir automáticamente en límites de capítulos. Requiere PDFs con estructura de marcadores.", + "bullet1": "Nivel de Marcador: En qué nivel dividir (1=nivel superior)", + "bullet2": "Incluir Metadatos: Preservar propiedades del documento", + "bullet3": "Permitir Duplicados: Manejar nombres de marcadores repetidos" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" } - } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operaciones de página,dividir,Multi-página,cortar,Backend" }, "rotate": { - "tags": "Backend", "title": "Rotar PDF", - "header": "Rotar PDF", - "selectAngle": "Seleccionar ángulo de rotación (en múltiplos de 90 grados):", "submit": "Rotar", + "selectRotation": "Select Rotation Angle (Clockwise)", "error": { "failed": "Se produjo un error al rotar el PDF." }, @@ -958,17 +1148,89 @@ "rotateLeft": "Rotar en sentido antihorario", "rotateRight": "Rotar en sentido horario", "tooltip": { - "controls": { - "text": "Use los botones de rotación para ajustar la orientación. El botón izquierdo rota en sentido antihorario, el botón derecho rota en sentido horario. Cada clic rota 90 grados.", - "title": "Controles" + "header": { + "title": "Resumen de Configuración de Rotación" }, "description": { "text": "Rote las páginas de su PDF en sentido horario o antihorario en incrementos de 90 grados. Todas las páginas del PDF se rotarán. La vista previa muestra cómo se verá su documento después de la rotación." }, - "header": { - "title": "Resumen de Configuración de Rotación" + "controls": { + "title": "Controles", + "text": "Use los botones de rotación para ajustar la orientación. El botón izquierdo rota en sentido antihorario, el botón derecho rota en sentido horario. Cada clic rota 90 grados." } - } + }, + "tags": "Backend", + "header": "Rotar PDF", + "selectAngle": "Seleccionar ángulo de rotación (en múltiplos de 90 grados):" + }, + "convert": { + "title": "Convertir", + "desc": "Convertir archivos entre diferentes formatos", + "files": "Archivos", + "selectFilesPlaceholder": "Seleccione archivos en la vista principal para comenzar", + "settings": "Configuración", + "conversionCompleted": "Conversión completada", + "results": "Resultados", + "defaultFilename": "archivo_convertido", + "conversionResults": "Resultados de Conversión", + "convertFrom": "Convertir desde", + "convertTo": "Convertir a", + "sourceFormatPlaceholder": "Formato de origen", + "targetFormatPlaceholder": "Formato de destino", + "selectSourceFormatFirst": "Seleccione primero un formato de origen", + "outputOptions": "Opciones de Salida", + "pdfOptions": "Opciones de PDF", + "imageOptions": "Opciones de Imagen", + "colorType": "Tipo de Color", + "color": "Color", + "greyscale": "Escala de grises", + "blackwhite": "Blanco y Negro", + "dpi": "DPI", + "output": "Salida", + "single": "Individual", + "multiple": "Múltiple", + "fitOption": "Opción de Ajuste", + "maintainAspectRatio": "Mantener Relación de Aspecto", + "fitDocumentToPage": "Ajustar Documento a Página", + "fillPage": "Ocupar toda la página", + "autoRotate": "Rotación Automática", + "autoRotateDescription": "Rotar automáticamente las imágenes para ajustarse mejor a la página PDF", + "combineImages": "Combinar Imágenes", + "combineImagesDescription": "Combinar todas las imágenes en un PDF, o crear PDFs separados para cada imagen", + "webOptions": "Opciones de Web a PDF", + "zoomLevel": "Nivel de Zoom", + "emailOptions": "Opciones de Correo Electrónico a PDF", + "includeAttachments": "Incluir archivos adjuntos de correo electrónico", + "maxAttachmentSize": "Tamaño máximo de archivo adjunto (MB)", + "includeAllRecipients": "Incluir destinatarios CC y BCC en el encabezado", + "downloadHtml": "Descargar archivo intermedio HTML en lugar de PDF", + "pdfaOptions": "Opciones de PDF/A", + "outputFormat": "Formato de Salida", + "pdfaNote": "PDF/A-1b es más compatible, PDF/A-2b soporta más funciones.", + "pdfaDigitalSignatureWarning": "El PDF contiene una firma digital. Ésta se eliminará en el siguiente paso.", + "fileFormat": "Formato de Archivo", + "wordDoc": "Documento de Word", + "wordDocExt": "Documento de Word (.docx)", + "odtExt": "Texto OpenDocument (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "Presentación OpenDocument (.odp)", + "txtExt": "Texto Plano (.txt)", + "rtfExt": "Formato de Texto Enriquecido (.rtf)", + "selectedFiles": "Archivos seleccionados", + "noFileSelected": "No se seleccionó ningún archivo. Use el panel de archivos para agregar archivos.", + "convertFiles": "Convertir Archivos", + "converting": "Convirtiendo...", + "downloadConverted": "Descargar Archivo Convertido", + "errorNoFiles": "Por favor seleccione al menos un archivo para convertir.", + "errorNoFormat": "Por favor seleccione los formatos de origen y destino.", + "errorNotSupported": "La conversión de {{from}} a {{to}} no está soportada.", + "images": "Imágenes", + "officeDocs": "Documentos de Office (Word, Excel, PowerPoint)", + "imagesExt": "Imágenes (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Texto/RTF", + "grayscale": "Escala de grises", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversión,img,jpg,imagen,fotografía" @@ -1006,22 +1268,35 @@ "8": "Quitar última", "9": "Quitar primera y última", "10": "Unir impar-par", - "11": "Duplicar todas las páginas" + "11": "Duplicar todas las páginas", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, - "placeholder": "(por ejemplo, 1,3,2 o 4-8,2,10-12 o 2n-1)", "desc": { - "BOOKLET_SORT": "Organice páginas para impresión de folletos (última, primera, segunda, penúltima, …).", "CUSTOM": "Use una secuencia personalizada de números de página o expresiones para definir un nuevo orden.", - "DUPLEX_SORT": "Intercale frentes y luego reversos como si un escáner dúplex escaneara todos los frentes y luego todos los reversos (1, n, 2, n-1, …).", - "DUPLICATE": "Duplique cada página según el recuento de orden personalizado (por ejemplo, 4 duplica cada página 4 veces).", - "ODD_EVEN_MERGE": "Combine dos PDF alternando páginas: impares del primero, pares del segundo.", - "ODD_EVEN_SPLIT": "Divida el documento en dos salidas: todas las páginas impares y todas las páginas pares.", - "REMOVE_FIRST": "Elimine la primera página del documento.", - "REMOVE_FIRST_AND_LAST": "Elimine tanto la primera como la última página del documento.", - "REMOVE_LAST": "Elimine la última página del documento.", "REVERSE_ORDER": "Voltee el documento para que la última página sea la primera y así sucesivamente.", - "SIDE_STITCH_BOOKLET_SORT": "Organice páginas para impresión de folletos con costura lateral (optimizado para encuadernación por el lado)." - } + "DUPLEX_SORT": "Intercale frentes y luego reversos como si un escáner dúplex escaneara todos los frentes y luego todos los reversos (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Organice páginas para impresión de folletos (última, primera, segunda, penúltima, …).", + "SIDE_STITCH_BOOKLET_SORT": "Organice páginas para impresión de folletos con costura lateral (optimizado para encuadernación por el lado).", + "ODD_EVEN_SPLIT": "Divida el documento en dos salidas: todas las páginas impares y todas las páginas pares.", + "ODD_EVEN_MERGE": "Combine dos PDF alternando páginas: impares del primero, pares del segundo.", + "DUPLICATE": "Duplique cada página según el recuento de orden personalizado (por ejemplo, 4 duplica cada página 4 veces).", + "REMOVE_FIRST": "Elimine la primera página del documento.", + "REMOVE_LAST": "Elimine la última página del documento.", + "REMOVE_FIRST_AND_LAST": "Elimine tanto la primera como la última página del documento." + }, + "placeholder": "(por ejemplo, 1,3,2 o 4-8,2,10-12 o 2n-1)" }, "addImage": { "tags": "img,jpg,imagen,fotografía", @@ -1031,9 +1306,198 @@ "upload": "Añadir imagen", "submit": "Enviar imagen" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Añadir archivo adjunto", + "remove": "Eliminar archivo adjunto", + "embed": "Incrustar archivo adjunto", + "submit": "Add attachments" + }, "watermark": { - "tags": "Texto,repetir,etiquetar,propietario,copyright,marca comercial,img,jpg,imagen,fotografía", "title": "Añadir marca de agua", + "desc": "Añadir marcas de agua de texto o imagen a archivos PDF", + "completed": "Marca de agua añadida", + "submit": "Añadir marca de agua", + "filenamePrefix": "con_marca_de_agua", + "error": { + "failed": "Se produjo un error al añadir la marca de agua al PDF." + }, + "watermarkType": { + "text": "Texto", + "image": "Imagen" + }, + "settings": { + "type": "Tipo de Marca de Agua", + "text": { + "label": "Texto de Marca de Agua", + "placeholder": "Ingrese texto de marca de agua" + }, + "image": { + "label": "Imagen de Marca de Agua", + "choose": "Elegir Imagen", + "selected": "Seleccionado: {{filename}}" + }, + "fontSize": "Tamaño de fuente", + "size": "Tamaño", + "alphabet": "Fuente/Idioma", + "color": "Color de Marca de Agua", + "rotation": "Rotación (grados)", + "opacity": "Opacidad (%)", + "spacing": { + "horizontal": "Espaciado Horizontal", + "vertical": "Espaciado Vertical", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Aplanar páginas de PDF en imágenes" + }, + "alphabet": { + "roman": "Romano/Latino", + "arabic": "Árabe", + "japanese": "Japonés", + "korean": "Coreano", + "chinese": "Chino", + "thai": "Tailandés" + }, + "steps": { + "type": "Tipo de Marca de Agua", + "wording": "Texto", + "textStyle": "Estilo", + "formatting": "Formato", + "file": "Archivo de Marca de Agua" + }, + "results": { + "title": "Resultados de Marca de Agua" + }, + "tooltip": { + "language": { + "title": "Soporte de Idioma", + "text": "Elija la configuración de idioma apropiada para asegurar una representación correcta de la fuente para su texto." + }, + "appearance": { + "title": "Configuración de Apariencia", + "text": "Controle cómo se ve su marca de agua y se mezcla con el documento.", + "bullet1": "Rotación: -360° a 360° para marcas de agua anguladas", + "bullet2": "Opacidad: 0-100% para control de transparencia", + "bullet3": "Una opacidad más baja crea marcas de agua sutiles" + }, + "spacing": { + "title": "Control de Espaciado", + "text": "Ajuste el espaciado entre marcas de agua repetidas en la página.", + "bullet1": "Espaciado de ancho: Distancia horizontal entre marcas de agua", + "bullet2": "Espaciado de altura: Distancia vertical entre marcas de agua", + "bullet3": "Valores más altos crean patrones más espaciados" + }, + "type": { + "header": { + "title": "Selección de Tipo de Marca de Agua" + }, + "description": { + "title": "Elija su Marca de Agua", + "text": "Seleccione entre marcas de agua de texto o imagen según sus necesidades." + }, + "text": { + "title": "Marcas de Agua de Texto", + "text": "Perfecto para añadir avisos de derechos de autor, nombres de empresas o etiquetas de confidencialidad. Admite múltiples idiomas y colores personalizados.", + "bullet1": "Fuentes e idiomas personalizables", + "bullet2": "Colores y transparencia ajustables", + "bullet3": "Ideal para texto legal o de marca" + }, + "image": { + "title": "Marcas de Agua de Imagen", + "text": "Use logos, sellos o cualquier imagen como marca de agua. Excelente para marca e identificación visual.", + "bullet1": "Cargue cualquier formato de imagen", + "bullet2": "Mantiene la calidad de la imagen", + "bullet3": "Perfecto para logos y sellos" + } + }, + "wording": { + "header": { + "title": "Contenido de Texto" + }, + "text": { + "title": "Texto de Marca de Agua", + "text": "Ingrese el texto que aparecerá como su marca de agua en todo el documento.", + "bullet1": "Manténgalo conciso para mejor legibilidad", + "bullet2": "Ejemplos comunes: 'CONFIDENCIAL', 'BORRADOR', nombre de la empresa", + "bullet3": "No se admiten caracteres emoji y se filtrarán" + } + }, + "textStyle": { + "header": { + "title": "Estilo de Texto" + }, + "color": { + "title": "Selección de Color", + "text": "Elija un color que proporcione buen contraste con el contenido de su documento.", + "bullet1": "Gris claro (#d3d3d3) para marcas de agua sutiles", + "bullet2": "Negro o colores oscuros para alto contraste", + "bullet3": "Colores personalizados para fines de marca" + }, + "language": { + "title": "Soporte de Idioma", + "text": "Elija la configuración de idioma apropiada para asegurar una representación correcta de la fuente." + } + }, + "file": { + "header": { + "title": "Carga de Imagen" + }, + "upload": { + "title": "Selección de Imagen", + "text": "Cargue un archivo de imagen para usar como su marca de agua.", + "bullet1": "Admite formatos comunes: PNG, JPG, GIF, BMP", + "bullet2": "PNG con transparencia funciona mejor", + "bullet3": "Las imágenes de mayor resolución mantienen mejor la calidad" + }, + "recommendations": { + "title": "Mejores Prácticas", + "text": "Consejos para obtener resultados óptimos de marcas de agua de imagen.", + "bullet1": "Use logos o sellos con fondos transparentes", + "bullet2": "Los diseños simples funcionan mejor que las imágenes complejas", + "bullet3": "Considere el tamaño final del documento al elegir la resolución" + } + }, + "formatting": { + "header": { + "title": "Formato y Diseño" + }, + "size": { + "title": "Control de Tamaño", + "text": "Ajuste el tamaño de su marca de agua (texto o imagen).", + "bullet1": "Los tamaños más grandes crean marcas de agua más prominentes" + }, + "appearance": { + "title": "Configuración de Apariencia", + "text": "Controle cómo se ve su marca de agua y se mezcla con el documento.", + "bullet1": "Rotación: -360° a 360° para marcas de agua anguladas", + "bullet2": "Opacidad: 0-100% para control de transparencia", + "bullet3": "Una opacidad más baja crea marcas de agua sutiles" + }, + "spacing": { + "title": "Control de Espaciado", + "text": "Ajuste el espaciado entre marcas de agua repetidas en la página.", + "bullet1": "Espaciado horizontal: Distancia entre marcas de agua de izquierda a derecha", + "bullet2": "Espaciado vertical: Distancia entre marcas de agua de arriba a abajo", + "bullet3": "Valores más altos crean patrones más espaciados" + }, + "security": { + "title": "Opción de Seguridad", + "text": "Convertir el PDF final a un formato basado en imágenes para mayor seguridad.", + "bullet1": "Evita la selección y copia de texto", + "bullet2": "Hace que las marcas de agua sean más difíciles de eliminar", + "bullet3": "Resulta en tamaños de archivo más grandes", + "bullet4": "Mejor para contenido sensible o protegido por derechos de autor" + } + } + }, + "type": { + "1": "Texto", + "2": "Imagen" + }, + "tags": "Texto,repetir,etiquetar,propietario,copyright,marca comercial,img,jpg,imagen,fotografía", "header": "Añadir marca de agua", "customColor": "Personalizar color de texto", "selectText": { @@ -1047,184 +1511,6 @@ "8": "Tipo de marca de agua:", "9": "Imagen de marca de agua:", "10": "Convertir PDF a imagen PDF" - }, - "submit": "Añadir marca de agua", - "type": { - "1": "Texto", - "2": "Imagen" - }, - "watermarkType": { - "text": "Texto", - "image": "Imagen" - }, - "settings": { - "fontSize": "Tamaño de fuente", - "alphabet": "Fuente/Idioma", - "color": "Color de Marca de Agua", - "convertToImage": "Aplanar páginas de PDF en imágenes", - "image": { - "choose": "Elegir Imagen", - "label": "Imagen de Marca de Agua", - "selected": "Seleccionado: {{filename}}" - }, - "opacity": "Opacidad (%)", - "rotation": "Rotación (grados)", - "size": "Tamaño", - "spacing": { - "horizontal": "Espaciado Horizontal", - "vertical": "Espaciado Vertical" - }, - "text": { - "label": "Texto de Marca de Agua", - "placeholder": "Ingrese texto de marca de agua" - }, - "type": "Tipo de Marca de Agua" - }, - "alphabet": { - "arabic": "Árabe", - "chinese": "Chino", - "japanese": "Japonés", - "korean": "Coreano", - "roman": "Romano/Latino", - "thai": "Tailandés" - }, - "completed": "Marca de agua añadida", - "desc": "Añadir marcas de agua de texto o imagen a archivos PDF", - "error": { - "failed": "Se produjo un error al añadir la marca de agua al PDF." - }, - "filenamePrefix": "con_marca_de_agua", - "results": { - "title": "Resultados de Marca de Agua" - }, - "steps": { - "file": "Archivo de Marca de Agua", - "formatting": "Formato", - "textStyle": "Estilo", - "type": "Tipo de Marca de Agua", - "wording": "Texto" - }, - "tooltip": { - "appearance": { - "bullet1": "Rotación: -360° a 360° para marcas de agua anguladas", - "bullet2": "Opacidad: 0-100% para control de transparencia", - "bullet3": "Una opacidad más baja crea marcas de agua sutiles", - "text": "Controle cómo se ve su marca de agua y se mezcla con el documento.", - "title": "Configuración de Apariencia" - }, - "file": { - "header": { - "title": "Carga de Imagen" - }, - "recommendations": { - "bullet1": "Use logos o sellos con fondos transparentes", - "bullet2": "Los diseños simples funcionan mejor que las imágenes complejas", - "bullet3": "Considere el tamaño final del documento al elegir la resolución", - "text": "Consejos para obtener resultados óptimos de marcas de agua de imagen.", - "title": "Mejores Prácticas" - }, - "upload": { - "bullet1": "Admite formatos comunes: PNG, JPG, GIF, BMP", - "bullet2": "PNG con transparencia funciona mejor", - "bullet3": "Las imágenes de mayor resolución mantienen mejor la calidad", - "text": "Cargue un archivo de imagen para usar como su marca de agua.", - "title": "Selección de Imagen" - } - }, - "formatting": { - "appearance": { - "bullet1": "Rotación: -360° a 360° para marcas de agua anguladas", - "bullet2": "Opacidad: 0-100% para control de transparencia", - "bullet3": "Una opacidad más baja crea marcas de agua sutiles", - "text": "Controle cómo se ve su marca de agua y se mezcla con el documento.", - "title": "Configuración de Apariencia" - }, - "header": { - "title": "Formato y Diseño" - }, - "security": { - "bullet1": "Evita la selección y copia de texto", - "bullet2": "Hace que las marcas de agua sean más difíciles de eliminar", - "bullet3": "Resulta en tamaños de archivo más grandes", - "bullet4": "Mejor para contenido sensible o protegido por derechos de autor", - "text": "Convertir el PDF final a un formato basado en imágenes para mayor seguridad.", - "title": "Opción de Seguridad" - }, - "size": { - "bullet1": "Los tamaños más grandes crean marcas de agua más prominentes", - "text": "Ajuste el tamaño de su marca de agua (texto o imagen).", - "title": "Control de Tamaño" - }, - "spacing": { - "bullet1": "Espaciado horizontal: Distancia entre marcas de agua de izquierda a derecha", - "bullet2": "Espaciado vertical: Distancia entre marcas de agua de arriba a abajo", - "bullet3": "Valores más altos crean patrones más espaciados", - "text": "Ajuste el espaciado entre marcas de agua repetidas en la página.", - "title": "Control de Espaciado" - } - }, - "language": { - "text": "Elija la configuración de idioma apropiada para asegurar una representación correcta de la fuente para su texto.", - "title": "Soporte de Idioma" - }, - "spacing": { - "bullet1": "Espaciado de ancho: Distancia horizontal entre marcas de agua", - "bullet2": "Espaciado de altura: Distancia vertical entre marcas de agua", - "bullet3": "Valores más altos crean patrones más espaciados", - "text": "Ajuste el espaciado entre marcas de agua repetidas en la página.", - "title": "Control de Espaciado" - }, - "textStyle": { - "color": { - "bullet1": "Gris claro (#d3d3d3) para marcas de agua sutiles", - "bullet2": "Negro o colores oscuros para alto contraste", - "bullet3": "Colores personalizados para fines de marca", - "text": "Elija un color que proporcione buen contraste con el contenido de su documento.", - "title": "Selección de Color" - }, - "header": { - "title": "Estilo de Texto" - }, - "language": { - "text": "Elija la configuración de idioma apropiada para asegurar una representación correcta de la fuente.", - "title": "Soporte de Idioma" - } - }, - "type": { - "description": { - "text": "Seleccione entre marcas de agua de texto o imagen según sus necesidades.", - "title": "Elija su Marca de Agua" - }, - "header": { - "title": "Selección de Tipo de Marca de Agua" - }, - "image": { - "bullet1": "Cargue cualquier formato de imagen", - "bullet2": "Mantiene la calidad de la imagen", - "bullet3": "Perfecto para logos y sellos", - "text": "Use logos, sellos o cualquier imagen como marca de agua. Excelente para marca e identificación visual.", - "title": "Marcas de Agua de Imagen" - }, - "text": { - "bullet1": "Fuentes e idiomas personalizables", - "bullet2": "Colores y transparencia ajustables", - "bullet3": "Ideal para texto legal o de marca", - "text": "Perfecto para añadir avisos de derechos de autor, nombres de empresas o etiquetas de confidencialidad. Admite múltiples idiomas y colores personalizados.", - "title": "Marcas de Agua de Texto" - } - }, - "wording": { - "header": { - "title": "Contenido de Texto" - }, - "text": { - "bullet1": "Manténgalo conciso para mejor legibilidad", - "bullet2": "Ejemplos comunes: 'CONFIDENCIAL', 'BORRADOR', nombre de la empresa", - "bullet3": "No se admiten caracteres emoji y se filtrarán", - "text": "Ingrese el texto que aparecerá como su marca de agua en todo el documento.", - "title": "Texto de Marca de Agua" - } - } } }, "permissions": { @@ -1249,155 +1535,201 @@ "removePages": { "tags": "Borrar páginas,eliminar páginas", "title": "Eliminar", - "submit": "Eliminar", - "error": { - "failed": "Se produjo un error al eliminar páginas." + "pageNumbers": { + "label": "Páginas a Eliminar", + "placeholder": "por ejemplo, 1,3,5-8,10", + "error": "Formato de número de página no válido. Use números, rangos (1-5) o expresiones matemáticas (2n+1)" }, "filenamePrefix": "paginas_eliminadas", "files": { "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" }, - "pageNumbers": { - "error": "Formato de número de página no válido. Use números, rangos (1-5) o expresiones matemáticas (2n+1)", - "label": "Páginas a Eliminar", - "placeholder": "por ejemplo, 1,3,5-8,10" - }, - "results": { - "title": "Resultados de Eliminación de Páginas" - }, "settings": { "title": "Configuración" }, "tooltip": { - "examples": { - "bullet1": "Eliminar primera página: 1", - "bullet2": "Eliminar últimas 3 páginas: -3", - "bullet3": "Eliminar cada dos páginas: 2n", - "bullet4": "Eliminar páginas específicas dispersas: 1,5,10,15", - "text": "Aquí hay algunos patrones comunes de selección de páginas:", - "title": "Ejemplos Comunes" - }, "header": { "title": "Configuración de Eliminar Páginas" }, "pageNumbers": { + "title": "Selección de Páginas", + "text": "Especifique qué páginas eliminar de su PDF. Puede seleccionar páginas individuales, rangos o usar expresiones matemáticas.", "bullet1": "Páginas individuales: 1,3,5 (elimina páginas 1, 3 y 5)", "bullet2": "Rangos de páginas: 1-5,10-15 (elimina páginas 1-5 y 10-15)", "bullet3": "Matemático: 2n+1 (elimina páginas impares)", - "bullet4": "Rangos abiertos: 5- (elimina desde la página 5 hasta el final)", - "text": "Especifique qué páginas eliminar de su PDF. Puede seleccionar páginas individuales, rangos o usar expresiones matemáticas.", - "title": "Selección de Páginas" + "bullet4": "Rangos abiertos: 5- (elimina desde la página 5 hasta el final)" + }, + "examples": { + "title": "Ejemplos Comunes", + "text": "Aquí hay algunos patrones comunes de selección de páginas:", + "bullet1": "Eliminar primera página: 1", + "bullet2": "Eliminar últimas 3 páginas: -3", + "bullet3": "Eliminar cada dos páginas: 2n", + "bullet4": "Eliminar páginas específicas dispersas: 1,5,10,15" }, "safety": { + "title": "Consejos de Seguridad", + "text": "Consideraciones importantes al eliminar páginas:", "bullet1": "Siempre previsualice su selección antes de procesar", "bullet2": "Mantenga una copia de seguridad de su archivo original", "bullet3": "Los números de página comienzan desde 1, no 0", - "bullet4": "Los números de página no válidos se ignorarán", - "text": "Consideraciones importantes al eliminar páginas:", - "title": "Consejos de Seguridad" + "bullet4": "Los números de página no válidos se ignorarán" } - } - }, - "addPassword": { - "tags": "seguro,seguridad", - "title": "Proteger con contraseña", - "header": "Añadir contraseña (encriptar)", - "selectText": { - "1": "Seleccionar PDF para encriptar", - "2": "Contraseña", - "3": "Longitud de la clave de cifrado", - "4": "Valores altos son más fuertes, pero valores bajos tienen mejor compatibilidad", - "5": "Permisos para establecer", - "6": "Impedir el ensamblaje del documento", - "7": "Impedir la extracción de contenido", - "8": "Impedir la extracción para la accesibilidad", - "9": "Impedir rellenar formulario", - "10": "Impedir modificación", - "11": "Impedir modificación de anotaciones", - "12": "Impedir imprimir", - "13": "Impedir imprimir diferentes formatos", - "14": "Contraseña", - "15": "Restringir qué se puede hacer con el documento una vez abierto (no soportado por todos los lectores)", - "16": "Restringir la apertura del propio documento" }, - "submit": "Encriptar", + "error": { + "failed": "Se produjo un error al eliminar páginas." + }, + "results": { + "title": "Resultados de Eliminación de Páginas" + }, + "submit": "Eliminar" + }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { "tooltip": { - "permissions": { - "title": "Cambiar permisos", - "text": "Estos permisos controlan lo que los usuarios pueden hacer con el PDF. Son más efectivos cuando se combinan con una contraseña de propietario." - }, - "encryption": { - "bullet1": "40 bits: Seguridad básica, compatible con visores antiguos", - "bullet2": "128 bits: Seguridad estándar, ampliamente compatible", - "bullet3": "256 bits: Seguridad máxima, requiere visores modernos", - "text": "Los niveles de cifrado más altos proporcionan mejor seguridad, pero es posible que no sean compatibles con visores de PDF antiguos.", - "title": "Niveles de cifrado" - }, "header": { - "title": "Descripción general de protección con contraseña" + "title": "Guía de Selección de Páginas" }, - "passwords": { - "bullet1": "Contraseña de usuario: Requerida para abrir el PDF", - "bullet2": "Contraseña de propietario: Controla los permisos del documento (no compatible con todos los visores de PDF)", - "text": "Las contraseñas de usuario restringen la apertura del documento, mientras que las contraseñas de propietario controlan lo que se puede hacer con el documento una vez abierto. Puede establecer ambas o solo una.", - "title": "Tipos de contraseña" - } - }, - "completed": "Protección con contraseña aplicada", - "desc": "Cifre su documento PDF con una contraseña.", - "encryption": { - "keyLength": { - "128bit": "128 bits (Estándar)", - "256bit": "256 bits (Alto)", - "40bit": "40 bits (Bajo)", - "label": "Longitud de clave de cifrado" - } - }, - "error": { - "failed": "Se produjo un error al cifrar el PDF." - }, - "filenamePrefix": "cifrado", - "passwords": { - "completed": "Contraseñas configuradas", - "owner": { - "label": "Contraseña de propietario", - "placeholder": "Introduzca la contraseña de propietario" + "basic": { + "title": "Uso Básico", + "text": "Seleccione páginas específicas de su documento PDF utilizando sintaxis simple.", + "bullet1": "Páginas individuales: 1,3,5", + "bullet2": "Rangos de páginas: 3-6 o 10-15", + "bullet3": "Todas las páginas: all" }, - "stepTitle": "Contraseñas y cifrado", - "user": { - "label": "Contraseña de usuario", - "placeholder": "Introduzca la contraseña de usuario" + "advanced": { + "title": "Funciones Avanzadas" + }, + "tips": { + "title": "Consejos", + "text": "Tenga en cuenta estas pautas:", + "bullet1": "Los números de página comienzan desde 1 (no 0)", + "bullet2": "Los espacios se eliminan automáticamente", + "bullet3": "Las expresiones no válidas se ignoran" + }, + "syntax": { + "title": "Conceptos Básicos de Sintaxis", + "text": "Use números, rangos, palabras clave y progresiones (n comienza en 0). Se admiten paréntesis.", + "bullets": { + "numbers": "Números/rangos: 5, 10-20", + "keywords": "Palabras clave: odd, even", + "progressions": "Progresiones: 3n, 4n+1" + } + }, + "operators": { + "title": "Operadores", + "text": "Y tiene mayor precedencia que la coma. NO se aplica dentro del rango del documento.", + "and": "Y: & o \"and\" — requiere ambas condiciones (por ejemplo, 1-50 & even)", + "comma": "Coma: , o | — combina selecciones (por ejemplo, 1-10, 20)", + "not": "NO: ! o \"not\" — excluye páginas (por ejemplo, 3n & not 30)" + }, + "examples": { + "title": "Ejemplos" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } - }, - "results": { - "title": "PDFs cifrados" } }, - "removePassword": { - "tags": "seguro,Descifrar,seguridad,quitar contraseña,eliminar contraseña", - "title": "Quitar contraseña", - "header": "Eliminar contraseña (desencriptar)", - "selectText": { - "1": "Seleccionar PDF para desencriptar", - "2": "Contraseña" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Guía de selección de páginas" }, - "submit": "Eliminar", - "desc": "Eliminar la contraseña del documento PDF", - "password": { - "stepTitle": "Eliminar contraseña", - "label": "Contraseña actual", - "completed": "Contraseña configurada", - "placeholder": "Introduzca la contraseña actual" + "syntax": { + "title": "Conceptos básicos de sintaxis", + "text": "Use números, rangos, palabras clave y progresiones (n comienza en 0). Se admiten paréntesis.", + "bullets": { + "numbers": "Números/rangos: 5, 10-20", + "keywords": "Palabras clave: odd, even", + "progressions": "Progresiones: 3n, 4n+1" + } }, - "error": { - "failed": "Se produjo un error al eliminar la contraseña del PDF." + "operators": { + "title": "Operadores", + "text": "AND tiene mayor precedencia que la coma. NOT se aplica dentro del rango del documento.", + "and": "AND: & o \"and\" — requiere ambas condiciones (ej., 1-50 & even)", + "comma": "Coma: , o | — combina selecciones (ej., 1-10, 20)", + "not": "NOT: ! o \"not\" — excluye páginas (ej., 3n & not 30)" }, - "filenamePrefix": "descifrado", - "results": { - "title": "PDF Descifrados" + "examples": { + "title": "Ejemplos", + "first50": "Primeras 50", + "last50": "Últimas 50", + "every3rd": "Cada tercera", + "oddWithinExcluding": "Impares dentro de 1-20 excluyendo 5-7", + "combineSets": "Combinar conjuntos" }, - "tooltip": { - "description": "Eliminar la protección con contraseña requiere la contraseña que se usó para cifrar el PDF. Esto descifrará el documento, haciéndolo accesible sin contraseña." + "firstNPages": { + "title": "Primeras N páginas", + "placeholder": "Número de páginas" + }, + "lastNPages": { + "title": "Últimas N páginas", + "placeholder": "Número de páginas" + }, + "everyNthPage": { + "title": "Cada enésima página", + "placeholder": "Tamaño de paso" + }, + "range": { + "title": "Rango", + "fromPlaceholder": "Desde", + "toPlaceholder": "Hasta" + }, + "keywords": { + "title": "Palabras clave" + }, + "advanced": { + "title": "Avanzado" } }, "compressPdfs": { @@ -1409,24 +1741,140 @@ "header": "Desbloquear Formularios PDF", "submit": "Eliminar", "description": "Esta herramienta eliminará las restricciones de solo lectura de los campos de formulario PDF, haciéndolos editables y rellenables.", - "error": { - "failed": "Se produjo un error al desbloquear los formularios PDF." - }, "filenamePrefix": "formularios_desbloqueados", "files": { "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" }, + "error": { + "failed": "Se produjo un error al desbloquear los formularios PDF." + }, "results": { "title": "Resultados de Formularios Desbloqueados" } }, "changeMetadata": { - "tags": "título,autor,fecha,creación,hora,editorial,productor,estadísticas", + "header": "Cambiar metadatos", + "submit": "Cambiar", + "filenamePrefix": "metadatos", + "settings": { + "title": "Configuración de metadatos" + }, + "standardFields": { + "title": "Campos estándar" + }, + "deleteAll": { + "label": "Eliminar metadatos existentes", + "checkbox": "Eliminar todos los metadatos" + }, "title": { "label": "Título", "placeholder": "Título del documento" }, - "header": "Cambiar metadatos", + "author": { + "label": "Autor", + "placeholder": "Autor del documento" + }, + "subject": { + "label": "Asunto", + "placeholder": "Asunto del documento" + }, + "keywords": { + "label": "Palabras clave", + "placeholder": "Palabras clave del documento" + }, + "creator": { + "label": "Creador", + "placeholder": "Creador del documento" + }, + "producer": { + "label": "Productor", + "placeholder": "Productor del documento" + }, + "dates": { + "title": "Campos de fecha" + }, + "creationDate": { + "label": "Fecha de creación", + "placeholder": "Fecha de creación" + }, + "modificationDate": { + "label": "Fecha de modificación", + "placeholder": "Fecha de modificación" + }, + "trapped": { + "label": "Estado de Trapping", + "unknown": "Desconocido", + "true": "Verdadero", + "false": "Falso" + }, + "advanced": { + "title": "Opciones avanzadas" + }, + "customFields": { + "title": "Metadatos personalizados", + "description": "Añadir campos de metadatos personalizados al documento", + "add": "Añadir campo", + "key": "Clave", + "keyPlaceholder": "Clave personalizada", + "value": "Valor", + "valuePlaceholder": "Valor personalizado", + "remove": "Eliminar" + }, + "results": { + "title": "PDFs actualizados" + }, + "error": { + "failed": "Se produjo un error al cambiar los metadatos del PDF." + }, + "tooltip": { + "header": { + "title": "Descripción general de metadatos PDF" + }, + "standardFields": { + "title": "Campos Estándar", + "text": "Campos de metadatos PDF comunes que describen el documento.", + "bullet1": "Título: Nombre del documento o encabezado", + "bullet2": "Autor: Persona que creó el documento", + "bullet3": "Asunto: Breve descripción del contenido", + "bullet4": "Palabras clave: Términos de búsqueda para el documento", + "bullet5": "Creador/Productor: Software utilizado para crear el PDF" + }, + "dates": { + "title": "Campos de fecha", + "text": "Cuándo se creó y modificó el documento.", + "bullet1": "Fecha de creación: Cuándo se creó el documento original", + "bullet2": "Fecha de modificación: Cuándo se cambió por última vez" + }, + "options": { + "title": "Opciones adicionales", + "text": "Campos personalizados y controles de privacidad.", + "bullet1": "Metadatos personalizados: Añada sus propios pares clave-valor", + "bullet2": "Estado de captura: Configuración de impresión de alta calidad", + "bullet3": "Eliminar todo: Eliminar todos los metadatos para privacidad" + }, + "deleteAll": { + "title": "Eliminar metadatos existentes", + "text": "Eliminación completa de metadatos para garantizar la privacidad." + }, + "customFields": { + "title": "Metadatos personalizados", + "text": "Añada sus propios pares de metadatos clave-valor personalizados.", + "bullet1": "Añada cualquier campo personalizado relevante para su documento", + "bullet2": "Ejemplos: Departamento, Proyecto, Versión, Estado", + "bullet3": "Tanto la clave como el valor son requeridos para cada entrada" + }, + "advanced": { + "title": "Opciones avanzadas", + "trapped": { + "title": "Estado de captura", + "description": "Indica si el documento está preparado para impresión de alta calidad.", + "bullet1": "Verdadero: El documento ha sido capturado para impresión", + "bullet2": "Falso: El documento no ha sido capturado", + "bullet3": "Desconocido: El estado de captura no está especificado" + } + } + }, + "tags": "título,autor,fecha,creación,hora,editorial,productor,estadísticas", "selectText": { "1": "Editar las variables que desea cambiar", "2": "Eliminar todos los metadatos", @@ -1434,123 +1882,7 @@ "4": "Otros Metadatos:", "5": "Agregar entrada de metadatos personalizados" }, - "author": { - "label": "Autor", - "placeholder": "Autor del documento" - }, - "creationDate": { - "label": "Fecha de creación", - "placeholder": "Fecha de creación" - }, - "creator": { - "label": "Creador", - "placeholder": "Creador del documento" - }, - "keywords": { - "label": "Palabras clave", - "placeholder": "Palabras clave del documento" - }, - "modDate": "Fecha de modificación (aaaa/MM/dd HH:mm:ss):", - "producer": { - "label": "Productor", - "placeholder": "Productor del documento" - }, - "subject": { - "label": "Asunto", - "placeholder": "Asunto del documento" - }, - "trapped": { - "false": "Falso", - "label": "Estado de Trapping", - "true": "Verdadero", - "unknown": "Desconocido" - }, - "submit": "Cambiar", - "advanced": { - "title": "Opciones avanzadas" - }, - "customFields": { - "add": "Añadir campo", - "description": "Añadir campos de metadatos personalizados al documento", - "key": "Clave", - "keyPlaceholder": "Clave personalizada", - "remove": "Eliminar", - "title": "Metadatos personalizados", - "value": "Valor", - "valuePlaceholder": "Valor personalizado" - }, - "dates": { - "title": "Campos de fecha" - }, - "deleteAll": { - "checkbox": "Eliminar todos los metadatos", - "label": "Eliminar metadatos existentes" - }, - "error": { - "failed": "Se produjo un error al cambiar los metadatos del PDF." - }, - "filenamePrefix": "metadatos", - "modificationDate": { - "label": "Fecha de modificación", - "placeholder": "Fecha de modificación" - }, - "results": { - "title": "PDFs actualizados" - }, - "settings": { - "title": "Configuración de metadatos" - }, - "standardFields": { - "title": "Campos estándar" - }, - "tooltip": { - "advanced": { - "title": "Opciones avanzadas", - "trapped": { - "bullet1": "Verdadero: El documento ha sido capturado para impresión", - "bullet2": "Falso: El documento no ha sido capturado", - "bullet3": "Desconocido: El estado de captura no está especificado", - "description": "Indica si el documento está preparado para impresión de alta calidad.", - "title": "Estado de captura" - } - }, - "customFields": { - "bullet1": "Añada cualquier campo personalizado relevante para su documento", - "bullet2": "Ejemplos: Departamento, Proyecto, Versión, Estado", - "bullet3": "Tanto la clave como el valor son requeridos para cada entrada", - "text": "Añada sus propios pares de metadatos clave-valor personalizados.", - "title": "Metadatos personalizados" - }, - "dates": { - "bullet1": "Fecha de creación: Cuándo se creó el documento original", - "bullet2": "Fecha de modificación: Cuándo se cambió por última vez", - "text": "Cuándo se creó y modificó el documento.", - "title": "Campos de fecha" - }, - "deleteAll": { - "text": "Eliminación completa de metadatos para garantizar la privacidad.", - "title": "Eliminar metadatos existentes" - }, - "header": { - "title": "Descripción general de metadatos PDF" - }, - "options": { - "bullet1": "Metadatos personalizados: Añada sus propios pares clave-valor", - "bullet2": "Estado de captura: Configuración de impresión de alta calidad", - "bullet3": "Eliminar todo: Eliminar todos los metadatos para privacidad", - "text": "Campos personalizados y controles de privacidad.", - "title": "Opciones adicionales" - }, - "standardFields": { - "bullet1": "Título: Nombre del documento o encabezado", - "bullet2": "Autor: Persona que creó el documento", - "bullet3": "Asunto: Breve descripción del contenido", - "bullet4": "Palabras clave: Términos de búsqueda para el documento", - "bullet5": "Creador/Productor: Software utilizado para crear el PDF", - "text": "Campos de metadatos PDF comunes que describen el documento.", - "title": "Campos Estándar" - } - } + "modDate": "Fecha de modificación (aaaa/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformación,formato,documento,imagen,diapositiva,texto,conversión,office,docs,word,excel,powerpoint", @@ -1564,6 +1896,7 @@ "ocr": { "tags": "reconocimiento,texto,imagen,escanear,leer,identificar,detección,editable", "title": "OCR / Escaneo de limpieza", + "desc": "Tareas de limpieza y detectar texto en imágenes dentro de un PDF y volver a incrustarlo como texto", "header": "Escaneos de limpieza / OCR (Reconocimiento óptico de caracteres)", "selectText": { "1": "Seleccionar los idiomas que se detectarán en el PDF (Los enumerados son los detectados actualmente):", @@ -1582,7 +1915,16 @@ "help": "Lea esta documentación sobre cómo usar esto para otros idiomas y/o no usarlo en Docker", "credit": "Este servicio utiliza qpdf y Tesseract para OCR", "submit": "Procesar PDF con OCR", - "desc": "Tareas de limpieza y detectar texto en imágenes dentro de un PDF y volver a incrustarlo como texto", + "operation": { + "submit": "Procesar OCR y Revisar" + }, + "results": { + "title": "Resultados de OCR" + }, + "languagePicker": { + "additionalLanguages": "¿Busca idiomas adicionales?", + "viewSetupGuide": "Ver guía de configuración →" + }, "settings": { "title": "Configuración", "ocrMode": { @@ -1595,74 +1937,67 @@ "label": "Idiomas", "placeholder": "Seleccione idiomas" }, - "advancedOptions": { - "clean": "Limpiar archivo de entrada", - "cleanFinal": "Limpiar salida final", - "deskew": "Enderezar páginas", - "label": "Opciones de Procesamiento", - "sidecar": "Crear un archivo de texto" - }, "compatibilityMode": { "label": "Modo de Compatibilidad" + }, + "advancedOptions": { + "label": "Opciones de Procesamiento", + "sidecar": "Crear un archivo de texto", + "deskew": "Enderezar páginas", + "clean": "Limpiar archivo de entrada", + "cleanFinal": "Limpiar salida final" } }, "tooltip": { + "header": { + "title": "Resumen de Configuración de OCR" + }, "mode": { "title": "Modo OCR", + "text": "El Reconocimiento Óptico de Caracteres (OCR) le ayuda a convertir páginas escaneadas o capturadas en pantalla en texto que puede buscar, copiar o resaltar.", "bullet1": "Automático omite páginas que ya contienen capas de texto.", "bullet2": "Forzar re-OCR todas las páginas y reemplaza todo el texto.", - "bullet3": "Estricto se detiene si se encuentra cualquier texto seleccionable.", - "text": "El Reconocimiento Óptico de Caracteres (OCR) le ayuda a convertir páginas escaneadas o capturadas en pantalla en texto que puede buscar, copiar o resaltar." + "bullet3": "Estricto se detiene si se encuentra cualquier texto seleccionable." }, "languages": { "title": "Idiomas", "text": "Mejore la precisión del OCR especificando los idiomas esperados. Elija uno o más idiomas para guiar la detección." }, + "output": { + "title": "Salida", + "text": "Decida cómo desea que se formatee la salida de texto:", + "bullet1": "PDF buscable incrusta texto detrás de la imagen original.", + "bullet2": "HOCR XML devuelve un archivo estructurado legible por máquina.", + "bullet3": "Archivo de texto plano crea un archivo .txt separado con contenido sin formato." + }, "advanced": { - "clean": { - "text": "Preprocesa la entrada eliminando ruido, mejorando el contraste y optimizando la imagen para un mejor reconocimiento OCR antes del procesamiento.", - "title": "Limpiar Archivo de Entrada" - }, - "cleanFinal": { - "text": "Posprocesa el PDF final eliminando artefactos de OCR y optimizando la capa de texto para una mejor legibilidad y un tamaño de archivo más pequeño.", - "title": "Limpiar Salida Final" - }, - "compatibility": { - "text": "Utiliza el modo 'sandwich PDF' de OCR: resulta en archivos más grandes, pero más fiable con ciertos idiomas y software PDF antiguo. Por defecto usamos hOCR para PDF más pequeños y modernos.", - "title": "Modo de Compatibilidad" - }, - "deskew": { - "text": "Corrige automáticamente páginas torcidas o inclinadas para mejorar la precisión del OCR. Útil para documentos escaneados que no estaban perfectamente alineados.", - "title": "Enderezar Páginas" - }, "header": { "title": "Procesamiento Avanzado de OCR" }, + "compatibility": { + "title": "Modo de Compatibilidad", + "text": "Utiliza el modo 'sandwich PDF' de OCR: resulta en archivos más grandes, pero más fiable con ciertos idiomas y software PDF antiguo. Por defecto usamos hOCR para PDF más pequeños y modernos." + }, "sidecar": { - "text": "Genera un archivo .txt separado junto al PDF que contiene todo el contenido de texto extraído para facilitar el acceso y el procesamiento.", - "title": "Crear Archivo de Texto" + "title": "Crear Archivo de Texto", + "text": "Genera un archivo .txt separado junto al PDF que contiene todo el contenido de texto extraído para facilitar el acceso y el procesamiento." + }, + "deskew": { + "title": "Enderezar Páginas", + "text": "Corrige automáticamente páginas torcidas o inclinadas para mejorar la precisión del OCR. Útil para documentos escaneados que no estaban perfectamente alineados." + }, + "clean": { + "title": "Limpiar Archivo de Entrada", + "text": "Preprocesa la entrada eliminando ruido, mejorando el contraste y optimizando la imagen para un mejor reconocimiento OCR antes del procesamiento." + }, + "cleanFinal": { + "title": "Limpiar Salida Final", + "text": "Posprocesa el PDF final eliminando artefactos de OCR y optimizando la capa de texto para una mejor legibilidad y un tamaño de archivo más pequeño." } - }, - "header": { - "title": "Resumen de Configuración de OCR" - }, - "output": { - "bullet1": "PDF buscable incrusta texto detrás de la imagen original.", - "bullet2": "HOCR XML devuelve un archivo estructurado legible por máquina.", - "bullet3": "Archivo de texto plano crea un archivo .txt separado con contenido sin formato.", - "text": "Decida cómo desea que se formatee la salida de texto:", - "title": "Salida" } }, - "languagePicker": { - "additionalLanguages": "¿Busca idiomas adicionales?", - "viewSetupGuide": "Ver guía de configuración →" - }, - "operation": { - "submit": "Procesar OCR y Revisar" - }, - "results": { - "title": "Resultados de OCR" + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1672,11 +2007,11 @@ "selectText": "Seleccionar el formato de imagen para convertir las imágenes extraídas", "allowDuplicates": "Guardar imágenes duplicadas", "submit": "Extraer", - "error": { - "failed": "Ocurrió un error al extraer imágenes del PDF." - }, "settings": { "title": "Configuración" + }, + "error": { + "failed": "Ocurrió un error al extraer imágenes del PDF." } }, "pdfToPDFA": { @@ -1749,14 +2084,43 @@ }, "info": "Python no está instalado. Se requiere para funcionar." }, + "scannerImageSplit": { + "title": "Imágenes Extraídas", + "submit": "Extraer Escaneos de Imágenes", + "error": { + "failed": "Se produjo un error al extraer escaneos de imágenes." + }, + "tooltip": { + "title": "Divisor de Fotos", + "whatThisDoes": "Qué hace esto", + "whatThisDoesDesc": "Encuentra y extrae automáticamente cada foto de una página escaneada o imagen compuesta, sin recorte manual.", + "whenToUse": "Cuándo usar", + "useCase1": "Escanee páginas completas de álbumes de una sola vez", + "useCase2": "Divida lotes de cama plana en archivos separados", + "useCase3": "Divida collages en fotos individuales", + "useCase4": "Extraiga fotos de documentos", + "quickFixes": "Soluciones rápidas", + "problem1": "Fotos no detectadas → aumente la Tolerancia a 30-50", + "problem2": "Demasiadas detecciones falsas → aumente el Área Mínima a 15,000-20,000", + "problem3": "Los recortes son demasiado ajustados → aumente el Tamaño del Borde a 5-10", + "problem4": "Fotos inclinadas no enderezadas → reduzca el Umbral de Ángulo a ~5°", + "problem5": "Cuadros de polvo/ruido → aumente el Área Mínima de Contorno a 1000-2000", + "setupTips": "Consejos de configuración", + "tip1": "Use un fondo plano y claro", + "tip2": "Deje un pequeño espacio (≈1 cm) entre fotos", + "tip3": "Escanee a 300-600 DPI", + "tip4": "Limpie el cristal del escáner", + "headsUp": "Advertencia", + "headsUpDesc": "Las fotos superpuestas o fondos muy cercanos en color a las fotos pueden reducir la precisión; intente usar un fondo más claro u oscuro y deje más espacio." + } + }, "sign": { - "tags": "autorizar,iniciales,firma manuscrita,texto de firma,imagen de firma", "title": "Firmar", "header": "Firmar archivos PDF", "upload": "Subir imagen", "draw": { - "clear": "Limpiar", - "title": "Dibuje su firma" + "title": "Dibuje su firma", + "clear": "Limpiar" }, "text": { "name": "Nombre del Firmante", @@ -1766,6 +2130,7 @@ "add": "Agregar", "saved": "firmas guardadas", "save": "Guardar Firma", + "applySignatures": "Aplicar Firmas", "personalSigs": "Firmas Personales", "sharedSigs": "Firmas compartidas", "noSavedSigs": "No se encontraron firmas guardadas", @@ -1778,83 +2143,92 @@ "maintainRatio": "Activar/desactivar la relación de aspecto", "undo": "Deshacer", "redo": "Rehacer", - "activate": "Activar Colocación de Firma", - "applySignatures": "Aplicar Firmas", - "deactivate": "Dejar de Colocar Firmas", - "error": { - "failed": "Se produjo un error al firmar el PDF." - }, - "image": { - "hint": "Cargue una imagen PNG o JPG de su firma", - "label": "Cargar imagen de firma", - "placeholder": "Seleccionar archivo de imagen" - }, - "instructions": { - "title": "Cómo añadir firma" - }, - "results": { - "title": "Resultados de Firma" - }, + "submit": "Firmar Documento", "steps": { "configure": "Configurar Firma" }, - "submit": "Firmar Documento", "type": { - "canvas": "Lienzo", + "title": "Tipo de Firma", "draw": "Dibujar", + "canvas": "Lienzo", "image": "Imagen", - "text": "Texto", - "title": "Tipo de Firma" - } + "text": "Texto" + }, + "image": { + "label": "Cargar imagen de firma", + "placeholder": "Seleccionar archivo de imagen", + "hint": "Cargue una imagen PNG o JPG de su firma" + }, + "instructions": { + "title": "Cómo añadir firma", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activar Colocación de Firma", + "deactivate": "Dejar de Colocar Firmas", + "results": { + "title": "Resultados de Firma" + }, + "error": { + "failed": "Se produjo un error al firmar el PDF." + }, + "tags": "autorizar,iniciales,firma manuscrita,texto de firma,imagen de firma" }, "flatten": { - "tags": "estática,desactivar,no interactiva,etiqueta dinámica", "title": "Aplanar", "header": "Acoplar archivos PDF", "flattenOnlyForms": "Aplanar sólo formularios", "submit": "Aplanar", - "steps": { - "settings": "Configuración" - }, - "options": { - "flattenOnlyForms": { - "desc": "Solo aplanar campos de formulario, dejando intactos otros elementos interactivos" - }, - "note": "Aplanar elimina elementos interactivos del PDF, haciéndolos no editables.", - "stepTitle": "Opciones de Aplanado", - "title": "Opciones de Aplanado" - }, - "error": { - "failed": "Ocurrió un error al aplanar el PDF." - }, "filenamePrefix": "aplanado", "files": { "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" }, + "steps": { + "settings": "Configuración" + }, + "options": { + "stepTitle": "Opciones de Aplanado", + "title": "Opciones de Aplanado", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "Solo aplanar campos de formulario, dejando intactos otros elementos interactivos" + }, + "note": "Aplanar elimina elementos interactivos del PDF, haciéndolos no editables." + }, "results": { "title": "Resultados de Aplanado" }, + "error": { + "failed": "Ocurrió un error al aplanar el PDF." + }, "tooltip": { + "header": { + "title": "Acerca de Aplanar PDFs" + }, "description": { + "title": "¿Qué hace el aplanado?", + "text": "Aplanar hace que su PDF no sea editable al convertir formularios rellenables y botones en texto e imágenes regulares. El PDF se verá exactamente igual, pero nadie podrá cambiar o rellenar los formularios. Perfecto para compartir formularios completados, crear documentos finales para registros, o garantizar que el PDF se vea igual en todas partes.", "bullet1": "Las cajas de texto se convierten en texto regular (no se pueden editar)", "bullet2": "Las casillas de verificación y botones se convierten en imágenes", "bullet3": "Ideal para versiones finales que no desea que sean modificadas", - "bullet4": "Garantiza una apariencia consistente en todos los dispositivos", - "text": "Aplanar hace que su PDF no sea editable al convertir formularios rellenables y botones en texto e imágenes regulares. El PDF se verá exactamente igual, pero nadie podrá cambiar o rellenar los formularios. Perfecto para compartir formularios completados, crear documentos finales para registros, o garantizar que el PDF se vea igual en todas partes.", - "title": "¿Qué hace el aplanado?" + "bullet4": "Garantiza una apariencia consistente en todos los dispositivos" }, "formsOnly": { + "title": "¿Qué significa 'Aplanar solo formularios'?", + "text": "Esta opción solo elimina la capacidad de rellenar formularios, pero mantiene otras funciones funcionando como hacer clic en enlaces, ver marcadores y leer comentarios.", "bullet1": "Los formularios se vuelven no editables", "bullet2": "Los enlaces siguen funcionando al hacer clic", "bullet3": "Los comentarios y notas permanecen visibles", - "bullet4": "Los marcadores siguen ayudándole a navegar", - "text": "Esta opción solo elimina la capacidad de rellenar formularios, pero mantiene otras funciones funcionando como hacer clic en enlaces, ver marcadores y leer comentarios.", - "title": "¿Qué significa 'Aplanar solo formularios'?" - }, - "header": { - "title": "Acerca de Aplanar PDFs" + "bullet4": "Los marcadores siguen ayudándole a navegar" } - } + }, + "tags": "estática,desactivar,no interactiva,etiqueta dinámica" }, "repair": { "tags": "reparar,restaurar,corregir,recuperar", @@ -1862,78 +2236,84 @@ "header": "Reparar archivos PDF", "submit": "Reparar", "description": "Esta herramienta intentará reparar archivos PDF corruptos o dañados. No se requieren configuraciones adicionales.", - "error": { - "failed": "Se produjo un error al reparar el PDF." - }, "filenamePrefix": "reparado", "files": { "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" }, + "error": { + "failed": "Se produjo un error al reparar el PDF." + }, "results": { "title": "Resultados de Reparación" } }, "removeBlanks": { - "tags": "limpieza,dinámica,sin contenido,organizar", "title": "Eliminar espacios en blanco", "header": "Eliminar páginas en blanco", + "settings": { + "title": "Configuración" + }, "threshold": { "label": "Umbral de Blancura de Píxeles" }, - "thresholdDesc": "Umbral para determinar cuán blanco debe ser un píxel blanco", "whitePercent": { "label": "Umbral de Porcentaje Blanco", "unit": "%" }, - "whitePercentDesc": "Porcentaje de página que debe ser blanca para ser eliminada", - "submit": "Eliminar espacios en blanco", "includeBlankPages": { "label": "Incluir páginas en blanco detectadas" }, - "settings": { - "title": "Configuración" - }, "tooltip": { "header": { "title": "Configuración de Eliminar Páginas en Blanco" }, - "includeBlankPages": { - "bullet1": "Útil para revisar lo que se eliminó", - "bullet2": "Ayuda a verificar la precisión de la detección", - "bullet3": "Se puede deshabilitar para reducir el tamaño del archivo de salida", - "text": "Cuando está habilitado, crea un PDF separado que contiene todas las páginas en blanco que fueron detectadas y eliminadas del documento original.", - "title": "Incluir Páginas en Blanco Detectadas" - }, "threshold": { + "title": "Umbral de Blancura de Píxeles", + "text": "Controla qué tan blanco debe ser un píxel para ser considerado 'blanco'. Esto ayuda a determinar qué cuenta como un área en blanco en la página.", "bullet1": "0 = Negro puro (más restrictivo)", "bullet2": "128 = Gris medio", - "bullet3": "255 = Blanco puro (menos restrictivo)", - "text": "Controla qué tan blanco debe ser un píxel para ser considerado 'blanco'. Esto ayuda a determinar qué cuenta como un área en blanco en la página.", - "title": "Umbral de Blancura de Píxeles" + "bullet3": "255 = Blanco puro (menos restrictivo)" }, "whitePercent": { + "title": "Umbral de Porcentaje Blanco", + "text": "Establece el porcentaje mínimo de píxeles blancos requerido para que una página se considere en blanco y se elimine.", "bullet1": "Valores más bajos (por ejemplo, 80%) = Más páginas eliminadas", "bullet2": "Valores más altos (por ejemplo, 95%) = Solo se eliminan páginas muy en blanco", - "bullet3": "Use valores más altos para documentos con fondos claros", - "text": "Establece el porcentaje mínimo de píxeles blancos requerido para que una página se considere en blanco y se elimine.", - "title": "Umbral de Porcentaje Blanco" + "bullet3": "Use valores más altos para documentos con fondos claros" + }, + "includeBlankPages": { + "title": "Incluir Páginas en Blanco Detectadas", + "text": "Cuando está habilitado, crea un PDF separado que contiene todas las páginas en blanco que fueron detectadas y eliminadas del documento original.", + "bullet1": "Útil para revisar lo que se eliminó", + "bullet2": "Ayuda a verificar la precisión de la detección", + "bullet3": "Se puede deshabilitar para reducir el tamaño del archivo de salida" } - } + }, + "submit": "Eliminar espacios en blanco", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "limpieza,dinámica,sin contenido,organizar", + "thresholdDesc": "Umbral para determinar cuán blanco debe ser un píxel blanco", + "whitePercentDesc": "Porcentaje de página que debe ser blanca para ser eliminada" }, "removeAnnotations": { "tags": "comentarios,subrayar,notas,margen,eliminar", "title": "Eliminar anotaciones", "header": "Eliminar anotaciones", "submit": "Eliminar", - "error": { - "failed": "Se produjo un error al eliminar las anotaciones del PDF." - }, - "info": { - "description": "Esta herramienta eliminará todas las anotaciones (comentarios, resaltados, notas, etc.) de sus documentos PDF.", - "title": "Acerca de Eliminar Anotaciones" - }, "settings": { "title": "Configuración" + }, + "info": { + "title": "Acerca de Eliminar Anotaciones", + "description": "Esta herramienta eliminará todas las anotaciones (comentarios, resaltados, notas, etc.) de sus documentos PDF." + }, + "error": { + "failed": "Se produjo un error al eliminar las anotaciones del PDF." } }, "compare": { @@ -1966,43 +2346,39 @@ "certSign": { "tags": "autentificar,PEM,P12,oficial,encriptar", "title": "Firma con certificado", - "header": "Firmar un PDF con su certificado (en desarrollo)", - "selectPDF": "Seleccione un archivo PDF para firmar:", - "jksNote": "Nota: si el tipo de certificado no está enla lista de abajo, por favor conviértalo a un archivo almacén de claves de Java Java KeyStore (.jks) utilizando la herramienta línea de comandos. Posteriormente, seleccione en el listado de abajo la opción archivo .jks.", - "selectKey": "Seleccione su archivo de clave privada (formato PKCS#8, podría ser .pem o .der):", - "selectCert": "Seleccione su archivo de certificado (formato X.509, podría ser .pem o .der):", - "selectP12": "Seleccione su archivo de almacén de claves PKCS#12 (.p12 o .pfx) (Opcional, si se proporciona, debe contener su clave privada y certificado):", - "selectJKS": "Seleccione su archivo de almacén de claves Java KeyStore (.jks or .keystore):", - "certType": { + "filenamePrefix": "firmado", + "signMode": { + "stepTitle": "Modo de firma", "tooltip": { - "convert": { - "text": "Convierta su archivo a un almacén de claves Java (.jks) con keytool, luego elija JKS.", - "title": "¿Clave no listada?" - }, "header": { - "title": "Acerca de los tipos de certificado" + "title": "Acerca de las firmas PDF" }, - "what": { - "text": "Es una identificación segura para su firma que demuestra que usted firmó. A menos que deba firmar mediante certificado, recomendamos usar otro método seguro como escribir, dibujar o cargar.", - "title": "¿Qué es un certificado?" + "overview": { + "title": "Cómo funcionan las firmas", + "text": "Ambos modos sellan el documento (cualquier edición se marca como manipulación) y registran quién/cuándo/cómo para auditoría. La confianza del visor depende de la cadena de certificados." }, - "which": { - "bullet1": "PKCS#12 (.p12 / .pfx) – un archivo combinado (más común)", - "bullet2": "PFX (.pfx) – versión de Microsoft de PKCS12", - "bullet3": "PEM – archivos .pem separados de clave privada y certificado", - "bullet4": "JKS – almacén de claves Java .jks para desarrollo / flujos de trabajo CI-CD", - "text": "Elija el formato que coincida con su archivo de certificado:", - "title": "¿Qué opción debo usar?" + "manual": { + "title": "Manual - Traiga su certificado", + "text": "Use sus propios archivos de certificado para identidad alineada con su marca. Puede mostrar Confiable cuando su CA/cadena es reconocida.", + "use": "Usar para: atención al cliente, legal, cumplimiento." + }, + "auto": { + "title": "Automático - Configuración cero, sello de sistema instantáneo", + "text": "Firma con un certificado autofirmado del servidor. Mismo sello contra manipulaciones y registro de auditoría; normalmente muestra No verificado en los visores.", + "use": "Usar cuando: necesite velocidad e identidad interna consistente en revisiones y registros." + }, + "rule": { + "title": "Regla general", + "text": "¿Necesita estado Confiable del destinatario? Manual. ¿Necesita un sello rápido contra manipulaciones y registro de auditoría sin configuración? Automático." } } }, - "password": "Introduzca su almacén de claves o contraseña de clave privada (si corresponde):", - "showSig": "Mostrar firma", - "reason": "Razón", - "location": "Ubicación", - "name": "Nombre", - "showLogo": "Mostrar Logotipo", - "submit": "Firmar PDF", + "certTypeStep": { + "stepTitle": "Formato de certificado" + }, + "certFiles": { + "stepTitle": "Archivos de certificado" + }, "appearance": { "stepTitle": "Apariencia de firma", "tooltip": { @@ -2010,92 +2386,111 @@ "title": "Acerca de la apariencia de firma" }, "invisible": { + "title": "Firmas invisibles", + "text": "La firma se añade al PDF para seguridad, pero no será visible al visualizar el documento. Perfecto para requisitos legales sin cambiar la apariencia del documento.", "bullet1": "Proporciona seguridad sin cambios visuales", "bullet2": "Cumple requisitos legales para firma digital", - "bullet3": "No afecta el diseño ni el aspecto del documento", - "text": "La firma se añade al PDF para seguridad, pero no será visible al visualizar el documento. Perfecto para requisitos legales sin cambiar la apariencia del documento.", - "title": "Firmas invisibles" + "bullet3": "No afecta el diseño ni el aspecto del documento" }, "visible": { + "title": "Firmas visibles", + "text": "Muestra un bloque de firma en el PDF con su nombre, fecha y detalles opcionales. Útil cuando desea que los lectores vean claramente que el documento está firmado.", "bullet1": "Muestra nombre del firmante y fecha en el documento", "bullet2": "Puede incluir motivo y ubicación de la firma", "bullet3": "Elija en qué página colocar la firma", - "bullet4": "Se puede incluir un logotipo opcional", - "text": "Muestra un bloque de firma en el PDF con su nombre, fecha y detalles opcionales. Útil cuando desea que los lectores vean claramente que el documento está firmado.", - "title": "Firmas visibles" + "bullet4": "Se puede incluir un logotipo opcional" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, - "certFiles": { - "stepTitle": "Archivos de certificado" - }, - "certTypeStep": { - "stepTitle": "Formato de certificado" + "sign": { + "submit": "Firmar PDF", + "results": "PDF firmado" }, "error": { "failed": "Se produjo un error al procesar las firmas." }, - "filenamePrefix": "firmado", - "sign": { - "results": "PDF firmado", - "submit": "Firmar PDF" - }, - "signMode": { - "stepTitle": "Modo de firma", - "tooltip": { - "auto": { - "text": "Firma con un certificado autofirmado del servidor. Mismo sello contra manipulaciones y registro de auditoría; normalmente muestra No verificado en los visores.", - "title": "Automático - Configuración cero, sello de sistema instantáneo", - "use": "Usar cuando: necesite velocidad e identidad interna consistente en revisiones y registros." - }, - "header": { - "title": "Acerca de las firmas PDF" - }, - "manual": { - "text": "Use sus propios archivos de certificado para identidad alineada con su marca. Puede mostrar Confiable cuando su CA/cadena es reconocida.", - "title": "Manual - Traiga su certificado", - "use": "Usar para: atención al cliente, legal, cumplimiento." - }, - "overview": { - "text": "Ambos modos sellan el documento (cualquier edición se marca como manipulación) y registran quién/cuándo/cómo para auditoría. La confianza del visor depende de la cadena de certificados.", - "title": "Cómo funcionan las firmas" - }, - "rule": { - "text": "¿Necesita estado Confiable del destinatario? Manual. ¿Necesita un sello rápido contra manipulaciones y registro de auditoría sin configuración? Automático.", - "title": "Regla general" - } - } - }, "tooltip": { "header": { "title": "Acerca de la gestión de firmas" }, "overview": { + "title": "¿Qué puede hacer esta herramienta?", + "text": "Esta herramienta le permite verificar si sus PDFs están firmados digitalmente y añadir nuevas firmas digitales. Las firmas digitales demuestran quién creó o aprobó un documento y muestran si ha sido cambiado desde la firma.", "bullet1": "Verificar firmas existentes y su validez", "bullet2": "Ver información detallada sobre firmantes y certificados", "bullet3": "Añadir nuevas firmas digitales para asegurar sus documentos", - "bullet4": "Múltiples archivos compatibles con navegación fácil", - "text": "Esta herramienta le permite verificar si sus PDFs están firmados digitalmente y añadir nuevas firmas digitales. Las firmas digitales demuestran quién creó o aprobó un documento y muestran si ha sido cambiado desde la firma.", - "title": "¿Qué puede hacer esta herramienta?" + "bullet4": "Múltiples archivos compatibles con navegación fácil" + }, + "validation": { + "title": "Verificar firmas", + "text": "Cuando verifica firmas, la herramienta le indica si son válidas, quién firmó el documento, cuándo se firmó y si el documento ha sido cambiado desde la firma.", + "bullet1": "Muestra si las firmas son válidas o inválidas", + "bullet2": "Muestra información del firmante y fecha de firma", + "bullet3": "Verifica si el documento fue modificado después de firmar", + "bullet4": "Puede usar certificados personalizados para verificación" }, "signing": { + "title": "Añadir firmas", + "text": "Para firmar un PDF, necesita un certificado digital (como PEM, PKCS12 o JKS). Puede elegir hacer visible la firma en el documento o mantenerla invisible solo para seguridad.", "bullet1": "Compatible con formatos PEM, PKCS12, JKS y certificado de servidor", "bullet2": "Opción de mostrar u ocultar firma en el PDF", "bullet3": "Añadir motivo, ubicación y nombre del firmante", "bullet4": "Elegir en qué página colocar firmas visibles", - "bullet5": "Usar certificado de servidor para la opción simple 'Firmar con Stirling-PDF'", - "text": "Para firmar un PDF, necesita un certificado digital (como PEM, PKCS12 o JKS). Puede elegir hacer visible la firma en el documento o mantenerla invisible solo para seguridad.", - "title": "Añadir firmas" - }, - "validation": { - "bullet1": "Muestra si las firmas son válidas o inválidas", - "bullet2": "Muestra información del firmante y fecha de firma", - "bullet3": "Verifica si el documento fue modificado después de firmar", - "bullet4": "Puede usar certificados personalizados para verificación", - "text": "Cuando verifica firmas, la herramienta le indica si son válidas, quién firmó el documento, cuándo se firmó y si el documento ha sido cambiado desde la firma.", - "title": "Verificar firmas" + "bullet5": "Usar certificado de servidor para la opción simple 'Firmar con Stirling-PDF'" } - } + }, + "certType": { + "tooltip": { + "header": { + "title": "Acerca de los tipos de certificado" + }, + "what": { + "title": "¿Qué es un certificado?", + "text": "Es una identificación segura para su firma que demuestra que usted firmó. A menos que deba firmar mediante certificado, recomendamos usar otro método seguro como escribir, dibujar o cargar." + }, + "which": { + "title": "¿Qué opción debo usar?", + "text": "Elija el formato que coincida con su archivo de certificado:", + "bullet1": "PKCS#12 (.p12 / .pfx) – un archivo combinado (más común)", + "bullet2": "PFX (.pfx) – versión de Microsoft de PKCS12", + "bullet3": "PEM – archivos .pem separados de clave privada y certificado", + "bullet4": "JKS – almacén de claves Java .jks para desarrollo / flujos de trabajo CI-CD" + }, + "convert": { + "title": "¿Clave no listada?", + "text": "Convierta su archivo a un almacén de claves Java (.jks) con keytool, luego elija JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Ubicación", + "logoTitle": "Logo", + "name": "Nombre", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Introduzca su almacén de claves o contraseña de clave privada (si corresponde):", + "passwordOptional": "Leave empty if no password", + "reason": "Razón", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Mostrar Logotipo", + "header": "Firmar un PDF con su certificado (en desarrollo)", + "selectPDF": "Seleccione un archivo PDF para firmar:", + "jksNote": "Nota: si el tipo de certificado no está enla lista de abajo, por favor conviértalo a un archivo almacén de claves de Java Java KeyStore (.jks) utilizando la herramienta línea de comandos. Posteriormente, seleccione en el listado de abajo la opción archivo .jks.", + "selectKey": "Seleccione su archivo de clave privada (formato PKCS#8, podría ser .pem o .der):", + "selectCert": "Seleccione su archivo de certificado (formato X.509, podría ser .pem o .der):", + "selectP12": "Seleccione su archivo de almacén de claves PKCS#12 (.p12 o .pfx) (Opcional, si se proporciona, debe contener su clave privada y certificado):", + "selectJKS": "Seleccione su archivo de almacén de claves Java KeyStore (.jks or .keystore):", + "showSig": "Mostrar firma", + "submit": "Firmar PDF" }, "removeCertSign": { "tags": "autenticar,PEM,P12,oficial,desencriptar", @@ -2104,13 +2499,13 @@ "selectPDF": "Seleccione un archivo PDF:", "submit": "Eliminar firma", "description": "Esta herramienta eliminará las firmas de certificado digital de su documento PDF.", - "error": { - "failed": "Se produjo un error al eliminar las firmas de certificado." - }, "filenamePrefix": "sin_firmar", "files": { "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" }, + "error": { + "failed": "Se produjo un error al eliminar las firmas de certificado." + }, "results": { "title": "Resultados de Eliminación de Certificado" } @@ -2121,16 +2516,157 @@ "header": "Diseño de varias páginas", "pagesPerSheet": "Páginas por hoja:", "addBorder": "Añadir bordes", - "submit": "Entregar" + "submit": "Entregar", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "folleto,imposición,impresión,encuadernación,plegado,signatura", + "title": "Imposición de folleto", + "header": "Imposición de folleto", + "submit": "Crear folleto", + "spineLocation": { + "label": "Ubicación del lomo", + "left": "Izquierda (Estándar)", + "right": "Derecha (RTL)" + }, + "doubleSided": { + "label": "Impresión a doble cara", + "tooltip": "Crea ambos lados frontal y posterior para impresión de folleto adecuada" + }, + "manualDuplex": { + "title": "Modo dúplex manual", + "instructions": "Para impresoras sin dúplex automático. Necesitará ejecutar esto dos veces:" + }, + "duplexPass": { + "label": "Pasada de impresión", + "first": "Primera pasada", + "second": "Segunda pasada", + "firstInstructions": "Imprime lados frontales → apile boca abajo → ejecute de nuevo con segunda pasada", + "secondInstructions": "Cargue la pila impresa boca abajo → imprime lados posteriores" + }, + "rtlBinding": { + "label": "Encuadernación de derecha a izquierda", + "tooltip": "Para árabe, hebreo u otros idiomas de derecha a izquierda" + }, + "addBorder": { + "label": "Añadir bordes alrededor de las páginas", + "tooltip": "Añade bordes alrededor de cada sección de página para ayudar con el corte y la alineación" + }, + "addGutter": { + "label": "Añadir margen de medianil", + "tooltip": "Añade espacio de margen interior para encuadernación" + }, + "gutterSize": { + "label": "Tamaño de medianil (puntos)" + }, + "flipOnShortEdge": { + "label": "Voltear por borde corto (solo dúplex automático)", + "tooltip": "Active para impresión dúplex por borde corto (solo dúplex automático - ignorado en modo manual)", + "manualNote": "No necesario en modo manual: usted voltea la pila manualmente" + }, + "advanced": { + "toggle": "Opciones avanzadas" + }, + "paperSizeNote": "El tamaño del papel se deriva automáticamente de su primera página.", + "tooltip": { + "header": { + "title": "Guía de creación de folletos" + }, + "description": { + "title": "¿Qué es la imposición de folleto?", + "text": "Crea folletos profesionales organizando las páginas en el orden de impresión correcto. Las páginas de su PDF se colocan de 2 en 2 en hojas horizontales, de modo que cuando se doblan y se encuadernan, se lean en la secuencia adecuada como un libro real." + }, + "example": { + "title": "Ejemplo: Folleto de 8 páginas", + "text": "Su documento de 8 páginas se convierte en 2 hojas:", + "bullet1": "Hoja 1 frontal: Páginas 8, 1 | Posterior: Páginas 2, 7", + "bullet2": "Hoja 2 frontal: Páginas 6, 3 | Posterior: Páginas 4, 5", + "bullet3": "Cuando se dobla y apila: Lee 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "Cómo imprimir y ensamblar", + "text": "Siga estos pasos para folletos perfectos:", + "bullet1": "Imprima a doble cara con 'Voltear por borde largo'", + "bullet2": "Apile hojas en orden, doble por la mitad", + "bullet3": "Grape o encuaderne a lo largo del lomo doblado", + "bullet4": "Para impresoras de borde corto: Active la opción 'Voltear por borde corto'" + }, + "manualDuplex": { + "title": "Dúplex manual (impresoras de una cara)", + "text": "Para impresoras sin dúplex automático:", + "bullet1": "Desactive 'Impresión a doble cara'", + "bullet2": "Seleccione 'Primera pasada' → Imprimir → Apile boca abajo", + "bullet3": "Seleccione 'Segunda pasada' → Cargue pila → Imprima posteriores", + "bullet4": "Doble y ensamble normalmente" + }, + "advanced": { + "title": "Opciones avanzadas", + "text": "Ajuste fino de su folleto:", + "bullet1": "Encuadernación de derecha a izquierda: Para árabe, hebreo o idiomas RTL", + "bullet2": "Bordes: Muestra líneas de corte para recortar", + "bullet3": "Margen de medianil: Añade espacio para encuadernación/grapado", + "bullet4": "Volteo por borde corto: Solo para impresoras dúplex automáticas" + } + }, + "error": { + "failed": "Se produjo un error al crear la imposición de folleto." + } }, "scalePages": { - "tags": "cambiar tamaño,modificar,dimensionar,adaptar", "title": "Ajustar escala de la página", "header": "Ajustar escala de la página", "pageSize": "Tamaño de la página del documento", "keepPageSize": "Tamaño Original", "scaleFactor": "Nivel de zoom (recorte) de la página", - "submit": "Entregar" + "submit": "Entregar", + "tags": "cambiar tamaño,modificar,dimensionar,adaptar" + }, + "adjustPageScale": { + "tags": "redimensionar,modificar,dimensión,adaptar", + "title": "Ajustar escala de página", + "header": "Ajustar escala de página", + "scaleFactor": { + "label": "Factor de escala" + }, + "pageSize": { + "label": "Tamaño de página de destino", + "keep": "Mantener tamaño original", + "letter": "Carta", + "legal": "Legal" + }, + "submit": "Ajustar escala de página", + "error": { + "failed": "Se produjo un error al ajustar la escala de página." + }, + "tooltip": { + "header": { + "title": "Descripción general de configuración de escala de página" + }, + "description": { + "title": "Descripción", + "text": "Ajuste el tamaño del contenido del PDF y cambie las dimensiones de página." + }, + "scaleFactor": { + "title": "Factor de escala", + "text": "Controla el tamaño del contenido en la página. El contenido se escala y se centra; si el contenido escalado es más grande que el tamaño de página, puede recortarse.", + "bullet1": "1.0 = Tamaño original", + "bullet2": "0.5 = Mitad del tamaño (50% más pequeño)", + "bullet3": "2.0 = Doble tamaño (200% más grande, puede recortarse)" + }, + "pageSize": { + "title": "Tamaño de página de destino", + "text": "Establece las dimensiones de las páginas del PDF de salida. 'Mantener tamaño original' conserva las dimensiones actuales, mientras que otras opciones redimensionan a tamaños de papel estándar." + } + } }, "add-page-numbers": { "tags": "paginar,etiquetar,organizar,indexar" @@ -2139,14 +2675,14 @@ "tags": "auto-detectar,basado en el encabezamiento,organizar,re-etiquetar", "title": "Renombrar automáticamente", "header": "Renombrar PDF automáticamente", - "submit": "Renombrar automáticamente", "description": "Encuentra automáticamente el título del contenido de su PDF y lo utiliza como nombre de archivo.", - "error": { - "failed": "Se produjo un error al renombrar automáticamente el PDF." - }, + "submit": "Renombrar automáticamente", "files": { "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" }, + "error": { + "failed": "Se produjo un error al renombrar automáticamente el PDF." + }, "results": { "title": "Resultados de cambio de nombre automático" }, @@ -2155,11 +2691,11 @@ "title": "Cómo funciona el cambio de nombre automático" }, "howItWorks": { + "title": "Cambio de nombre inteligente", + "text": "Encuentra automáticamente el título del contenido de su PDF y lo utiliza como nombre de archivo.", "bullet1": "Busca texto que parezca ser un título o encabezado", "bullet2": "Crea un nombre de archivo limpio y válido a partir del título detectado", - "bullet3": "Conserva el nombre original si no se encuentra un título adecuado", - "text": "Encuentra automáticamente el título del contenido de su PDF y lo utiliza como nombre de archivo.", - "title": "Cambio de nombre inteligente" + "bullet3": "Conserva el nombre original si no se encuentra un título adecuado" } } }, @@ -2167,39 +2703,55 @@ "tags": "corrección de color,sintonizar color,modificar,mejorar" }, "crop": { - "tags": "recortar,contraer,editar,forma", "title": "Recortar", "header": "Recortar PDF", "submit": "Entregar", - "coordinates": { - "height": "Altura", - "title": "Posición y Tamaño", - "width": "Ancho", - "x": "Posición X", - "y": "Posición Y" - }, - "error": { - "failed": "Error al recortar PDF", - "invalidArea": "El área de recorte se extiende más allá de los límites del PDF" - }, "noFileSelected": "Seleccione un archivo PDF para comenzar a recortar", "preview": { "title": "Selección de Área de Recorte" }, "reset": "Restablecer a PDF completo", - "results": { - "title": "Resultados de Recorte" + "coordinates": { + "title": "Posición y Tamaño", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "El área de recorte se extiende más allá de los límites del PDF", + "failed": "Error al recortar PDF" }, "steps": { "selectArea": "Seleccionar Área de Recorte" }, "tooltip": { + "title": "Cómo Recortar PDFs", "description": "Seleccione el área a recortar de su PDF arrastrando y redimensionando la superposición azul en la miniatura.", "drag": "Arrastre la superposición para mover el área de recorte", - "precision": "Use entradas de coordenadas para posicionamiento preciso", "resize": "Arrastre las esquinas y bordes para redimensionar", - "title": "Cómo Recortar PDFs" - } + "precision": "Use entradas de coordenadas para posicionamiento preciso" + }, + "results": { + "title": "Resultados de Recorte" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "recortar,contraer,editar,forma" }, "autoSplitPDF": { "tags": "Marcado por QR,separar,segmento de escaneo,organizar", @@ -2282,24 +2834,124 @@ "downloadJS": "Descargar Javascript", "submit": "Mostrar" }, - "autoRedact": { - "tags": "Redactar,Ocultar,ocultar,negro,subrayador,oculto", - "title": "Auto Censurar Texto", - "header": "Auto Censurar Texto", - "colorLabel": "Color", - "textsToRedactLabel": "Texto para Censurar (separado por líneas)", - "textsToRedactPlaceholder": "por ej. \\nConfidencial \\nAlto-Secreto", - "useRegexLabel": "Usar Regex", - "wholeWordSearchLabel": "Búsqueda por palabra completa", - "customPaddingLabel": "Espaciado adicional personalizado", - "convertPDFToImageLabel": "Convertir PDF a imagen PDF (Utilizado para eliminar el texto detrás del cajetín de censura)", - "submitButton": "Enviar" - }, "redact": { "tags": "Redactar,Ocultar,oscurece,negro,marcador,oculto,manual", "title": "Censurar texto Manualmente", - "header": "Censurar texto Manualmente", "submit": "Enviar", + "error": { + "failed": "Se produjo un error al censurar el PDF." + }, + "modeSelector": { + "title": "Método de Censura", + "mode": "Modo", + "automatic": "Automático", + "automaticDesc": "Censurar texto basándose en términos de búsqueda", + "manual": "Manual", + "manualDesc": "Haga clic y arrastre para censurar áreas específicas", + "manualComingSoon": "Censura manual próximamente" + }, + "auto": { + "header": "Censurar Automáticamente", + "settings": { + "title": "Configuración de Censura", + "advancedTitle": "Avanzado" + }, + "colorLabel": "Color de Caja", + "wordsToRedact": { + "title": "Palabras a Censurar", + "placeholder": "Introduzca una palabra", + "add": "Agregar", + "examples": "Ejemplos: Confidencial, Alto-Secreto" + }, + "useRegexLabel": "Usar Regex", + "wholeWordSearchLabel": "Búsqueda de Palabra Completa", + "customPaddingLabel": "Relleno Extra Personalizado", + "convertPDFToImageLabel": "Convertir PDF a PDF-Imagen" + }, + "tooltip": { + "mode": { + "header": { + "title": "Método de Censura" + }, + "automatic": { + "title": "Censura Automática", + "text": "Encuentra y censura automáticamente el texto especificado en todo el documento. Perfecto para eliminar información confidencial consistente como nombres, direcciones o marcadores confidenciales." + }, + "manual": { + "title": "Censura Manual", + "text": "Haga clic y arrastre para seleccionar manualmente áreas específicas para censurar. Le da control preciso sobre lo que se censura. (Próximamente)" + } + }, + "words": { + "header": { + "title": "Palabras a Censurar" + }, + "description": { + "title": "Coincidencia de Texto", + "text": "Introduzca palabras o frases para encontrar y censurar en su documento. Cada palabra se buscará por separado." + }, + "bullet1": "Agregue una palabra a la vez", + "bullet2": "Presione Enter o haga clic en 'Agregar Otra' para agregar", + "bullet3": "Haga clic en × para eliminar palabras", + "examples": { + "title": "Ejemplos Comunes", + "text": "Las palabras típicas para censurar incluyen: detalles bancarios, direcciones de correo electrónico o nombres específicos." + } + }, + "advanced": { + "header": { + "title": "Configuración Avanzada de Censura" + }, + "color": { + "title": "Color de Caja y Relleno", + "text": "Personalice la apariencia de las cajas de censura. El negro es estándar, pero puede elegir cualquier color. El relleno agrega espacio adicional alrededor del texto encontrado." + }, + "regex": { + "title": "Usar Regex", + "text": "Habilite expresiones regulares para coincidencia de patrones avanzada. Útil para encontrar números de teléfono, correos electrónicos o patrones complejos.", + "bullet1": "Ejemplo: \\d{4}-\\d{2}-\\d{2} para coincidir con cualquier fecha en formato AAAA-MM-DD", + "bullet2": "Usar con precaución - probar minuciosamente" + }, + "wholeWord": { + "title": "Búsqueda de Palabra Completa", + "text": "Solo coincide palabras completas, no coincidencias parciales. 'Juan' no coincidirá con 'Juanito' cuando esté habilitado." + }, + "convert": { + "title": "Convertir a PDF-Imagen", + "text": "Convierte el PDF a un PDF basado en imagen después de la censura. Esto asegura que el texto detrás de las cajas de censura se elimine completamente y sea irrecuperable." + } + } + }, + "manual": { + "header": "Censura Manual", + "textBasedRedaction": "Censura Basada en Texto", + "pageBasedRedaction": "Censura Basada en Páginas", + "convertPDFToImageLabel": "Convertir PDF a PDF-Imagen (Usado para eliminar texto detrás de la caja)", + "pageRedactionNumbers": { + "title": "Páginas", + "placeholder": "(por ejemplo 1,2,8 o 4,7,12-16 o 2n-1)" + }, + "redactionColor": { + "title": "Color de Censura" + }, + "export": "Exportar", + "upload": "Cargar", + "boxRedaction": "Censura de dibujo de caja", + "zoom": "Zoom", + "zoomIn": "Acercar", + "zoomOut": "Alejar", + "nextPage": "Página Siguiente", + "previousPage": "Página Anterior", + "toggleSidebar": "Alternar Barra Lateral", + "showThumbnails": "Mostrar Miniaturas", + "showDocumentOutline": "Mostrar Esquema del Documento (doble clic para expandir/contraer todos los elementos)", + "showAttachments": "Mostrar Adjuntos", + "showLayers": "Mostrar Capas (doble clic para restablecer todas las capas al estado predeterminado)", + "colourPicker": "Selector de Color", + "findCurrentOutlineItem": "Encontrar elemento de esquema actual", + "applyChanges": "Aplicar Cambios" + }, + "header": "Censurar texto Manualmente", "textBasedRedaction": "Censura basada en texto", "pageBasedRedaction": "Censura basada en la página", "convertPDFToImageLabel": "Convertir PDF a PDF-Imagen (Utilizado para eliminar el texto detrás del cajetín de censura)", @@ -2325,120 +2977,7 @@ "showLayers": "Mostrar Capas (doble clic para restablecer las capas a su estado inicial)", "colourPicker": "Selector de color", "findCurrentOutlineItem": "Resaltar el marcador", - "applyChanges": "Aplicar cambios", - "auto": { - "settings": { - "advancedTitle": "Avanzado", - "title": "Configuración de Censura" - }, - "wordsToRedact": { - "add": "Agregar", - "examples": "Ejemplos: Confidencial, Alto-Secreto", - "placeholder": "Introduzca una palabra", - "title": "Palabras a Censurar" - }, - "colorLabel": "Color de Caja", - "convertPDFToImageLabel": "Convertir PDF a PDF-Imagen", - "customPaddingLabel": "Relleno Extra Personalizado", - "header": "Censurar Automáticamente", - "useRegexLabel": "Usar Regex", - "wholeWordSearchLabel": "Búsqueda de Palabra Completa" - }, - "manual": { - "pageRedactionNumbers": { - "title": "Páginas", - "placeholder": "(por ejemplo 1,2,8 o 4,7,12-16 o 2n-1)" - }, - "export": "Exportar", - "applyChanges": "Aplicar Cambios", - "boxRedaction": "Censura de dibujo de caja", - "colourPicker": "Selector de Color", - "convertPDFToImageLabel": "Convertir PDF a PDF-Imagen (Usado para eliminar texto detrás de la caja)", - "findCurrentOutlineItem": "Encontrar elemento de esquema actual", - "header": "Censura Manual", - "nextPage": "Página Siguiente", - "pageBasedRedaction": "Censura Basada en Páginas", - "previousPage": "Página Anterior", - "redactionColor": { - "title": "Color de Censura" - }, - "showAttachments": "Mostrar Adjuntos", - "showDocumentOutline": "Mostrar Esquema del Documento (doble clic para expandir/contraer todos los elementos)", - "showLayers": "Mostrar Capas (doble clic para restablecer todas las capas al estado predeterminado)", - "showThumbnails": "Mostrar Miniaturas", - "textBasedRedaction": "Censura Basada en Texto", - "toggleSidebar": "Alternar Barra Lateral", - "upload": "Cargar", - "zoom": "Zoom", - "zoomIn": "Acercar", - "zoomOut": "Alejar" - }, - "error": { - "failed": "Se produjo un error al censurar el PDF." - }, - "modeSelector": { - "automatic": "Automático", - "automaticDesc": "Censurar texto basándose en términos de búsqueda", - "manual": "Manual", - "manualComingSoon": "Censura manual próximamente", - "manualDesc": "Haga clic y arrastre para censurar áreas específicas", - "mode": "Modo", - "title": "Método de Censura" - }, - "tooltip": { - "advanced": { - "color": { - "text": "Personalice la apariencia de las cajas de censura. El negro es estándar, pero puede elegir cualquier color. El relleno agrega espacio adicional alrededor del texto encontrado.", - "title": "Color de Caja y Relleno" - }, - "convert": { - "text": "Convierte el PDF a un PDF basado en imagen después de la censura. Esto asegura que el texto detrás de las cajas de censura se elimine completamente y sea irrecuperable.", - "title": "Convertir a PDF-Imagen" - }, - "header": { - "title": "Configuración Avanzada de Censura" - }, - "regex": { - "bullet1": "Ejemplo: \\d{4}-\\d{2}-\\d{2} para coincidir con cualquier fecha en formato AAAA-MM-DD", - "bullet2": "Usar con precaución - probar minuciosamente", - "text": "Habilite expresiones regulares para coincidencia de patrones avanzada. Útil para encontrar números de teléfono, correos electrónicos o patrones complejos.", - "title": "Usar Regex" - }, - "wholeWord": { - "text": "Solo coincide palabras completas, no coincidencias parciales. 'Juan' no coincidirá con 'Juanito' cuando esté habilitado.", - "title": "Búsqueda de Palabra Completa" - } - }, - "mode": { - "automatic": { - "text": "Encuentra y censura automáticamente el texto especificado en todo el documento. Perfecto para eliminar información confidencial consistente como nombres, direcciones o marcadores confidenciales.", - "title": "Censura Automática" - }, - "header": { - "title": "Método de Censura" - }, - "manual": { - "text": "Haga clic y arrastre para seleccionar manualmente áreas específicas para censurar. Le da control preciso sobre lo que se censura. (Próximamente)", - "title": "Censura Manual" - } - }, - "words": { - "bullet1": "Agregue una palabra a la vez", - "bullet2": "Presione Enter o haga clic en 'Agregar Otra' para agregar", - "bullet3": "Haga clic en × para eliminar palabras", - "description": { - "text": "Introduzca palabras o frases para encontrar y censurar en su documento. Cada palabra se buscará por separado.", - "title": "Coincidencia de Texto" - }, - "examples": { - "text": "Las palabras típicas para censurar incluyen: detalles bancarios, direcciones de correo electrónico o nombres específicos.", - "title": "Ejemplos Comunes" - }, - "header": { - "title": "Palabras a Censurar" - } - } - } + "applyChanges": "Aplicar cambios" }, "tableExtraxt": { "tags": "CSV,Extraer tabla,extraer,convertir" @@ -2449,11 +2988,15 @@ "overlay-pdfs": { "tags": "Superponer", "header": "Superponer archivos PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Seleccione archivo PDF de base" }, "overlayFiles": { - "label": "Seleccione archivos PDF a superponer" + "label": "Seleccione archivos PDF a superponer", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Seleccione modo de superposición", @@ -2463,14 +3006,53 @@ }, "counts": { "label": "Recuento de superposición (para Modo de Repetición Fija)", - "placeholder": "Introduzca recuento separado por comas (p.ej., 2,3,1)" + "placeholder": "Introduzca recuento separado por comas (p.ej., 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Seleccione Posición de Superposición", "foreground": "Arriba", "background": "Fondo" }, - "submit": "Enviar" + "submit": "Enviar", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Dividir sección, Dividir, Personalizar", @@ -2491,6 +3073,7 @@ "tags": "Sello, Añadir imagen, centrar imagen, Marca de agua, PDF, Incrustar, Personalizar", "header": "Sellar PDF", "title": "Sellar PDF", + "stampSetup": "Configuración de sello", "stampType": "Tipo de sello", "stampText": "Texto del sello", "stampImage": "Imagen de sello", @@ -2505,7 +3088,17 @@ "customColor": "Personalizar color de texto", "submit": "Enviar", "noStampSelected": "No se ha seleccionado ningún sello. Vuelva al Paso 1.", - "stampSetup": "Configuración de sello" + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Eliminar imagen,Operaciones de página,Back end,Backend" @@ -2523,7 +3116,8 @@ "status": { "_value": "Estado de la validación", "valid": "Válido", - "invalid": "Inválido" + "invalid": "Inválido", + "complete": "Validation complete" }, "signer": "Firmante", "date": "Fecha", @@ -2550,40 +3144,122 @@ "version": "Versión", "keyUsage": "Uso de la clave", "selfSigned": "Autofirmado", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Información de la firma", "_value": "Firma", "mathValid": "La firma es matemáticamente válida aunque:" }, - "selectCustomCert": "Archivo de certificado personalizado X.509 (opcional)" - }, - "replace-color": { - "title": "Reemplazar-Invertir-Color", - "header": "Reemplazar-Invertir Color en PDF", - "selectText": { - "1": "Opciones para Reemplazar o Invertir color", - "2": "Predeterminado (Colores de alto contraste predeterminados)", - "3": "Personalizado (Colores personalizados)", - "4": "Invertir Completo (Invertir todos los colores)", - "5": "Opciones de color de alto contraste", - "6": "Texto blanco sobre fondo negro", - "7": "Texto negro sobre fondo blanco", - "8": "Texto amarillo sobre fondo negro", - "9": "Texto verde sobre fondo negro", - "10": "Elegir Color de Texto", - "11": "Elegir Color de Fondo" + "selectCustomCert": "Archivo de certificado personalizado X.509 (opcional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Reemplazar" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Reemplazar Color,Operaciones de Página,Back end,Backend" + "replaceColor": { + "tags": "Reemplazar Color,Operaciones de página,Back end,lado del servidor", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Iniciar sesión", "header": "Iniciar sesión", "signin": "Iniciar sesión", + "signInWith": "Iniciar sesión con", + "signInAnonymously": "Registrarse como Invitado", "rememberme": "Recordarme", "invalid": "Nombre de usuario o contraseña erróneos.", "locked": "Su cuenta se ha bloqueado.", @@ -2603,45 +3279,79 @@ "alreadyLoggedIn2": "dispositivos. Cierre sesión en los dispositivos y vuelva a intentarlo.", "toManySessions": "Tiene demasiadas sesiones activas", "logoutMessage": "Ha cerrado sesión.", - "cancel": "Cancelar", - "debug": "Depurar", - "dontHaveAccount": "¿No tiene una cuenta? Registrarse", + "youAreLoggedIn": "¡Ha iniciado sesión!", "email": "Correo electrónico", - "enterEmail": "Introduzca su correo electrónico", - "enterEmailForMagicLink": "Introduzca su correo electrónico para el enlace mágico", - "enterPassword": "Introduzca su contraseña", - "failedToSignIn": "Error al iniciar sesión con {{provider}}: {{message}}", - "home": "Inicio", - "loggingIn": "Iniciando sesión...", - "login": "Iniciar sesión", - "magicLinkSent": "¡Enlace mágico enviado a {{email}}! Revise su correo electrónico y haga clic en el enlace para iniciar sesión.", - "or": "O", "password": "Contraseña", - "passwordResetSent": "¡Enlace de restablecimiento de contraseña enviado a {{email}}! Revise su correo electrónico y siga las instrucciones.", + "enterEmail": "Introduzca su correo electrónico", + "enterPassword": "Introduzca su contraseña", + "loggingIn": "Iniciando sesión...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Iniciando sesión...", + "login": "Iniciar sesión", + "or": "O", + "useMagicLink": "Usar enlace mágico en su lugar", + "enterEmailForMagicLink": "Introduzca su correo electrónico para el enlace mágico", + "sending": "Enviando…", + "sendMagicLink": "Enviar Enlace Mágico", + "cancel": "Cancelar", + "dontHaveAccount": "¿No tiene una cuenta? Registrarse", + "home": "Inicio", + "debug": "Depurar", + "signOut": "Cerrar Sesión", "pleaseEnterBoth": "Por favor, introduzca tanto el correo electrónico como la contraseña", "pleaseEnterEmail": "Por favor, introduzca su dirección de correo electrónico", - "sendMagicLink": "Enviar Enlace Mágico", - "sending": "Enviando…", - "signInAnonymously": "Registrarse como Invitado", - "signInWith": "Iniciar sesión con", - "signOut": "Cerrar Sesión", - "signingIn": "Iniciando sesión...", + "magicLinkSent": "¡Enlace mágico enviado a {{email}}! Revise su correo electrónico y haga clic en el enlace para iniciar sesión.", + "passwordResetSent": "¡Enlace de restablecimiento de contraseña enviado a {{email}}! Revise su correo electrónico y siga las instrucciones.", + "failedToSignIn": "Error al iniciar sesión con {{provider}}: {{message}}", "unexpectedError": "Error inesperado: {{message}}", - "useMagicLink": "Usar enlace mágico en su lugar", - "youAreLoggedIn": "¡Ha iniciado sesión!" + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Crear una cuenta", + "subtitle": "Únase a Stirling PDF para comenzar", + "name": "Nombre", + "email": "Correo electrónico", + "password": "Contraseña", + "confirmPassword": "Confirmar contraseña", + "enterName": "Ingrese su nombre", + "enterEmail": "Ingrese su correo electrónico", + "enterPassword": "Ingrese su contraseña", + "confirmPasswordPlaceholder": "Confirmar contraseña", + "or": "o", + "creatingAccount": "Creando Cuenta...", + "signUp": "Registrarse", + "alreadyHaveAccount": "¿Ya tiene una cuenta? Iniciar sesión", + "pleaseFillAllFields": "Por favor, complete todos los campos", + "passwordsDoNotMatch": "Las contraseñas no coinciden", + "passwordTooShort": "La contraseña debe tener al menos 6 caracteres", + "invalidEmail": "Por favor, ingrese una dirección de correo electrónico válida", + "checkEmailConfirmation": "Verifique su correo electrónico para obtener un enlace de confirmación y completar su registro.", + "accountCreatedSuccessfully": "¡Cuenta creada con éxito! Ahora puede iniciar sesión.", + "unexpectedError": "Error inesperado: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF a página única", "header": "PDF a página única", "submit": "Convertir a página única", "description": "Esta herramienta combinará todas las páginas de su PDF en una sola página grande. El ancho permanecerá igual que el de las páginas originales, pero la altura será la suma de todas las alturas de página.", - "error": { - "failed": "Se produjo un error al convertir a página única." - }, "filenamePrefix": "pagina_unica", "files": { "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" }, + "error": { + "failed": "Se produjo un error al convertir a página única." + }, "results": { "title": "Resultados de Página Única" } @@ -2668,18 +3378,59 @@ "adjustContrast": { "title": "Ajustar Contraste", "header": "Ajustar Contraste", + "basic": "Basic Adjustments", "contrast": "Contraste:", "brightness": "Brillo:", "saturation": "Saturación:", - "download": "Descargar" + "download": "Descargar", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Comprimir", + "desc": "Comprimir PDFs para reducir su tamaño de archivo.", "header": "Comprimir PDF", + "method": { + "title": "Método de Compresión", + "quality": "Calidad", + "filesize": "Tamaño de archivo" + }, "credit": "Este servicio utiliza qpdf para compresión/optimización de PDF", "grayscale": { "label": "Aplicar escala de grises para compresión" }, + "tooltip": { + "header": { + "title": "Resumen de Configuración de Compresión" + }, + "description": { + "title": "Descripción", + "text": "La compresión es una forma fácil de reducir el tamaño de su archivo. Elija Tamaño de Archivo para ingresar un tamaño objetivo y nosotros ajustaremos la calidad por usted. Elija Calidad para establecer la intensidad de compresión manualmente." + }, + "qualityAdjustment": { + "title": "Ajuste de Calidad", + "text": "Arrastre el control deslizante para ajustar la intensidad de compresión. Los valores más bajos (1-3) preservan la calidad pero resultan en archivos más grandes. Los valores más altos (7-9) reducen más el archivo pero disminuyen la claridad de la imagen.", + "bullet1": "Los valores más bajos preservan la calidad", + "bullet2": "Los valores más altos reducen el tamaño del archivo" + }, + "grayscale": { + "title": "Escala de Grises", + "text": "Seleccione esta opción para convertir todas las imágenes a blanco y negro, lo que puede reducir significativamente el tamaño del archivo, especialmente para PDFs escaneados o documentos con muchas imágenes." + } + }, + "error": { + "failed": "Ocurrió un error al comprimir el PDF." + }, "selectText": { "1": { "_value": "Configuración de Compresión", @@ -2689,35 +3440,7 @@ "4": "Modo automático: ajusta automáticamente la calidad para que el PDF tenga el tamaño exacto", "5": "Tamaño esperado del PDF (por ejemplo, 25 MB, 10.8 MB, 25 KB)" }, - "submit": "Comprimir", - "method": { - "filesize": "Tamaño de archivo", - "quality": "Calidad", - "title": "Método de Compresión" - }, - "desc": "Comprimir PDFs para reducir su tamaño de archivo.", - "error": { - "failed": "Ocurrió un error al comprimir el PDF." - }, - "tooltip": { - "description": { - "text": "La compresión es una forma fácil de reducir el tamaño de su archivo. Elija Tamaño de Archivo para ingresar un tamaño objetivo y nosotros ajustaremos la calidad por usted. Elija Calidad para establecer la intensidad de compresión manualmente.", - "title": "Descripción" - }, - "grayscale": { - "text": "Seleccione esta opción para convertir todas las imágenes a blanco y negro, lo que puede reducir significativamente el tamaño del archivo, especialmente para PDFs escaneados o documentos con muchas imágenes.", - "title": "Escala de Grises" - }, - "header": { - "title": "Resumen de Configuración de Compresión" - }, - "qualityAdjustment": { - "bullet1": "Los valores más bajos preservan la calidad", - "bullet2": "Los valores más altos reducen el tamaño del archivo", - "text": "Arrastre el control deslizante para ajustar la intensidad de compresión. Los valores más bajos (1-3) preservan la calidad pero resultan en archivos más grandes. Los valores más altos (7-9) reducen más el archivo pero disminuyen la claridad de la imagen.", - "title": "Ajuste de Calidad" - } - } + "submit": "Comprimir" }, "decrypt": { "passwordPrompt": "Este archivo está protegido con contraseña. Por favor, introduzca la contraseña:", @@ -2818,7 +3541,13 @@ "title": "Eliminar imagen", "header": "Eliminar imagen", "removeImage": "Eliminar imagen", - "submit": "Eliminar imagen" + "submit": "Eliminar imagen", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Dividir PDF por Capítulos", @@ -2852,6 +3581,12 @@ }, "note": "Las notas de la versión solo están disponibles en Inglés" }, + "swagger": { + "title": "Documentación de API", + "header": "Documentación de API", + "desc": "Ver y probar los endpoints de la API de Stirling PDF", + "tags": "api,documentación,swagger,endpoints,desarrollo" + }, "cookieBanner": { "popUp": { "title": "Cómo usamos las cookies", @@ -2887,238 +3622,944 @@ "title": "Análisis", "description": "Estas cookies nos ayudan a entender cómo se están utilizando nuestras herramientas, para que podamos centrarnos en desarrollar las funciones que nuestra comunidad valora más. Tenga la seguridad de que Stirling PDF no puede y nunca podrá rastrear el contenido de los documentos con los que trabaja." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Descargar", - "undo": "Deshacer", - "convert": { - "title": "Convertir", - "settings": "Configuración", - "color": "Color", - "greyscale": "Escala de grises", - "fillPage": "Ocupar toda la página", - "pdfaDigitalSignatureWarning": "El PDF contiene una firma digital. Ésta se eliminará en el siguiente paso.", - "grayscale": "Escala de grises", - "autoRotate": "Rotación Automática", - "autoRotateDescription": "Rotar automáticamente las imágenes para ajustarse mejor a la página PDF", - "blackwhite": "Blanco y Negro", - "colorType": "Tipo de Color", - "combineImages": "Combinar Imágenes", - "combineImagesDescription": "Combinar todas las imágenes en un PDF, o crear PDFs separados para cada imagen", - "conversionCompleted": "Conversión completada", - "conversionResults": "Resultados de Conversión", - "convertFiles": "Convertir Archivos", - "convertFrom": "Convertir desde", - "convertTo": "Convertir a", - "converting": "Convirtiendo...", - "defaultFilename": "archivo_convertido", - "desc": "Convertir archivos entre diferentes formatos", - "downloadConverted": "Descargar Archivo Convertido", - "downloadHtml": "Descargar archivo intermedio HTML en lugar de PDF", - "dpi": "DPI", - "emailOptions": "Opciones de Correo Electrónico a PDF", - "errorNoFiles": "Por favor seleccione al menos un archivo para convertir.", - "errorNoFormat": "Por favor seleccione los formatos de origen y destino.", - "errorNotSupported": "La conversión de {{from}} a {{to}} no está soportada.", - "fileFormat": "Formato de Archivo", - "files": "Archivos", - "fitDocumentToPage": "Ajustar Documento a Página", - "fitOption": "Opción de Ajuste", - "imageOptions": "Opciones de Imagen", - "images": "Imágenes", - "imagesExt": "Imágenes (JPG, PNG, etc.)", - "includeAllRecipients": "Incluir destinatarios CC y BCC en el encabezado", - "includeAttachments": "Incluir archivos adjuntos de correo electrónico", - "maintainAspectRatio": "Mantener Relación de Aspecto", - "markdown": "Markdown", - "maxAttachmentSize": "Tamaño máximo de archivo adjunto (MB)", - "multiple": "Múltiple", - "noFileSelected": "No se seleccionó ningún archivo. Use el panel de archivos para agregar archivos.", - "odpExt": "Presentación OpenDocument (.odp)", - "odtExt": "Texto OpenDocument (.odt)", - "officeDocs": "Documentos de Office (Word, Excel, PowerPoint)", - "output": "Salida", - "outputFormat": "Formato de Salida", - "outputOptions": "Opciones de Salida", - "pdfOptions": "Opciones de PDF", - "pdfaNote": "PDF/A-1b es más compatible, PDF/A-2b soporta más funciones.", - "pdfaOptions": "Opciones de PDF/A", - "pptExt": "PowerPoint (.pptx)", - "results": "Resultados", - "rtfExt": "Formato de Texto Enriquecido (.rtf)", - "selectFilesPlaceholder": "Seleccione archivos en la vista principal para comenzar", - "selectSourceFormatFirst": "Seleccione primero un formato de origen", - "selectedFiles": "Archivos seleccionados", - "single": "Individual", - "sourceFormatPlaceholder": "Formato de origen", - "targetFormatPlaceholder": "Formato de destino", - "textRtf": "Texto/RTF", - "txtExt": "Texto Plano (.txt)", - "webOptions": "Opciones de Web a PDF", - "wordDoc": "Documento de Word", - "wordDocExt": "Documento de Word (.docx)", - "zoomLevel": "Nivel de Zoom" + "removeMetadata": { + "submit": "Eliminar Metadatos" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments", - "add": "Añadir archivo adjunto", - "embed": "Incrustar archivo adjunto", - "remove": "Eliminar archivo adjunto" + "sidebar": { + "toggle": "Alternar Barra Lateral" + }, + "theme": { + "toggle": "Alternar Tema" + }, + "view": { + "viewer": "Visor", + "pageEditor": "Editor de Páginas", + "fileManager": "Gestor de Archivos" + }, + "pageEditor": { + "title": "Editor de Páginas", + "save": "Guardar Cambios", + "noPdfLoaded": "No hay PDF cargado. Por favor, cargue un PDF para editar.", + "rotatedLeft": "Girado a la izquierda:", + "rotatedRight": "Girado a la derecha:", + "deleted": "Eliminado:", + "movedLeft": "Movido a la izquierda:", + "movedRight": "Movido a la derecha:", + "splitAt": "Dividir en:", + "insertedPageBreak": "Salto de página insertado en:", + "addFileNotImplemented": "Agregar archivo no implementado en la demostración", + "closePdf": "Cerrar PDF", + "reset": "Restablecer Cambios", + "zoomIn": "Acercar", + "zoomOut": "Alejar", + "fitToWidth": "Ajustar al Ancho", + "actualSize": "Tamaño Real" + }, + "viewer": { + "firstPage": "Primera Página", + "lastPage": "Última Página", + "previousPage": "Página Anterior", + "nextPage": "Página Siguiente", + "zoomIn": "Acercar", + "zoomOut": "Alejar", + "singlePageView": "Vista de Página Única", + "dualPageView": "Vista de Página Doble" }, "rightRail": { + "closeSelected": "Cerrar Archivos Seleccionados", "selectAll": "Seleccionar Todo", "deselectAll": "Deseleccionar Todo", - "closePdf": "Cerrar PDF", - "closeSelected": "Cerrar Archivos Seleccionados", + "selectByNumber": "Seleccionar por Números de Página", "deleteSelected": "Eliminar Páginas Seleccionadas", - "downloadAll": "Descargar Todo", - "downloadSelected": "Descargar Archivos Seleccionados", + "closePdf": "Cerrar PDF", "exportAll": "Exportar PDF", + "downloadSelected": "Descargar Archivos Seleccionados", + "downloadAll": "Descargar Todo", + "toggleTheme": "Alternar Tema", "language": "Idioma", + "search": "Buscar en PDF", "panMode": "Modo de Desplazamiento", "rotateLeft": "Rotar a la Izquierda", "rotateRight": "Rotar a la Derecha", - "search": "Buscar en PDF", - "selectByNumber": "Seleccionar por Números de Página", "toggleSidebar": "Alternar Barra Lateral", - "toggleTheme": "Alternar Tema" + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Buscar PDF", + "placeholder": "Ingrese término de búsqueda...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "¡Está usando Stirling PDF como invitado!", + "message": "Cree una cuenta gratuita para guardar su trabajo, acceder a más funciones y apoyar el proyecto.", + "dismiss": "Descartar banner", + "signUp": "Registrarse Gratis" + }, + "toolPicker": { + "searchPlaceholder": "Buscar herramientas...", + "noToolsFound": "No se encontraron herramientas", + "allTools": "TODAS LAS HERRAMIENTAS", + "quickAccess": "ACCESO RÁPIDO", + "categories": { + "standardTools": "Herramientas Estándar", + "advancedTools": "Herramientas Avanzadas", + "recommendedTools": "Herramientas Recomendadas" + }, + "subcategories": { + "signing": "Firma", + "documentSecurity": "Seguridad de Documentos", + "verification": "Verificación", + "documentReview": "Revisión de Documentos", + "pageFormatting": "Formato de Página", + "extraction": "Extracción", + "removal": "Eliminación", + "automation": "Automatización", + "general": "General", + "advancedFormatting": "Formato Avanzado", + "developerTools": "Herramientas de Desarrollo" + } }, "quickAccess": { + "read": "Leer", "sign": "Firmar", - "activity": "Actividad", - "allTools": "Todas las Herramientas", "automate": "Automatizar", - "config": "Configuración", "files": "Archivos", - "read": "Leer" + "activity": "Actividad", + "help": "Help", + "account": "Account", + "config": "Configuración", + "adminSettings": "Admin Settings", + "allTools": "Todas las Herramientas" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { - "loading": "Cargando...", - "or": "o", - "addFiles": "Agregar Archivos", - "backToTools": "Volver a Herramientas", - "chooseFromStorage": "Elija un archivo del almacenamiento o cargue un nuevo PDF", - "chooseFromStorageMultiple": "Elija archivos del almacenamiento o cargue nuevos PDFs", - "dragFilesInOrClick": "Arrastre archivos o haga clic en \"Agregar Archivos\" para navegar", - "dropFileHere": "Suelte el archivo aquí o haga clic para cargar", - "dropFilesHere": "Suelte los archivos aquí o haga clic en el botón de carga", - "filesAvailable": "archivos disponibles", - "loadFromStorage": "Cargar desde Almacenamiento", - "noFilesInStorage": "No hay archivos disponibles en el almacenamiento. Cargue algunos archivos primero.", - "pdfFilesOnly": "Solo archivos PDF", "selectFile": "Seleccionar un archivo", "selectFiles": "Seleccionar archivos", - "selectFromStorage": "Seleccionar del Almacenamiento", - "selectPdfToEdit": "Seleccione un PDF para editar", "selectPdfToView": "Seleccione un PDF para ver", + "selectPdfToEdit": "Seleccione un PDF para editar", + "chooseFromStorage": "Elija un archivo del almacenamiento o cargue un nuevo PDF", + "chooseFromStorageMultiple": "Elija archivos del almacenamiento o cargue nuevos PDFs", + "loadFromStorage": "Cargar desde Almacenamiento", + "filesAvailable": "archivos disponibles", + "loading": "Cargando...", + "or": "o", + "dropFileHere": "Suelte el archivo aquí o haga clic para cargar", + "dropFilesHere": "Suelte los archivos aquí o haga clic en el botón de carga", + "pdfFilesOnly": "Solo archivos PDF", "supportedFileTypes": "Tipos de archivo soportados", "upload": "Cargar", "uploadFile": "Cargar Archivo", - "uploadFiles": "Cargar Archivos" + "uploadFiles": "Cargar Archivos", + "noFilesInStorage": "No hay archivos disponibles en el almacenamiento. Cargue algunos archivos primero.", + "selectFromStorage": "Seleccionar del Almacenamiento", + "backToTools": "Volver a Herramientas", + "addFiles": "Agregar Archivos", + "dragFilesInOrClick": "Arrastre archivos o haga clic en \"Agregar Archivos\" para navegar" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Cargar Archivos PDF", + "subtitle": "Agregue archivos a su almacenamiento para acceder fácilmente a través de las herramientas", + "filesSelected": "archivos seleccionados", + "clearSelection": "Limpiar Selección", + "openInFileEditor": "Abrir en Editor de Archivos", + "uploadError": "Error al cargar algunos archivos.", + "failedToOpen": "Error al abrir archivo. Es posible que haya sido eliminado del almacenamiento.", + "failedToLoad": "Error al cargar archivo al conjunto activo.", + "storageCleared": "El navegador limpió el almacenamiento. Los archivos han sido eliminados. Por favor vuelva a cargarlos.", + "clearAll": "Limpiar Todo", + "reloadFiles": "Recargar Archivos", + "dragDrop": "Arrastrar y Soltar archivos aquí", + "clickToUpload": "Haga clic para cargar archivos", + "selectedFiles": "Archivos Seleccionados", + "storage": "Almacenamiento", + "filesStored": "archivos almacenados", + "storageError": "Ocurrió un error de almacenamiento", + "storageLow": "El almacenamiento se está agotando. Considere eliminar archivos antiguos.", + "supportMessage": "Impulsado por almacenamiento de base de datos del navegador para capacidad ilimitada", + "noFileSelected": "No hay archivos seleccionados", + "showHistory": "Mostrar Historial", + "hideHistory": "Ocultar Historial", + "fileHistory": "Historial de Archivos", + "loadingHistory": "Cargando Historial...", + "lastModified": "Última Modificación", + "toolChain": "Herramientas Aplicadas", + "restore": "Restaurar", + "unzip": "Unzip", + "searchFiles": "Buscar archivos...", + "recent": "Reciente", + "localFiles": "Archivos Locales", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "Mis Archivos", + "noRecentFiles": "No se encontraron archivos recientes", + "googleDriveNotAvailable": "Integración con Google Drive no disponible", + "openFiles": "Abrir Archivos", + "openFile": "Abrir Archivo", + "details": "Detalles del Archivo", "fileName": "Nombre", + "fileFormat": "Formato", + "fileSize": "Tamaño", "fileVersion": "Versión", + "totalSelected": "Total Seleccionados", + "dropFilesHere": "Soltar archivos aquí", "selectAll": "Seleccionar Todo", "deselectAll": "Deseleccionar Todo", "deleteSelected": "Borrar seleccionado(s)", + "downloadSelected": "Descargar Seleccionados", + "selectedCount": "{{count}} seleccionados", "download": "Descargar", "delete": "Borrar", - "clearAll": "Limpiar Todo", - "clearSelection": "Limpiar Selección", - "clickToUpload": "Haga clic para cargar archivos", - "details": "Detalles del Archivo", - "downloadSelected": "Descargar Seleccionados", - "dragDrop": "Arrastrar y Soltar archivos aquí", - "dropFilesHere": "Soltar archivos aquí", - "dropFilesHint": "Suelte los archivos aquí para cargar", - "failedToLoad": "Error al cargar archivo al conjunto activo.", - "failedToOpen": "Error al abrir archivo. Es posible que haya sido eliminado del almacenamiento.", - "fileFormat": "Formato", - "fileHistory": "Historial de Archivos", - "fileSize": "Tamaño", - "filesSelected": "archivos seleccionados", - "filesStored": "archivos almacenados", - "googleDrive": "Google Drive", - "googleDriveNotAvailable": "Integración con Google Drive no disponible", - "googleDriveShort": "Drive", - "hideHistory": "Ocultar Historial", - "lastModified": "Última Modificación", - "loadingHistory": "Cargando Historial...", - "localFiles": "Archivos Locales", - "myFiles": "Mis Archivos", - "noFileSelected": "No hay archivos seleccionados", - "noRecentFiles": "No se encontraron archivos recientes", - "openFile": "Abrir Archivo", - "openFiles": "Abrir Archivos", - "openInFileEditor": "Abrir en Editor de Archivos", - "recent": "Reciente", - "reloadFiles": "Recargar Archivos", - "restore": "Restaurar", - "searchFiles": "Buscar archivos...", - "selectedCount": "{{count}} seleccionados", - "selectedFiles": "Archivos Seleccionados", - "showHistory": "Mostrar Historial", - "storage": "Almacenamiento", - "storageCleared": "El navegador limpió el almacenamiento. Los archivos han sido eliminados. Por favor vuelva a cargarlos.", - "storageError": "Ocurrió un error de almacenamiento", - "storageLow": "El almacenamiento se está agotando. Considere eliminar archivos antiguos.", - "subtitle": "Agregue archivos a su almacenamiento para acceder fácilmente a través de las herramientas", - "supportMessage": "Impulsado por almacenamiento de base de datos del navegador para capacidad ilimitada", - "title": "Cargar Archivos PDF", - "toolChain": "Herramientas Aplicadas", - "totalSelected": "Total Seleccionados", "unsupported": "No Soportado", - "uploadError": "Error al cargar algunos archivos." + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "Suelte los archivos aquí para cargar" + }, + "storage": { + "temporaryNotice": "Los archivos se almacenan temporalmente en su navegador y pueden eliminarse automáticamente", + "storageLimit": "Límite de almacenamiento", + "storageUsed": "Almacenamiento temporal utilizado", + "storageFull": "El almacenamiento está casi lleno. Considere eliminar algunos archivos.", + "fileTooLarge": "Archivo demasiado grande. El tamaño máximo por archivo es", + "storageQuotaExceeded": "Cuota de almacenamiento excedida. Por favor, elimine algunos archivos antes de cargar más.", + "approximateSize": "Tamaño aproximado" }, "sanitize": { - "submit": "Limpiar archivo PDF", - "steps": { - "settings": "Configuración", - "files": "Archivos", - "results": "Resultados" - }, - "completed": "Desinfección completada con éxito", + "title": "Desinfectar", "desc": "Eliminar elementos potencialmente dañinos de archivos PDF.", + "submit": "Limpiar archivo PDF", + "completed": "Desinfección completada con éxito", "error": { "failed": "Se produjo un error al desinfectar el PDF.", "generic": "La desinfección falló" }, "filenamePrefix": "desinfectado", + "sanitizationResults": "Resultados de Desinfección", + "steps": { + "files": "Archivos", + "settings": "Configuración", + "results": "Resultados" + }, "files": { "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" }, "options": { + "title": "Opciones de Desinfección", "note": "Seleccione los elementos que desea eliminar del PDF. Debe seleccionarse al menos una opción.", - "removeEmbeddedFiles": { - "desc": "Eliminar cualquier archivo incrustado dentro del PDF" - }, - "removeFonts": { - "desc": "Eliminar fuentes incrustadas del PDF" - }, "removeJavaScript": { + "label": "Remove JavaScript", "desc": "Eliminar acciones y scripts de JavaScript del PDF" }, - "removeLinks": { - "desc": "Eliminar enlaces externos y acciones de lanzamiento del PDF" - }, - "removeMetadata": { - "desc": "Eliminar metadatos de información del documento (título, autor, etc.)" + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Eliminar cualquier archivo incrustado dentro del PDF" }, "removeXMPMetadata": { + "label": "Remove XMP Metadata", "desc": "Eliminar metadatos XMP del PDF" }, - "title": "Opciones de Desinfección" + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Eliminar metadatos de información del documento (título, autor, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Eliminar enlaces externos y acciones de lanzamiento del PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Eliminar fuentes incrustadas del PDF" + } + } + }, + "addPassword": { + "title": "Proteger con contraseña", + "desc": "Cifre su documento PDF con una contraseña.", + "completed": "Protección con contraseña aplicada", + "submit": "Encriptar", + "filenamePrefix": "cifrado", + "error": { + "failed": "Se produjo un error al cifrar el PDF." }, - "sanitizationResults": "Resultados de Desinfección", - "title": "Desinfectar" + "passwords": { + "stepTitle": "Contraseñas y cifrado", + "completed": "Contraseñas configuradas", + "user": { + "label": "Contraseña de usuario", + "placeholder": "Introduzca la contraseña de usuario" + }, + "owner": { + "label": "Contraseña de propietario", + "placeholder": "Introduzca la contraseña de propietario" + } + }, + "encryption": { + "keyLength": { + "label": "Longitud de clave de cifrado", + "40bit": "40 bits (Bajo)", + "128bit": "128 bits (Estándar)", + "256bit": "256 bits (Alto)" + } + }, + "results": { + "title": "PDFs cifrados" + }, + "tooltip": { + "header": { + "title": "Descripción general de protección con contraseña" + }, + "passwords": { + "title": "Tipos de contraseña", + "text": "Las contraseñas de usuario restringen la apertura del documento, mientras que las contraseñas de propietario controlan lo que se puede hacer con el documento una vez abierto. Puede establecer ambas o solo una.", + "bullet1": "Contraseña de usuario: Requerida para abrir el PDF", + "bullet2": "Contraseña de propietario: Controla los permisos del documento (no compatible con todos los visores de PDF)" + }, + "encryption": { + "title": "Niveles de cifrado", + "text": "Los niveles de cifrado más altos proporcionan mejor seguridad, pero es posible que no sean compatibles con visores de PDF antiguos.", + "bullet1": "40 bits: Seguridad básica, compatible con visores antiguos", + "bullet2": "128 bits: Seguridad estándar, ampliamente compatible", + "bullet3": "256 bits: Seguridad máxima, requiere visores modernos" + }, + "permissions": { + "title": "Cambiar permisos", + "text": "Estos permisos controlan lo que los usuarios pueden hacer con el PDF. Son más efectivos cuando se combinan con una contraseña de propietario." + } + }, + "tags": "seguro,seguridad", + "header": "Añadir contraseña (encriptar)", + "selectText": { + "1": "Seleccionar PDF para encriptar", + "2": "Contraseña", + "3": "Longitud de la clave de cifrado", + "4": "Valores altos son más fuertes, pero valores bajos tienen mejor compatibilidad", + "5": "Permisos para establecer", + "6": "Impedir el ensamblaje del documento", + "7": "Impedir la extracción de contenido", + "8": "Impedir la extracción para la accesibilidad", + "9": "Impedir rellenar formulario", + "10": "Impedir modificación", + "11": "Impedir modificación de anotaciones", + "12": "Impedir imprimir", + "13": "Impedir imprimir diferentes formatos", + "14": "Contraseña", + "15": "Restringir qué se puede hacer con el documento una vez abierto (no soportado por todos los lectores)", + "16": "Restringir la apertura del propio documento" + } }, "changePermissions": { "title": "Cambiar permisos", + "desc": "Modificar restricciones y permisos del documento.", + "completed": "Permisos modificados", "submit": "Cambiar permisos", + "error": { + "failed": "Ocurrió un error al cambiar los permisos del PDF." + }, "permissions": { "preventAssembly": { "label": "Impedir el ensamblaje del documento" @@ -3145,6 +4586,9 @@ "label": "Impedir imprimir diferentes formatos" } }, + "results": { + "title": "PDFs Modificados" + }, "tooltip": { "header": { "title": "Cambiar permisos" @@ -3155,574 +4599,772 @@ "warning": { "text": "Para hacer estos permisos inmutables, use la herramienta Agregar Contraseña para establecer una contraseña de propietario." } - }, - "completed": "Permisos modificados", - "desc": "Modificar restricciones y permisos del documento.", - "error": { - "failed": "Ocurrió un error al cambiar los permisos del PDF." - }, - "results": { - "title": "PDFs Modificados" } }, - "AddAttachmentsRequest": { - "addMoreFiles": "Añadir más archivos...", - "attachments": "Seleccionar archivos adjuntos", - "info": "Seleccione archivos para adjuntar a su PDF. Estos archivos se incrustarán y serán accesibles a través del panel de archivos adjuntos del PDF.", - "placeholder": "Elegir archivos...", - "results": { - "title": "Resultados de archivos adjuntos" + "removePassword": { + "title": "Quitar contraseña", + "desc": "Eliminar la contraseña del documento PDF", + "tags": "seguro,Descifrar,seguridad,quitar contraseña,eliminar contraseña", + "password": { + "stepTitle": "Eliminar contraseña", + "label": "Contraseña actual", + "placeholder": "Introduzca la contraseña actual", + "completed": "Contraseña configurada" }, - "selectFiles": "Seleccionar archivos para adjuntar", - "selectedFiles": "Archivos seleccionados", - "submit": "Añadir archivos adjuntos" - }, - "adjustPageScale": { + "filenamePrefix": "descifrado", "error": { - "failed": "Se produjo un error al ajustar la escala de página." + "failed": "Se produjo un error al eliminar la contraseña del PDF." }, - "header": "Ajustar escala de página", - "pageSize": { - "keep": "Mantener tamaño original", - "label": "Tamaño de página de destino", - "legal": "Legal", - "letter": "Carta" - }, - "scaleFactor": { - "label": "Factor de escala" - }, - "submit": "Ajustar escala de página", - "tags": "redimensionar,modificar,dimensión,adaptar", - "title": "Ajustar escala de página", "tooltip": { - "description": { - "text": "Ajuste el tamaño del contenido del PDF y cambie las dimensiones de página.", - "title": "Descripción" - }, - "header": { - "title": "Descripción general de configuración de escala de página" - }, - "pageSize": { - "text": "Establece las dimensiones de las páginas del PDF de salida. 'Mantener tamaño original' conserva las dimensiones actuales, mientras que otras opciones redimensionan a tamaños de papel estándar.", - "title": "Tamaño de página de destino" - }, - "scaleFactor": { - "bullet1": "1.0 = Tamaño original", - "bullet2": "0.5 = Mitad del tamaño (50% más pequeño)", - "bullet3": "2.0 = Doble tamaño (200% más grande, puede recortarse)", - "text": "Controla el tamaño del contenido en la página. El contenido se escala y se centra; si el contenido escalado es más grande que el tamaño de página, puede recortarse.", - "title": "Factor de escala" - } + "description": "Eliminar la protección con contraseña requiere la contraseña que se usó para cifrar el PDF. Esto descifrará el documento, haciéndolo accesible sin contraseña." + }, + "submit": "Eliminar", + "results": { + "title": "PDF Descifrados" + }, + "header": "Eliminar contraseña (desencriptar)", + "selectText": { + "1": "Seleccionar PDF para desencriptar", + "2": "Contraseña" } }, - "app": { - "description": "La alternativa gratuita a Adobe Acrobat (más de 10 millones de descargas)" - }, - "applyAndContinue": "Aplicar y continuar", "automate": { - "config": { - "cancel": "Cancelar", - "description": "Configure los ajustes para esta herramienta. Estos ajustes se aplicarán cuando se ejecute la automatización.", - "loading": "Cargando configuración de herramienta...", - "noSettings": "Esta herramienta no tiene ajustes configurables.", - "save": "Guardar configuración", - "title": "Configurar {{toolName}}" + "title": "Automatizar", + "desc": "Cree flujos de trabajo de varios pasos encadenando acciones de PDF. Ideal para tareas recurrentes.", + "invalidStep": "Paso inválido", + "files": { + "placeholder": "Seleccione archivos para procesar con esta automatización" + }, + "selection": { + "title": "Selección de automatización", + "saved": { + "title": "Guardados" + }, + "createNew": { + "title": "Crear nueva automatización" + }, + "suggested": { + "title": "Sugeridos" + } }, - "copyToSaved": "Copiar a guardados", "creation": { "createTitle": "Crear automatización", - "description": { - "label": "Descripción (opcional)", - "placeholder": "Describa qué hace esta automatización..." - }, "editTitle": "Editar automatización", - "icon": { - "label": "Icono" - }, "intro": "Las automatizaciones ejecutan herramientas de forma secuencial. Para comenzar, añada herramientas en el orden en que desea que se ejecuten.", "name": { "label": "Nombre de automatización", "placeholder": "Mi automatización" }, - "save": "Guardar automatización", + "description": { + "label": "Descripción (opcional)", + "placeholder": "Describa qué hace esta automatización..." + }, "tools": { - "add": "Añadir una herramienta...", - "addTool": "Añadir herramienta", + "selectTool": "Seleccionar una herramienta...", + "selected": "Herramientas seleccionadas", + "remove": "Eliminar herramienta", "configure": "Configurar herramienta", "notConfigured": "! No configurado", - "remove": "Eliminar herramienta", - "selectTool": "Seleccionar una herramienta...", - "selected": "Herramientas seleccionadas" + "addTool": "Añadir herramienta", + "add": "Añadir una herramienta..." }, + "save": "Guardar automatización", "unsavedChanges": { - "cancel": "Cancelar", - "confirm": "Volver", + "title": "Cambios sin guardar", "message": "Tiene cambios sin guardar. ¿Está seguro de que desea volver? Se perderán todos los cambios.", - "title": "Cambios sin guardar" + "cancel": "Cancelar", + "confirm": "Volver" + }, + "icon": { + "label": "Icono" } }, - "desc": "Cree flujos de trabajo de varios pasos encadenando acciones de PDF. Ideal para tareas recurrentes.", - "files": { - "placeholder": "Seleccione archivos para procesar con esta automatización" - }, - "invalidStep": "Paso inválido", - "reviewTitle": "Resultados de automatización", "run": { "title": "Ejecutar automatización" }, - "selection": { - "createNew": { - "title": "Crear nueva automatización" - }, - "saved": { - "title": "Guardados" - }, - "suggested": { - "title": "Sugeridos" - }, - "title": "Selección de automatización" - }, "sequence": { - "finish": "Finalizar", - "run": "Ejecutar automatización", - "running": "Ejecutando automatización...", + "unnamed": "Automatización sin nombre", "steps": "{{count}} pasos", - "unnamed": "Automatización sin nombre" + "running": "Ejecutando automatización...", + "run": "Ejecutar automatización", + "finish": "Finalizar" }, - "title": "Automatizar" + "reviewTitle": "Resultados de automatización", + "config": { + "loading": "Cargando configuración de herramienta...", + "noSettings": "Esta herramienta no tiene ajustes configurables.", + "title": "Configurar {{toolName}}", + "description": "Configure los ajustes para esta herramienta. Estos ajustes se aplicarán cuando se ejecute la automatización.", + "cancel": "Cancelar", + "save": "Guardar configuración" + }, + "copyToSaved": "Copiar a guardados" }, "automation": { "suggested": { - "emailPreparation": "Preparación de correo electrónico", - "emailPreparationDesc": "Optimiza PDFs para distribución por correo electrónico comprimiendo archivos, dividiendo documentos grandes en fragmentos de 20 MB para compatibilidad con correo electrónico, y eliminando metadatos para privacidad.", - "processImages": "Procesar imágenes", - "processImagesDesc": "Convierte varios archivos de imagen en un solo documento PDF, luego aplica tecnología OCR para extraer texto con capacidad de búsqueda de las imágenes.", "securePdfIngestion": "Ingesta segura de PDF", "securePdfIngestionDesc": "Flujo de trabajo integral de procesamiento de PDF que sanea documentos, aplica OCR con limpieza, convierte a formato PDF/A para archivo a largo plazo y optimiza el tamaño del archivo.", + "emailPreparation": "Preparación de correo electrónico", + "emailPreparationDesc": "Optimiza PDFs para distribución por correo electrónico comprimiendo archivos, dividiendo documentos grandes en fragmentos de 20 MB para compatibilidad con correo electrónico, y eliminando metadatos para privacidad.", "secureWorkflow": "Flujo de trabajo de seguridad", - "secureWorkflowDesc": "Asegura documentos PDF eliminando contenido potencialmente malicioso como JavaScript y archivos incrustados, luego añade protección con contraseña para evitar acceso no autorizado. La contraseña se establece en 'password' de forma predeterminada." + "secureWorkflowDesc": "Asegura documentos PDF eliminando contenido potencialmente malicioso como JavaScript y archivos incrustados, luego añade protección con contraseña para evitar acceso no autorizado. La contraseña se establece en 'password' de forma predeterminada.", + "processImages": "Procesar imágenes", + "processImagesDesc": "Convierte varios archivos de imagen en un solo documento PDF, luego aplica tecnología OCR para extraer texto con capacidad de búsqueda de las imágenes." } }, - "bookletImposition": { - "addBorder": { - "label": "Añadir bordes alrededor de las páginas", - "tooltip": "Añade bordes alrededor de cada sección de página para ayudar con el corte y la alineación" - }, - "addGutter": { - "label": "Añadir margen de medianil", - "tooltip": "Añade espacio de margen interior para encuadernación" - }, - "advanced": { - "toggle": "Opciones avanzadas" - }, - "doubleSided": { - "label": "Impresión a doble cara", - "tooltip": "Crea ambos lados frontal y posterior para impresión de folleto adecuada" - }, - "duplexPass": { - "first": "Primera pasada", - "firstInstructions": "Imprime lados frontales → apile boca abajo → ejecute de nuevo con segunda pasada", - "label": "Pasada de impresión", - "second": "Segunda pasada", - "secondInstructions": "Cargue la pila impresa boca abajo → imprime lados posteriores" - }, - "error": { - "failed": "Se produjo un error al crear la imposición de folleto." - }, - "flipOnShortEdge": { - "label": "Voltear por borde corto (solo dúplex automático)", - "manualNote": "No necesario en modo manual: usted voltea la pila manualmente", - "tooltip": "Active para impresión dúplex por borde corto (solo dúplex automático - ignorado en modo manual)" - }, - "gutterSize": { - "label": "Tamaño de medianil (puntos)" - }, - "header": "Imposición de folleto", - "manualDuplex": { - "instructions": "Para impresoras sin dúplex automático. Necesitará ejecutar esto dos veces:", - "title": "Modo dúplex manual" - }, - "paperSizeNote": "El tamaño del papel se deriva automáticamente de su primera página.", - "rtlBinding": { - "label": "Encuadernación de derecha a izquierda", - "tooltip": "Para árabe, hebreo u otros idiomas de derecha a izquierda" - }, - "spineLocation": { - "label": "Ubicación del lomo", - "left": "Izquierda (Estándar)", - "right": "Derecha (RTL)" - }, - "submit": "Crear folleto", - "tags": "folleto,imposición,impresión,encuadernación,plegado,signatura", - "title": "Imposición de folleto", - "tooltip": { - "advanced": { - "bullet1": "Encuadernación de derecha a izquierda: Para árabe, hebreo o idiomas RTL", - "bullet2": "Bordes: Muestra líneas de corte para recortar", - "bullet3": "Margen de medianil: Añade espacio para encuadernación/grapado", - "bullet4": "Volteo por borde corto: Solo para impresoras dúplex automáticas", - "text": "Ajuste fino de su folleto:", - "title": "Opciones avanzadas" - }, - "description": { - "text": "Crea folletos profesionales organizando las páginas en el orden de impresión correcto. Las páginas de su PDF se colocan de 2 en 2 en hojas horizontales, de modo que cuando se doblan y se encuadernan, se lean en la secuencia adecuada como un libro real.", - "title": "¿Qué es la imposición de folleto?" - }, - "example": { - "bullet1": "Hoja 1 frontal: Páginas 8, 1 | Posterior: Páginas 2, 7", - "bullet2": "Hoja 2 frontal: Páginas 6, 3 | Posterior: Páginas 4, 5", - "bullet3": "Cuando se dobla y apila: Lee 1→2→3→4→5→6→7→8", - "text": "Su documento de 8 páginas se convierte en 2 hojas:", - "title": "Ejemplo: Folleto de 8 páginas" - }, - "header": { - "title": "Guía de creación de folletos" - }, - "manualDuplex": { - "bullet1": "Desactive 'Impresión a doble cara'", - "bullet2": "Seleccione 'Primera pasada' → Imprimir → Apile boca abajo", - "bullet3": "Seleccione 'Segunda pasada' → Cargue pila → Imprima posteriores", - "bullet4": "Doble y ensamble normalmente", - "text": "Para impresoras sin dúplex automático:", - "title": "Dúplex manual (impresoras de una cara)" - }, - "printing": { - "bullet1": "Imprima a doble cara con 'Voltear por borde largo'", - "bullet2": "Apile hojas en orden, doble por la mitad", - "bullet3": "Grape o encuaderne a lo largo del lomo doblado", - "bullet4": "Para impresoras de borde corto: Active la opción 'Voltear por borde corto'", - "text": "Siga estos pasos para folletos perfectos:", - "title": "Cómo imprimir y ensamblar" - } - } - }, - "bulkSelection": { - "advanced": { - "title": "Avanzado" - }, - "everyNthPage": { - "placeholder": "Tamaño de paso", - "title": "Cada enésima página" - }, - "examples": { - "combineSets": "Combinar conjuntos", - "every3rd": "Cada tercera", - "first50": "Primeras 50", - "last50": "Últimas 50", - "oddWithinExcluding": "Impares dentro de 1-20 excluyendo 5-7", - "title": "Ejemplos" - }, - "firstNPages": { - "placeholder": "Número de páginas", - "title": "Primeras N páginas" - }, - "header": { - "title": "Guía de selección de páginas" - }, - "keywords": { - "title": "Palabras clave" - }, - "lastNPages": { - "placeholder": "Número de páginas", - "title": "Últimas N páginas" - }, - "operators": { - "and": "AND: & o \"and\" — requiere ambas condiciones (ej., 1-50 & even)", - "comma": "Coma: , o | — combina selecciones (ej., 1-10, 20)", - "not": "NOT: ! o \"not\" — excluye páginas (ej., 3n & not 30)", - "text": "AND tiene mayor precedencia que la coma. NOT se aplica dentro del rango del documento.", - "title": "Operadores" - }, - "range": { - "fromPlaceholder": "Desde", - "title": "Rango", - "toPlaceholder": "Hasta" - }, - "syntax": { - "bullets": { - "keywords": "Palabras clave: odd, even", - "numbers": "Números/rangos: 5, 10-20", - "progressions": "Progresiones: 3n, 4n+1" - }, - "text": "Use números, rangos, palabras clave y progresiones (n comienza en 0). Se admiten paréntesis.", - "title": "Conceptos básicos de sintaxis" - } - }, - "chooseFile": "Elegir Archivo", - "comingSoon": "Próximamente", "common": { + "copy": "Copiar", + "copied": "¡Copiado!", + "refresh": "Actualizar", + "retry": "Reintentar", + "remaining": "restante", + "used": "usado", "available": "disponible", "cancel": "Cancelar", - "copied": "¡Copiado!", - "copy": "Copiar", - "refresh": "Actualizar", - "remaining": "restante", - "retry": "Reintentar", - "used": "usado" + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { - "guestDescription": "Ha iniciado sesión como invitado. Considere actualizar su cuenta arriba.", + "title": "Configuración de Cuenta", "manageAccountPreferences": "Administre las preferencias de su cuenta", - "title": "Configuración de Cuenta" + "guestDescription": "Ha iniciado sesión como invitado. Considere actualizar su cuenta arriba." }, "upgrade": { - "description": "¡Vincule su cuenta para preservar su historial y acceder a más funciones!", - "email": "Correo electrónico", - "emailPassword": "o ingrese su correo electrónico y contraseña", - "emailPlaceholder": "Ingrese su correo electrónico", - "linkWith": "Vincular con", - "password": "Contraseña (opcional)", - "passwordNote": "Deje vacío para usar solo verificación por correo electrónico", - "passwordPlaceholder": "Establecer una contraseña", - "socialLogin": "Actualizar con Cuenta Social", "title": "Actualizar Cuenta de Invitado", + "description": "¡Vincule su cuenta para preservar su historial y acceder a más funciones!", + "socialLogin": "Actualizar con Cuenta Social", + "linkWith": "Vincular con", + "emailPassword": "o ingrese su correo electrónico y contraseña", + "email": "Correo electrónico", + "emailPlaceholder": "Ingrese su correo electrónico", + "password": "Contraseña (opcional)", + "passwordPlaceholder": "Establecer una contraseña", + "passwordNote": "Deje vacío para usar solo verificación por correo electrónico", "upgradeButton": "Actualizar Cuenta" } }, "apiKeys": { - "chartAriaLabel": "Uso de créditos: incluidos {{includedUsed}} de {{includedTotal}}, comprados {{purchasedUsed}} de {{purchasedTotal}}", - "copyKeyAriaLabel": "Copiar clave API", "description": "Su clave API para acceder al conjunto de herramientas PDF de Stirling. Cópiela a su proyecto o actualice para generar una nueva.", - "generateError": "No pudimos generar su clave API.", - "goToAccount": "Ir a Cuenta", - "guestInfo": "Los usuarios invitados no reciben claves API. Cree una cuenta para obtener una clave API que pueda usar en sus aplicaciones.", - "includedCredits": "Créditos incluidos", - "label": "Clave API", - "lastApiUse": "Último Uso de API", - "nextReset": "Próximo Restablecimiento", - "overlayMessage": "Genere una clave para ver créditos y créditos disponibles", "publicKeyAriaLabel": "Clave API pública", - "purchasedCredits": "Créditos comprados", + "copyKeyAriaLabel": "Copiar clave API", "refreshAriaLabel": "Actualizar clave API", + "includedCredits": "Créditos incluidos", + "purchasedCredits": "Créditos comprados", + "totalCredits": "Créditos Totales", + "chartAriaLabel": "Uso de créditos: incluidos {{includedUsed}} de {{includedTotal}}, comprados {{purchasedUsed}} de {{purchasedTotal}}", + "nextReset": "Próximo Restablecimiento", + "lastApiUse": "Último Uso de API", + "overlayMessage": "Genere una clave para ver créditos y créditos disponibles", + "label": "Clave API", + "guestInfo": "Los usuarios invitados no reciben claves API. Cree una cuenta para obtener una clave API que pueda usar en sus aplicaciones.", + "goToAccount": "Ir a Cuenta", "refreshModal": { - "confirmCta": "Actualizar Claves", - "confirmPrompt": "¿Está seguro de que desea continuar?", - "impact": "Cualquier aplicación o servicio que esté utilizando actualmente estas claves dejará de funcionar hasta que las actualice con las nuevas claves.", "title": "Actualizar Claves API", - "warning": "⚠️ Advertencia: Esta acción generará nuevas claves API y hará que sus claves anteriores sean inválidas." + "warning": "⚠️ Advertencia: Esta acción generará nuevas claves API y hará que sus claves anteriores sean inválidas.", + "impact": "Cualquier aplicación o servicio que esté utilizando actualmente estas claves dejará de funcionar hasta que las actualice con las nuevas claves.", + "confirmPrompt": "¿Está seguro de que desea continuar?", + "confirmCta": "Actualizar Claves" }, - "totalCredits": "Créditos Totales" + "generateError": "No pudimos generar su clave API." } }, - "discardChanges": "Descartar cambios", - "edit": "Editar", - "editYourNewFiles": "Editar sus nuevos archivos", - "exportAndContinue": "Exportar y continuar", - "fileSelected": "Archivo seleccionado: {{filename}}", - "files": { - "addFiles": "Agregar archivos", - "selectFromWorkbench": "Seleccione archivos del área de trabajo o ", - "selectMultipleFromWorkbench": "Seleccione al menos {{count}} archivos del área de trabajo o ", - "title": "Archivos", - "upload": "Cargar", - "uploadFiles": "Cargar Archivos" - }, - "guestBanner": { - "dismiss": "Descartar banner", - "message": "Cree una cuenta gratuita para guardar su trabajo, acceder a más funciones y apoyar el proyecto.", - "signUp": "Registrarse Gratis", - "title": "¡Está usando Stirling PDF como invitado!" - }, - "keepWorking": "Seguir trabajando", - "landing": { - "addFiles": "Agregar Archivos", - "uploadFromComputer": "Cargar desde el ordenador" + "AddAttachmentsRequest": { + "attachments": "Seleccionar archivos adjuntos", + "info": "Seleccione archivos para adjuntar a su PDF. Estos archivos se incrustarán y serán accesibles a través del panel de archivos adjuntos del PDF.", + "selectFiles": "Seleccionar archivos para adjuntar", + "placeholder": "Elegir archivos...", + "addMoreFiles": "Añadir más archivos...", + "selectedFiles": "Archivos seleccionados", + "submit": "Añadir archivos adjuntos", + "results": { + "title": "Resultados de archivos adjuntos" + }, + "error": { + "failed": "Add attachments operation failed" + } }, + "termsAndConditions": "Términos y Condiciones", "logOut": "Cerrar sesión", - "moreOptions": "Más Opciones", - "pageEditor": { - "actualSize": "Tamaño Real", - "addFileNotImplemented": "Agregar archivo no implementado en la demostración", - "closePdf": "Cerrar PDF", - "deleted": "Eliminado:", - "fitToWidth": "Ajustar al Ancho", - "insertedPageBreak": "Salto de página insertado en:", - "movedLeft": "Movido a la izquierda:", - "movedRight": "Movido a la derecha:", - "noPdfLoaded": "No hay PDF cargado. Por favor, cargue un PDF para editar.", - "reset": "Restablecer Cambios", - "rotatedLeft": "Girado a la izquierda:", - "rotatedRight": "Girado a la derecha:", - "save": "Guardar Cambios", - "splitAt": "Dividir en:", - "title": "Editor de Páginas", - "zoomIn": "Acercar", - "zoomOut": "Alejar" + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } }, - "pageSelection": { - "tooltip": { - "advanced": { - "title": "Funciones Avanzadas" + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Opciones para Reemplazar o Invertir color", + "2": "Predeterminado (Colores de alto contraste predeterminados)", + "3": "Personalizado (Colores personalizados)", + "4": "Invertir Completo (Invertir todos los colores)", + "5": "Opciones de color de alto contraste", + "6": "Texto blanco sobre fondo negro", + "7": "Texto negro sobre fondo blanco", + "8": "Texto amarillo sobre fondo negro", + "9": "Texto verde sobre fondo negro", + "10": "Elegir Color de Texto", + "11": "Elegir Color de Fondo", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Reemplazar", + "title": "Reemplazar-Invertir-Color", + "header": "Reemplazar-Invertir Color en PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." }, - "basic": { - "bullet1": "Páginas individuales: 1,3,5", - "bullet2": "Rangos de páginas: 3-6 o 10-15", - "bullet3": "Todas las páginas: all", - "text": "Seleccione páginas específicas de su documento PDF utilizando sintaxis simple.", - "title": "Uso Básico" + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." }, - "examples": { - "title": "Ejemplos" + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" }, - "header": { - "title": "Guía de Selección de Páginas" + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" }, - "operators": { - "and": "Y: & o \"and\" — requiere ambas condiciones (por ejemplo, 1-50 & even)", - "comma": "Coma: , o | — combina selecciones (por ejemplo, 1-10, 20)", - "not": "NO: ! o \"not\" — excluye páginas (por ejemplo, 3n & not 30)", - "text": "Y tiene mayor precedencia que la coma. NO se aplica dentro del rango del documento.", - "title": "Operadores" + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" }, - "syntax": { - "bullets": { - "keywords": "Palabras clave: odd, even", - "numbers": "Números/rangos: 5, 10-20", - "progressions": "Progresiones: 3n, 4n+1" - }, - "text": "Use números, rangos, palabras clave y progresiones (n comienza en 0). Se admiten paréntesis.", - "title": "Conceptos Básicos de Sintaxis" + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" }, - "tips": { - "bullet1": "Los números de página comienzan desde 1 (no 0)", - "bullet2": "Los espacios se eliminan automáticamente", - "bullet3": "Las expresiones no válidas se ignoran", - "text": "Tenga en cuenta estas pautas:", - "title": "Consejos" + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" } } }, - "removeMetadata": { - "submit": "Eliminar Metadatos" + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } }, - "replaceColor": { - "tags": "Reemplazar Color,Operaciones de página,Back end,lado del servidor" + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" }, - "review": "Revisar", - "scannerImageSplit": { + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { "error": { - "failed": "Se produjo un error al extraer escaneos de imágenes." + "title": "Error loading audit system" }, - "submit": "Extraer Escaneos de Imágenes", - "title": "Imágenes Extraídas", - "tooltip": { - "headsUp": "Advertencia", - "headsUpDesc": "Las fotos superpuestas o fondos muy cercanos en color a las fotos pueden reducir la precisión; intente usar un fondo más claro u oscuro y deje más espacio.", - "problem1": "Fotos no detectadas → aumente la Tolerancia a 30-50", - "problem2": "Demasiadas detecciones falsas → aumente el Área Mínima a 15,000-20,000", - "problem3": "Los recortes son demasiado ajustados → aumente el Tamaño del Borde a 5-10", - "problem4": "Fotos inclinadas no enderezadas → reduzca el Umbral de Ángulo a ~5°", - "problem5": "Cuadros de polvo/ruido → aumente el Área Mínima de Contorno a 1000-2000", - "quickFixes": "Soluciones rápidas", - "setupTips": "Consejos de configuración", - "tip1": "Use un fondo plano y claro", - "tip2": "Deje un pequeño espacio (≈1 cm) entre fotos", - "tip3": "Escanee a 300-600 DPI", - "tip4": "Limpie el cristal del escáner", - "title": "Divisor de Fotos", - "useCase1": "Escanee páginas completas de álbumes de una sola vez", - "useCase2": "Divida lotes de cama plana en archivos separados", - "useCase3": "Divida collages en fotos individuales", - "useCase4": "Extraiga fotos de documentos", - "whatThisDoes": "Qué hace esto", - "whatThisDoesDesc": "Encuentra y extrae automáticamente cada foto de una página escaneada o imagen compuesta, sin recorte manual.", - "whenToUse": "Cuándo usar" + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" } }, - "search": { - "placeholder": "Ingrese término de búsqueda...", - "title": "Buscar PDF" - }, - "sidebar": { - "toggle": "Alternar Barra Lateral" - }, - "signup": { - "accountCreatedSuccessfully": "¡Cuenta creada con éxito! Ahora puede iniciar sesión.", - "alreadyHaveAccount": "¿Ya tiene una cuenta? Iniciar sesión", - "checkEmailConfirmation": "Verifique su correo electrónico para obtener un enlace de confirmación y completar su registro.", - "confirmPassword": "Confirmar contraseña", - "confirmPasswordPlaceholder": "Confirmar contraseña", - "creatingAccount": "Creando Cuenta...", - "email": "Correo electrónico", - "enterEmail": "Ingrese su correo electrónico", - "enterName": "Ingrese su nombre", - "enterPassword": "Ingrese su contraseña", - "invalidEmail": "Por favor, ingrese una dirección de correo electrónico válida", - "name": "Nombre", - "or": "o", - "password": "Contraseña", - "passwordTooShort": "La contraseña debe tener al menos 6 caracteres", - "passwordsDoNotMatch": "Las contraseñas no coinciden", - "pleaseFillAllFields": "Por favor, complete todos los campos", - "signUp": "Registrarse", - "subtitle": "Únase a Stirling PDF para comenzar", - "title": "Crear una cuenta", - "unexpectedError": "Error inesperado: {{message}}" - }, - "storage": { - "approximateSize": "Tamaño aproximado", - "fileTooLarge": "Archivo demasiado grande. El tamaño máximo por archivo es", - "storageFull": "El almacenamiento está casi lleno. Considere eliminar algunos archivos.", - "storageLimit": "Límite de almacenamiento", - "storageQuotaExceeded": "Cuota de almacenamiento excedida. Por favor, elimine algunos archivos antes de cargar más.", - "storageUsed": "Almacenamiento temporal utilizado", - "temporaryNotice": "Los archivos se almacenan temporalmente en su navegador y pueden eliminarse automáticamente" - }, - "swagger": { - "desc": "Ver y probar los endpoints de la API de Stirling PDF", - "header": "Documentación de API", - "tags": "api,documentación,swagger,endpoints,desarrollo", - "title": "Documentación de API" - }, - "termsAndConditions": "Términos y Condiciones", - "theme": { - "toggle": "Alternar Tema" - }, - "toolPicker": { - "allTools": "TODAS LAS HERRAMIENTAS", - "categories": { - "advancedTools": "Herramientas Avanzadas", - "recommendedTools": "Herramientas Recomendadas", - "standardTools": "Herramientas Estándar" + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } }, - "noToolsFound": "No se encontraron herramientas", - "quickAccess": "ACCESO RÁPIDO", - "searchPlaceholder": "Buscar herramientas...", - "subcategories": { - "advancedFormatting": "Formato Avanzado", - "automation": "Automatización", - "developerTools": "Herramientas de Desarrollo", - "documentReview": "Revisión de Documentos", - "documentSecurity": "Seguridad de Documentos", - "extraction": "Extracción", - "general": "General", - "pageFormatting": "Formato de Página", - "removal": "Eliminación", - "signing": "Firma", - "verification": "Verificación" + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" } }, - "undoOperationTooltip": "Haga clic para deshacer la última operación y restaurar los archivos originales", - "unsavedChanges": "Tiene cambios sin guardar en su PDF. ¿Qué le gustaría hacer?", - "unsavedChangesTitle": "Cambios sin Guardar", - "view": { - "fileManager": "Gestor de Archivos", - "pageEditor": "Editor de Páginas", - "viewer": "Visor" + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" }, - "viewer": { - "dualPageView": "Vista de Página Doble", - "firstPage": "Primera Página", - "lastPage": "Última Página", - "nextPage": "Página Siguiente", - "previousPage": "Página Anterior", - "singlePageView": "Vista de Página Única", - "zoomIn": "Acercar", - "zoomOut": "Alejar" + "WorkInProgress": "Tarea en progreso, puede no funcionar o ralentizarse; ¡por favor, informe de cualquier problema!", + "autoRedact": { + "tags": "Redactar,Ocultar,ocultar,negro,subrayador,oculto", + "title": "Auto Censurar Texto", + "header": "Auto Censurar Texto", + "colorLabel": "Color", + "textsToRedactLabel": "Texto para Censurar (separado por líneas)", + "textsToRedactPlaceholder": "por ej. \\nConfidencial \\nAlto-Secreto", + "useRegexLabel": "Usar Regex", + "wholeWordSearchLabel": "Búsqueda por palabra completa", + "customPaddingLabel": "Espaciado adicional personalizado", + "convertPDFToImageLabel": "Convertir PDF a imagen PDF (Utilizado para eliminar el texto detrás del cajetín de censura)", + "submitButton": "Enviar" }, - "warning": { - "tooltipTitle": "Advertencia" + "replaceColorPdf": { + "tags": "Reemplazar Color,Operaciones de Página,Back end,Backend" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/eu-ES/translation.json b/frontend/public/locales/eu-ES/translation.json index 2a2264977..963783e50 100644 --- a/frontend/public/locales/eu-ES/translation.json +++ b/frontend/public/locales/eu-ES/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Testu pertsonalizatua", "numberPagesDesc": "Zein orri numeratu, lehenetsita 'denak', 1-5 edo 2,5,9 etab onartzen ditu", "customNumberDesc": "Lehenetsoa {n}-ra, '{n} orria {total}-tik', 'Text-{n}', '{filename}-{n}' ere onartzen du", - "submit": "Gehitu orrialde-zenbakiak" + "submit": "Gehitu orrialde-zenbakiak", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Hautatu PDFa(k)", "multiPdfPrompt": "Hautatu PDFak (2+)", "multiPdfDropPrompt": "Hautatu (edo arrastatu eta jaregin) nahi dituzun PDFak", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Oharra: prozesu honetarako minutu bat ere beharko da fitxategiaren tamaiaren arabera", "pageOrderPrompt": "Orrialdeen ordena (sartu komaz bereizitako orrialde-zenbakien zerrenda)", - "pageSelectionPrompt": "Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :", "goToPage": "Joan", "true": "Egiazkoa", "false": "Faltsua", "unknown": "Ezezaguna", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Gorde", "saveToBrowser": "Save to Browser", + "download": "Distira", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Itxi", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "Hautatutako fitxategiak", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Ez dira gogokoak gehitu", "downloadComplete": "Download Complete", "bored": "Itxaroten aspertuta?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF dokumentua pasahitzarekin babestuta dago eta pasahitza ez da sartu edo okerra da", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Error", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Sorry for the issue!", "needHelp": "Need help / Found an issue?", "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:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Submit a ticket", "discordSubmit": "Discord - Submit Support post" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "ezabatu", "username": "Erabiltzaile izena", "password": "Pasahitza", @@ -82,6 +169,7 @@ "green": "Berdea", "blue": "Urdina", "custom": "Pertsonalizatu...", + "comingSoon": "Coming soon", "WorkInProgess": "Work in progress, May not work or be buggy, Please report any problems!", "poweredBy": "Powered by", "yes": "Yes", @@ -115,12 +203,14 @@ "page": "Page", "pages": "Pages", "loading": "Loading...", + "review": "Review", "addToDoc": "Add to Document", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Privacy Policy", + "iAgreeToThe": "I agree to all of the", "terms": "Terms and Conditions", "accessibility": "Accessibility", "cookie": "Cookie Policy", @@ -160,6 +250,7 @@ "title": "Do you want make Stirling PDF better?", "paragraph1": "Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.", "paragraph2": "Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.", + "learnMore": "Learn more", "enable": "Enable analytics", "disable": "Disable analytics", "settings": "You can change the settings for analytics in the config/settings.yml file" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Save form inputs", "help": "Enable to store previously used inputs for future runs" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Database Import/Export", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Erabilera anitzeko tresna PDF", "desc": "Orriak konbinatu, biratu, berrantolatu eta ezabatu" }, "merge": { + "tags": "combine,join,unite", "title": "Elkartu", "desc": "Elkartu zenbait PDF dokumentu bakar batean modu errazean" }, "split": { + "tags": "divide,separate,break", "title": "Zatitu", "desc": "Zatitu PDFak zenbait dokumentutan" }, "rotate": { + "tags": "turn,flip,orient", "title": "Biratu", "desc": "Biratu PDFak modu errazean" }, + "convert": { + "tags": "transform,change", + "title": "Bihurtu", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Antolatzailea", + "desc": "Ezabatu/Berrantolatu orrialdeak edozein ordenatan" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Gehitu irudia PDFari", + "desc": "Gehitu irudi bat PDFan ezarritako kokaleku batean (lanean)" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Gehitu ur-marka", + "desc": "Gehitu aurrez zehaztutako ur-marka bat PFD dokumentuari" + }, + "removePassword": { + "tags": "unlock", + "title": "Ezabatu pasahitza", + "desc": "Ezabatu pasahitza PDF dokumentutik" + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Konprimatu", + "desc": "Konprimatu PDFak fitxategiaren tamaina murrizteko" + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Aldatu metadatuak", + "desc": "Aldatu/Ezabatu/Gehitu metadatuak PDF dokumentuari" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR exekutatu PDFan eta/edo garbiketa-eskaneatzeak", + "desc": "Garbiketa-eskaneatzeak eta irudi-testuak detektatu PDF baten barruan eta berriz ere gehitu testu gisa" + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Atera irudiak", + "desc": "Atera irudi guztiak PDF batetik eta ZIPen gorde" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Sinatu", + "desc": "Gehitu sinadura PDFari marrazki, testu edo irudi bidez" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Lautu", + "desc": "PDF batetik elementu eta inprimaki interaktibo guztiak ezabatu" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Sinatu ziurtagiriarekin", + "desc": "Sinatu PDF bat Ziurtagiri/Gako batekin (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Konpondu", + "desc": "Saiatu PDF hondatu/kaltetu bat konpontzen" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Ezabatu orrialde zuriak", + "desc": "Detektatu orrialde zuriak eta dokumentutik ezabatu" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Remove Annotations", + "desc": "Removes all comments/annotations from a PDF" + }, + "compare": { + "tags": "difference", + "title": "Konparatu", + "desc": "Konparatu eta erakutsi 2 PDF dokumenturen aldeak" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Remove Certificate Sign", + "desc": "Remove certificate signature from PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Zenbait orrialderen diseinua", + "desc": "Elkartu orri bakar batean PDF dokumentu baten zenbait orrialde" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Eskalatu/Doitu orrialdearen tamaina", + "desc": "Eskalatu/Aldatu orrialde baten tamaina eta/edo edukia" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Gehitu orrialde-zenbakiak", + "desc": "Gehitu orrialde-zenbakiak dokumentu batean, kokapen jakin batean" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Koloreak/kontrastea doitu", + "desc": "PDF baten kontrastea, saturazioa eta distira doitzea" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Moztu PDF", + "desc": "Egin klik PDFn tamaina txikitzeko (textua mantentzen du!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Orriak automatikoki banandu", + "desc": "Auto Split Scanned PDF with physical scanned page splitter QR Code" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Lortu informazio guztia PDF-tik", + "desc": "Eskuratu PDF fitxategiko Informazio guztia" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF fitxategia, orrialde handi bakar batera", + "desc": "PDF orri guztiak orri handi bakar batean konbinatzen ditu" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Javascript erakutsi", + "desc": "Bilatu eta erakutsi PDF batean injektatutako edozein JS" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Remove image", + "desc": "Remove image from PDF to reduce file size" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Split PDF by Chapters", + "desc": "Split a PDF into multiple files based on its chapter structure." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Atera orriak", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Ezabatu", + "desc": "Ezabatu nahi ez dituzun orrialdeak PDF dokumentutik" + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Auto Split by Size/Count", + "desc": "Split a single PDF into multiple documents based on size, page count, or document count" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Gehitu pasahitza", + "desc": "Enkriptatu PDF dokumentua pasahitz batekin" + }, + "changePermissions": { + "title": "Aldatu baimenak", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Overlays PDFs on-top of another PDF", + "title": "Overlay PDFs" + }, "imageToPDF": { "title": "Irudia PDF bihurtu", "desc": "Irudi bat(PNG, JPEG, GIF)PDF bihurtu" @@ -355,18 +786,6 @@ "title": "PDFa irudi bihurtu", "desc": "PDF bat irudi (PNG, JPEG, GIF) bihurtu" }, - "pdfOrganiser": { - "title": "Antolatzailea", - "desc": "Ezabatu/Berrantolatu orrialdeak edozein ordenatan" - }, - "addImage": { - "title": "Gehitu irudia PDFari", - "desc": "Gehitu irudi bat PDFan ezarritako kokaleku batean (lanean)" - }, - "watermark": { - "title": "Gehitu ur-marka", - "desc": "Gehitu aurrez zehaztutako ur-marka bat PFD dokumentuari" - }, "permissions": { "title": "Aldatu baimenak", "desc": "Aldatu PDF dokumentuaren baimenak" @@ -375,38 +794,10 @@ "title": "Ezabatu", "desc": "Ezabatu nahi ez dituzun orrialdeak PDF dokumentutik" }, - "addPassword": { - "title": "Gehitu pasahitza", - "desc": "Enkriptatu PDF dokumentua pasahitz batekin" - }, - "removePassword": { - "title": "Ezabatu pasahitza", - "desc": "Ezabatu pasahitza PDF dokumentutik" - }, - "compress": { - "title": "Konprimatu", - "desc": "Konprimatu PDFak fitxategiaren tamaina murrizteko" - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Aldatu metadatuak", - "desc": "Aldatu/Ezabatu/Gehitu metadatuak PDF dokumentuari" - }, "fileToPDF": { "title": "Fitxategia PDF bihurtu", "desc": "PDF bihurtu ia edozein fitxategi (DOCX, PNG, XLS, PPT, TXT eta gehiago)" }, - "ocr": { - "title": "OCR exekutatu PDFan eta/edo garbiketa-eskaneatzeak", - "desc": "Garbiketa-eskaneatzeak eta irudi-testuak detektatu PDF baten barruan eta berriz ere gehitu testu gisa" - }, - "extractImages": { - "title": "Atera irudiak", - "desc": "Atera irudi guztiak PDF batetik eta ZIPen gorde" - }, "pdfToPDFA": { "title": "PDFa PDF/A bihurtu", "desc": "PDFa PDF/A bihurtu luzaro biltegiratzeko" @@ -435,70 +826,14 @@ "title": "Detektatu/Zatitu argazki eskaneatuak", "desc": "Hainbat argazki zatitu argazki/PDF baten barruan" }, - "sign": { - "title": "Sinatu", - "desc": "Gehitu sinadura PDFari marrazki, testu edo irudi bidez" - }, - "flatten": { - "title": "Lautu", - "desc": "PDF batetik elementu eta inprimaki interaktibo guztiak ezabatu" - }, - "repair": { - "title": "Konpondu", - "desc": "Saiatu PDF hondatu/kaltetu bat konpontzen" - }, - "removeBlanks": { - "title": "Ezabatu orrialde zuriak", - "desc": "Detektatu orrialde zuriak eta dokumentutik ezabatu" - }, - "removeAnnotations": { - "title": "Remove Annotations", - "desc": "Removes all comments/annotations from a PDF" - }, - "compare": { - "title": "Konparatu", - "desc": "Konparatu eta erakutsi 2 PDF dokumenturen aldeak" - }, - "certSign": { - "title": "Sinatu ziurtagiriarekin", - "desc": "Sinatu PDF bat Ziurtagiri/Gako batekin (PEM/P12)" - }, - "removeCertSign": { - "title": "Remove Certificate Sign", - "desc": "Remove certificate signature from PDF" - }, - "pageLayout": { - "title": "Zenbait orrialderen diseinua", - "desc": "Elkartu orri bakar batean PDF dokumentu baten zenbait orrialde" - }, - "scalePages": { - "title": "Eskalatu/Doitu orrialdearen tamaina", - "desc": "Eskalatu/Aldatu orrialde baten tamaina eta/edo edukia" - }, "pipeline": { "title": "Hodia (Aurreratua)", "desc": "Egin hainbat ekintza PDFn, hodi-script-ak definituz" }, - "addPageNumbers": { - "title": "Gehitu orrialde-zenbakiak", - "desc": "Gehitu orrialde-zenbakiak dokumentu batean, kokapen jakin batean" - }, "auto-rename": { "title": "Auto Aldatu PDF fitxategiaren izena", "desc": "Automatikoki izena ematen dio detektatutako goiburuan oinarritutako PDF fitxategi bati" }, - "adjustContrast": { - "title": "Koloreak/kontrastea doitu", - "desc": "PDF baten kontrastea, saturazioa eta distira doitzea" - }, - "crop": { - "title": "Moztu PDF", - "desc": "Egin klik PDFn tamaina txikitzeko (textua mantentzen du!)" - }, - "autoSplitPDF": { - "title": "Orriak automatikoki banandu", - "desc": "Auto Split Scanned PDF with physical scanned page splitter QR Code" - }, "sanitizePDF": { "title": "Desinfektatu", "desc": "Ezabatu script-ak eta PDF fitxategietako beste elementu batzuk" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Lortu informazio guztia PDF-tik", - "desc": "Eskuratu PDF fitxategiko Informazio guztia" - }, "pageExtracter": { "title": "Orria(k) atera", "desc": "Aukeratutako orriak PDF fitxategitik atera" }, - "pdfToSinglePage": { - "title": "PDF fitxategia, orrialde handi bakar batera", - "desc": "PDF orri guztiak orri handi bakar batean konbinatzen ditu" - }, - "showJS": { - "title": "Javascript erakutsi", - "desc": "Bilatu eta erakutsi PDF batean injektatutako edozein JS" - }, "autoRedact": { "title": "Auto Idatzi", "desc": "Auto Idatzi testua pdf fitxategian sarrerako testuan oinarritua" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF to CSV", "desc": "Extracts Tables from a PDF converting it to CSV" @@ -551,10 +870,6 @@ "title": "Auto Split by Size/Count", "desc": "Split a single PDF into multiple documents based on size, page count, or document count" }, - "overlay-pdfs": { - "title": "Overlay PDFs", - "desc": "Overlays PDFs on-top of another PDF" - }, "split-by-sections": { "title": "Split PDF by Sections", "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" @@ -563,42 +878,17 @@ "title": "Add Stamp to PDF", "desc": "Add text or add image stamps at set locations" }, - "removeImage": { - "title": "Remove image", - "desc": "Remove image from PDF to reduce file size" - }, - "splitByChapters": { - "title": "Split PDF by Chapters", - "desc": "Split a PDF into multiple files based on its chapter structure." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" }, - "convert": { - "title": "Bihurtu" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Atera orriak" - }, - "removePages": { - "title": "Ezabatu", - "desc": "Ezabatu nahi ez dituzun orrialdeak PDF dokumentutik" - }, "removeImagePdf": { "title": "Remove image", "desc": "Remove image from PDF to reduce file size" }, - "autoSizeSplitPDF": { - "desc": "Split a single PDF into multiple documents based on size, page count, or document count" - }, "adjust-contrast": { "title": "Koloreak/kontrastea doitu", "desc": "PDF baten kontrastea, saturazioa eta distira doitzea" @@ -606,11 +896,12 @@ "replaceColorPdf": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" - }, - "changePermissions": { - "title": "Aldatu baimenak" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "view,read,annotate,text,image", "title": "View/Edit PDF", @@ -644,14 +935,39 @@ "merge": { "tags": "merge,Page operations,Back end,server side", "title": "Elkartu", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Elkartu", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "File Name", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Elkartu zenbait PDF (2+)", "sortByName": "Sort by nameOrdenatu izenaren arabera", "sortByDate": "Ordenatu dataren arabera", - "removeCertSign": "Remove digital signature in the merged file?", - "submit": "Elkartu" + "removeCertSign": "Remove digital signature in the merged file?" }, "split": { - "tags": "Page operations,divide,Multi Page,cut,server side", "title": "Zatitu PDFa", "header": "Zatitu PDFa", "desc": { @@ -667,15 +983,249 @@ "splitPages": "Sartu orrialdeak zatitzeko:", "submit": "Zatitu", "steps": { + "chooseMethod": "Choose Method", "settings": "Ezarpenak" - } + }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, + "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, + "bySize": { + "name": "File Size", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" + } + }, + "value": { + "fileSize": { + "label": "File Size", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" + } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Page operations,divide,Multi Page,cut,server side" }, "rotate": { - "tags": "server side", "title": "Biratu PDFa", + "submit": "Biratu", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "server side", "header": "Biratu PDFa", - "selectAngle": "Hautatu errotazio-angelua (90 graduko multiploetan):", - "submit": "Biratu" + "selectAngle": "Hautatu errotazio-angelua (90 graduko multiploetan):" + }, + "convert": { + "title": "Bihurtu", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Ezarpenak", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Color", + "greyscale": "Gris-eskala", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Fill Page", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "The PDF contains a digital signature. This will be removed in the next step.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Gris-eskala", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversion,img,jpg,picture,photo,psd,photoshop" @@ -713,7 +1263,33 @@ "8": "Remove Last", "9": "Remove First and Last", "10": "Odd-Even Merge", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)" }, @@ -725,9 +1301,198 @@ "upload": "Gehitu irudia", "submit": "Gehitu irudia" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo", "title": "Gehitu ur-marka", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Gehitu ur-marka", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Testua", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Font Size", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Text", + "2": "Image" + }, + "tags": "Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo", "header": "Gehitu ur-marka", "customColor": "Custom Text Color", "selectText": { @@ -741,14 +1506,6 @@ "8": "Watermark Type:", "9": "Watermark Image:", "10": "Convert PDF to PDF-Image" - }, - "submit": "Gehitu ur-marka", - "type": { - "1": "Text", - "2": "Image" - }, - "watermarkType": { - "text": "Testua" } }, "permissions": { @@ -773,49 +1530,201 @@ "removePages": { "tags": "Remove pages,delete pages", "title": "Ezabatu", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Ezabatu" }, - "addPassword": { - "tags": "secure,security", - "title": "Gehitu pasahitza", - "header": "Gehitu pasahitza (enkriptatu)", - "selectText": { - "1": "Hautatu PDFa enkriptatzeko", - "2": "Pasahitza", - "3": "Gakoaren luzera", - "4": "Balio altuak sendoagoak dira, baina balio baxuek bateragarritasun hobea dute", - "5": "Ezartzeko baimenak", - "6": "Galarazi dokumentuaren mihiztaketa", - "7": "Galarazi edukia ateratzea", - "8": "Galarazi ateratzea irisgarritasunerako", - "9": "Galarazi inprimakia betetzea", - "10": "Galarazi aldaketak egitea", - "11": "Galarazi oharrak aldatzea", - "12": "Galarazi inprimatzea", - "13": "Galarazi zenbait formatu inprimatzea", - "14": "Pasahitza", - "15": "Mugatu zer egin daitekeen dokumentuarekin behin zabalduta (Irakurle guztiek onartu gabe)", - "16": "Mugatu dokumentu bera zabaltzeko aukera" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Enkriptatu", "tooltip": { - "permissions": { - "title": "Aldatu baimenak" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "secure,Decrypt,security,unpassword,delete password", - "title": "Ezabatu pasahitza", - "header": "Ezabatu pasahitza (desenkriptatu)", - "selectText": { - "1": "Hautatu PDFa desenkriptatzeko", - "2": "Pasahitza" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Ezabatu", - "desc": "Ezabatu pasahitza PDF dokumentutik", - "password": { - "stepTitle": "Ezabatu pasahitza" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -825,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Title,author,date,creation,time,publisher,producer,stats", - "title": "Izenburua:", "header": "Aldatu metadatuak", + "submit": "Aldatu", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Title,author,date,creation,time,publisher,producer,stats", "selectText": { "1": "Editatu aldatu nahi dituzun aldagaiak", "2": "Ezabatu metadatu guztiak", @@ -838,15 +1877,7 @@ "4": "Beste metadatu batzuk:", "5": "Gehitu metadatu pertsonalizatuen sarrera" }, - "author": "Egilea:", - "creationDate": "Sortze-data (aaaa/MM/dd HH:mm:ss):", - "creator": "Sortzailea:", - "keywords": "Gako-hitzak:", - "modDate": "Aldatze-data (aaaa/MM/dd HH:mm:ss):", - "producer": "Ekoizlea:", - "subject": "Gaia:", - "trapped": "Trapped:", - "submit": "Aldatu" + "modDate": "Aldatze-data (aaaa/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint", @@ -860,6 +1891,7 @@ "ocr": { "tags": "recognition,text,image,scan,read,identify,detection,editable", "title": "OCR / Garbiketa-eskaneatzea", + "desc": "Garbiketa-eskaneatzeak eta irudi-testuak detektatu PDF baten barruan eta berriz ere gehitu testu gisa", "header": "Garbiketa-eskaneatzea / OCR (Karaktere-ezagutze optikoa)", "selectText": { "1": "Hautatu PDFan detektatuko diren hizkuntzak (zerrendatutakoak gaur egun detektatzen dituenak dira):", @@ -878,17 +1910,89 @@ "help": "Irakurri honen erabilerari buruzko dokumentazioa beste hizkuntza batzuetarako eta/edo ez erabili Docker-en", "credit": "Zerbitzu honek qpdf eta OCR-rako Tesseract erabiltzen ditu", "submit": "PDF prozesatu OCR-rekin", - "desc": "Garbiketa-eskaneatzeak eta irudi-testuak detektatu PDF baten barruan eta berriz ere gehitu testu gisa", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Ezarpenak", "ocrMode": { - "label": "OCR modua" + "label": "OCR modua", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" + }, + "languages": { + "label": "Languages", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR modua" + "title": "OCR modua", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." + }, + "languages": { + "title": "Languages", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -897,7 +2001,13 @@ "header": "Atera irudiak", "selectText": "Hautatu irudi-formatua ateratako irudiak bihurtzeko", "allowDuplicates": "Save duplicate images", - "submit": "Atera" + "submit": "Atera", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "archive,long-term,standard,conversion,storage,preservation", @@ -969,17 +2079,53 @@ }, "info": "Python is not installed. It is required to run." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "authorize,initials,drawn-signature,text-sign,image-signature", "title": "Sinatu", "header": "Sinatu PDF fitxategiak", "upload": "Igo irudia", - "draw": "Marraztu sinadura", - "text": "Testua sartzea", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Garbitu", "add": "Gehitu", "saved": "Saved Signatures", "save": "Save Signature", + "applySignatures": "Apply Signatures", "personalSigs": "Personal Signatures", "sharedSigs": "Shared Signatures", "noSavedSigs": "No saved signatures found", @@ -991,39 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "authorize,initials,drawn-signature,text-sign,image-signature" }, "flatten": { - "tags": "static,deactivate,non-interactive,streamline", "title": "Lautu", "header": "Akoplatu PDF fitxategiak", "flattenOnlyForms": "Flatten only forms", "submit": "Lautu", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Ezarpenak" - } + }, + "options": { + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "static,deactivate,non-interactive,streamline" }, "repair": { "tags": "fix,restore,correction,recover", "title": "Konpondu", "header": "Konpondu PDF fitxategiak", - "submit": "Konpondu" + "submit": "Konpondu", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "cleanup,streamline,non-content,organize", "title": "Ezabatu zuriuneak", "header": "Ezabatu orrialde zuriak", - "threshold": "Gutxieneko balioa:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Ezabatu zuriuneak", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "cleanup,streamline,non-content,organize", "thresholdDesc": "Pixel bat zeinen zuri izan behar den ezartzeko gutxieneko balioa", - "whitePercent": "Zuriaren protzentajea (%):", - "whitePercentDesc": "Zuria izan behar den orriaren ehunekoa ezabatua izan dadin", - "submit": "Ezabatu zuriuneak" + "whitePercentDesc": "Zuria izan behar den orriaren ehunekoa ezabatua izan dadin" }, "removeAnnotations": { "tags": "comments,highlight,notes,markup,remove", "title": "Remove Annotations", "header": "Remove Annotations", - "submit": "Remove" + "submit": "Remove", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "differentiate,contrast,changes,analysis", @@ -1055,6 +2341,142 @@ "certSign": { "tags": "authenticate,PEM,P12,official,encrypt", "title": "Ziurtagiriaren sinadura", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Kokalekua", + "logoTitle": "Logo", + "name": "Izena", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Sartu zure gakoen biltegia edo gako pribatuko pasahitza (hala badagokio):", + "passwordOptional": "Leave empty if no password", + "reason": "Arrazoia", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo", "header": "Sinatu PDF bat haren ziurtagiriarekin (lanean)", "selectPDF": "Hautatu PDF fitxategi bat sinatzeko:", "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.", @@ -1062,13 +2484,7 @@ "selectCert": "Hautatu ziurtagiridun fitxategia (X.509 formatua, .pem edo .der izan liteke):", "selectP12": "Hautatu gakoak gordetzeko fitxategia PKCS#12 (.p12 o .pfx) (Aukerakoa, ematen bada, gako pribatua eta ziurtagiria izan beharko ditu):", "selectJKS": "Select Your Java Keystore File (.jks or .keystore):", - "certType": "Ziurtagiri-mota", - "password": "Sartu zure gakoen biltegia edo gako pribatuko pasahitza (hala badagokio):", "showSig": "Erakutsi sinadura", - "reason": "Arrazoia", - "location": "Kokalekua", - "name": "Izena", - "showLogo": "Show Logo", "submit": "Sinatu PDFa" }, "removeCertSign": { @@ -1076,7 +2492,18 @@ "title": "Remove Certificate Signature", "header": "Remove the digital certificate from the PDF", "selectPDF": "Select a PDF file:", - "submit": "Remove Signature" + "submit": "Remove Signature", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "merge,composite,single-view,organize", @@ -1084,16 +2511,157 @@ "header": "Hainbat orrialderen diseinua", "pagesPerSheet": "Orrialdeak orriko:", "addBorder": "Add Borders", - "submit": "Entregatu" + "submit": "Entregatu", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "resize,modify,dimension,adapt", "title": "Doitu orrialdearen eskala", "header": "Doitu orrialdearen eskala", "pageSize": "Dokumentuaren orrialdearen tamaina", "keepPageSize": "Original Size", "scaleFactor": "Orriaren zoom maila (moztea)", - "submit": "Entregatu" + "submit": "Entregatu", + "tags": "resize,modify,dimension,adapt" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginate,label,organize,index" @@ -1102,16 +2670,83 @@ "tags": "auto-detect,header-based,organize,relabel", "title": "Aldatu izena", "header": "PDF Aldatu izena", - "submit": "Aldatu izena" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Aldatu izena", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "color-correction,tune,modify,enhance" }, "crop": { - "tags": "trim,shrink,edit,shape", "title": "Moztu", "header": "Moztu PDF", - "submit": "Bidali" + "submit": "Bidali", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "trim,shrink,edit,shape" }, "autoSplitPDF": { "tags": "QR-based,separate,scan-segment,organize", @@ -1194,24 +2829,124 @@ "downloadJS": "Javascript deskargatu", "submit": "Erakutsi" }, - "autoRedact": { - "tags": "Redact,Hide,black out,black,marker,hidden", - "title": "Auto Idatzi", - "header": "Auto Idatzi", - "colorLabel": "Kolorea", - "textsToRedactLabel": "Idazteko testua (lerro bidez bereizia)", - "textsToRedactPlaceholder": "adib. \\nKonfidentziala \\nTop-Secret", - "useRegexLabel": "Regex erabili", - "wholeWordSearchLabel": "Hitz osoen bilaketa", - "customPaddingLabel": "Custom Extra Padding", - "convertPDFToImageLabel": "Bihurtu PDF fitxategi bat PDF-Irudi-ra (kaxaren atzean testua ezabatzeko erabilia)", - "submitButton": "Bidali" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Advanced" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Gehitu", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pages", + "placeholder": "(e.g. 1,2,8 or 4,7,12-16 or 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1237,12 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "wordsToRedact": { - "add": "Gehitu" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Table Extraction,extract,convert" @@ -1253,11 +2983,15 @@ "overlay-pdfs": { "tags": "Overlay", "header": "Overlay PDF Files", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Select Base PDF File" }, "overlayFiles": { - "label": "Select Overlay PDF Files" + "label": "Select Overlay PDF Files", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Select Overlay Mode", @@ -1267,14 +3001,53 @@ }, "counts": { "label": "Overlay Counts (for Fixed Repeat Mode)", - "placeholder": "Enter comma-separated counts (e.g., 2,3,1)" + "placeholder": "Enter comma-separated counts (e.g., 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Select Overlay Position", "foreground": "Foreground", "background": "Background" }, - "submit": "Bidali" + "submit": "Bidali", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Section Split, Divide, Customize", @@ -1295,6 +3068,7 @@ "tags": "Stamp, Add image, center image, Watermark, PDF, Embed, Customize", "header": "Stamp PDF", "title": "Stamp PDF", + "stampSetup": "Stamp Setup", "stampType": "Stamp Type", "stampText": "Stamp Text", "stampImage": "Stamp Image", @@ -1307,7 +3081,19 @@ "overrideY": "Override Y Coordinate", "customMargin": "Custom Margin", "customColor": "Custom Text Color", - "submit": "Bidali" + "submit": "Bidali", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Remove Image,Page operations,Back end,server side" @@ -1325,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1352,40 +3139,122 @@ "version": "Version", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Replace-Invert Color PDF", - "selectText": { - "1": "Replace or Invert color Options", - "2": "Default(Default high contrast colors)", - "3": "Custom(Customized colors)", - "4": "Full-Invert(Invert all colors)", - "5": "High contrast color options", - "6": "white text on black background", - "7": "Black text on white background", - "8": "Yellow text on black background", - "9": "Green text on black background", - "10": "Choose text Color", - "11": "Choose background Color" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Replace" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Replace Color,Page operations,Back end,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Saioa hasi", "header": "Saioa hasi", "signin": "Saioa hasi", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Oroitu nazazu", "invalid": "Okerreko erabiltzaile izena edo pasahitza.", "locked": "Zure kontua blokeatu egin da.", @@ -1404,12 +3273,83 @@ "alreadyLoggedIn": "You are already logged in to", "alreadyLoggedIn2": "devices. Please log out of the devices and try again.", "toManySessions": "You have too many active sessions", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF Orrialde bakarrera", "header": "PDF Orrialde bakarrera", - "submit": "Orrialde bakarrera bihurtu" + "submit": "Orrialde bakarrera bihurtu", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Atera orriak", @@ -1433,18 +3373,59 @@ "adjustContrast": { "title": "Doitu kontrastea", "header": "Doitu kontrastea", + "basic": "Basic Adjustments", "contrast": "Kontrastea:", "brightness": "Distira:", "saturation": "Asetasuna:", - "download": "Distira" + "download": "Distira", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Konprimatu", + "desc": "Compress PDFs to reduce their file size.", "header": "PDFa konprimatu", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "File Size" + }, "credit": "Zerbitzu honek qpdf erabiltzen du PDFak komprimatzeko/optimizatzeko", "grayscale": { "label": "Aplikatu grisezko eskala konpresiorako" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1555,7 +3536,13 @@ "title": "Remove image", "header": "Remove image", "removeImage": "Remove image", - "submit": "Remove image" + "submit": "Remove image", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Split PDF by Chapters", @@ -1589,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1624,39 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Distira", - "convert": { - "title": "Bihurtu", - "settings": "Ezarpenak", - "color": "Color", - "greyscale": "Gris-eskala", - "grayscale": "Gris-eskala" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Sinatu" + "read": "Read", + "sign": "Sinatu", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, + "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Loading...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Izena", + "fileFormat": "Format", + "fileSize": "Size", + "fileVersion": "Version", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Distira", - "delete": "ezabatu" + "delete": "ezabatu", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDF-a desinfektatu", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Ezarpenak" + "files": "Files", + "settings": "Ezarpenak", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Gehitu pasahitza", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Enkriptatu", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Aldatu baimenak", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "secure,security", + "header": "Gehitu pasahitza (enkriptatu)", + "selectText": { + "1": "Hautatu PDFa enkriptatzeko", + "2": "Pasahitza", + "3": "Gakoaren luzera", + "4": "Balio altuak sendoagoak dira, baina balio baxuek bateragarritasun hobea dute", + "5": "Ezartzeko baimenak", + "6": "Galarazi dokumentuaren mihiztaketa", + "7": "Galarazi edukia ateratzea", + "8": "Galarazi ateratzea irisgarritasunerako", + "9": "Galarazi inprimakia betetzea", + "10": "Galarazi aldaketak egitea", + "11": "Galarazi oharrak aldatzea", + "12": "Galarazi inprimatzea", + "13": "Galarazi zenbait formatu inprimatzea", + "14": "Pasahitza", + "15": "Mugatu zer egin daitekeen dokumentuarekin behin zabalduta (Irakurle guztiek onartu gabe)", + "16": "Mugatu dokumentu bera zabaltzeko aukera" } }, "changePermissions": { "title": "Aldatu baimenak", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Aldatu baimenak", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Galarazi dokumentuaren mihiztaketa" @@ -1683,10 +4580,784 @@ "label": "Galarazi zenbait formatu inprimatzea" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Aldatu baimenak" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Ezabatu pasahitza", + "desc": "Ezabatu pasahitza PDF dokumentutik", + "tags": "secure,Decrypt,security,unpassword,delete password", + "password": { + "stepTitle": "Ezabatu pasahitza", + "label": "Current Password", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Ezabatu", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Ezabatu pasahitza (desenkriptatu)", + "selectText": { + "1": "Hautatu PDFa desenkriptatzeko", + "2": "Pasahitza" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or Invert color Options", + "2": "Default(Default high contrast colors)", + "3": "Custom(Customized colors)", + "4": "Full-Invert(Invert all colors)", + "5": "High contrast color options", + "6": "white text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color", + "header": "Replace-Invert Color PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Redact,Hide,black out,black,marker,hidden", + "title": "Auto Idatzi", + "header": "Auto Idatzi", + "colorLabel": "Kolorea", + "textsToRedactLabel": "Idazteko testua (lerro bidez bereizia)", + "textsToRedactPlaceholder": "adib. \\nKonfidentziala \\nTop-Secret", + "useRegexLabel": "Regex erabili", + "wholeWordSearchLabel": "Hitz osoen bilaketa", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Bihurtu PDF fitxategi bat PDF-Irudi-ra (kaxaren atzean testua ezabatzeko erabilia)", + "submitButton": "Bidali" + }, + "replaceColorPdf": { + "tags": "Replace Color,Page operations,Back end,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/fa-IR/translation.json b/frontend/public/locales/fa-IR/translation.json index b28d68860..0e85d7359 100644 --- a/frontend/public/locales/fa-IR/translation.json +++ b/frontend/public/locales/fa-IR/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "rtl" }, @@ -18,8 +54,26 @@ "customTextDesc": "متن سفارشی", "numberPagesDesc": "کدام صفحات شمارهگذاری شوند، پیشفرض 'همه'، همچنین میتوانید 1-5 یا 2,5,9 را وارد کنید.", "customNumberDesc": "بهطور پیشفرض {n}، همچنین میتوانید 'صفحه {n} از {total}'، 'متن-{n}'، '{filename}-{n}' را وارد کنید.", - "submit": "اضافه کردن شماره صفحات" + "submit": "اضافه کردن شماره صفحات", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "انتخاب صفحات سفارشی (یک لیست از شماره صفحات به صورت جدا شده با کاما وارد کنید مانند 1,5,6 یا از توابعی مانند 2n+1 استفاده کنید):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "انتخاب فایل(های) PDF", "multiPdfPrompt": "انتخاب فایلهای PDF (دو یا بیشتر)", "multiPdfDropPrompt": "انتخاب (یا کشیدن و رها کردن) تمام فایلهای PDF مورد نیاز", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "هشدار: این فرآیند ممکن است بسته به اندازه فایل تا یک دقیقه طول بکشد", "pageOrderPrompt": "ترتیب صفحات سفارشی (یک لیست از شماره صفحات به صورت جدا شده با کاما وارد کنید یا از توابعی مانند 2n+1 استفاده کنید):", - "pageSelectionPrompt": "انتخاب صفحات سفارشی (یک لیست از شماره صفحات به صورت جدا شده با کاما وارد کنید مانند 1,5,6 یا از توابعی مانند 2n+1 استفاده کنید):", "goToPage": "برو", "true": "درست", "false": "غلط", "unknown": "نامعلوم", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "ذخیره", "saveToBrowser": "ذخیره در مرورگر", + "download": "دانلود", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "بستن", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "فایلها انتخاب شدند", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "هیچ مورد دلخواهی اضافه نشده است", "downloadComplete": "دانلود کامل شد", "bored": "منتظر ماندن خستهکننده است؟", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "سند PDF دارای رمز عبور است و یا رمز عبور وارد نشده یا نادرست است", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "خطا", + "dismissAllErrors": "Dismiss All Errors", "sorry": "متأسفیم برای مشکل موجود!", "needHelp": "نیاز به کمک / یافتن مشکلی؟", "contactTip": "اگر هنوز مشکلی دارید، دریغ نکنید که با ما تماس بگیرید. میتوانید یک تیکت در صفحه GitHub ما ارسال کنید یا از طریق Discord با ما تماس بگیرید:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - ارسال تیکت", "discordSubmit": "Discord - ارسال پست پشتیبانی" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "حذف", "username": "نام کاربری", "password": "رمز عبور", @@ -82,6 +169,7 @@ "green": "سبز", "blue": "آبی", "custom": "سفارشی...", + "comingSoon": "Coming soon", "WorkInProgess": "کار در حال پیشرفت است، ممکن است کار نکند یا دارای اشکال باشد، لطفاً هر مشکلی را گزارش دهید!", "poweredBy": "قدرت گرفته از", "yes": "بله", @@ -115,12 +203,14 @@ "page": "صفحه", "pages": "صفحات", "loading": "در حال بارگذاری...", + "review": "Review", "addToDoc": "اضافه کردن به سند", "reset": "تنظیم مجدد", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "سیاست حفظ حریم خصوصی", + "iAgreeToThe": "I agree to all of the", "terms": "شرایط و ضوابط", "accessibility": "دسترسی", "cookie": "سیاست کوکیها", @@ -160,6 +250,7 @@ "title": "آیا میخواهید Stirling PDF را بهتر کنید؟", "paragraph1": "Stirling PDF از تحلیلهای اختیاری استفاده میکند تا به ما در بهبود محصول کمک کند. ما هیچ اطلاعات شخصی یا محتوای فایل را ردیابی نمیکنیم.", "paragraph2": "لطفاً در نظر بگیرید که تحلیلها را فعال کنید تا به رشد Stirling PDF کمک کرده و ما را در درک بهتر کاربران یاری کنید.", + "learnMore": "Learn more", "enable": "فعال کردن تحلیلها", "disable": "غیرفعال کردن تحلیلها", "settings": "میتوانید تنظیمات مربوط به تحلیلها را در فایل config/settings.yml تغییر دهید" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "ذخیره ورودیهای فرم", "help": "فعال کردن برای ذخیره ورودیهای قبلی برای اجرای بعدی" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "وارد کردن/صادر کردن پایگاه داده", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "ابزار چندگانه PDF", "desc": "ترکیب، چرخش، بازآرایی، تقسیم و حذف صفحات" }, "merge": { + "tags": "combine,join,unite", "title": "ترکیب", "desc": "ترکیب آسان چندین فایل PDF در یک فایل." }, "split": { + "tags": "divide,separate,break", "title": "تقسیم", "desc": "تقسیم فایلهای PDF به اسناد چندگانه" }, "rotate": { + "tags": "turn,flip,orient", "title": "چرخش", "desc": "چرخش آسان فایلهای PDF." }, + "convert": { + "tags": "transform,change", + "title": "تبدیل", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "سازماندهی", + "desc": "حذف/بازآرایی صفحات به ترتیب دلخواه" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "افزودن تصویر", + "desc": "افزودن یک تصویر به یک مکان مشخص در PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "افزودن واترمارک", + "desc": "افزودن یک واترمارک سفارشی به سند PDF." + }, + "removePassword": { + "tags": "unlock", + "title": "حذف رمز عبور", + "desc": "حذف حفاظت رمز عبور از سند PDF شما." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "فشردهسازی", + "desc": "فشردهسازی فایلهای PDF برای کاهش اندازه آنها." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "تغییر متاداده", + "desc": "تغییر/حذف/افزودن متاداده به یک سند PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / پاکسازی اسکنها", + "desc": "پاکسازی اسکنها و تشخیص متن از تصاویر درون یک فایل PDF و بازافزودن آن به عنوان متن." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "استخراج تصاویر", + "desc": "استخراج تمام تصاویر از یک PDF و ذخیره آنها به صورت فایل زیپ" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "امضا", + "desc": "افزودن امضا به PDF با کشیدن، متن یا تصویر" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "تسطیح", + "desc": "حذف تمام عناصر تعاملی و فرمها از یک PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "امضا با گواهینامه", + "desc": "امضای یک PDF با گواهینامه/کلید (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "ترمیم", + "desc": "تلاش برای ترمیم یک PDF خراب/شکسته" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "حذف صفحات خالی", + "desc": "تشخیص و حذف صفحات خالی از یک سند" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "حذف حاشیهنویسیها", + "desc": "حذف تمام نظرات/حاشیهنویسیها از یک PDF" + }, + "compare": { + "tags": "difference", + "title": "مقایسه", + "desc": "مقایسه و نمایش تفاوتها بین 2 سند PDF" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "حذف امضای گواهینامه", + "desc": "حذف امضای گواهینامه از PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "طرحبندی چند صفحهای", + "desc": "ادغام چندین صفحه یک سند PDF در یک صفحه واحد" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "تنظیم اندازه/مقیاس صفحه", + "desc": "تغییر اندازه/مقیاس یک صفحه و/یا محتوای آن." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "افزودن شماره صفحات", + "desc": "افزودن شماره صفحات به تمام سند در یک مکان مشخص" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "تنظیم رنگها/کنتراست", + "desc": "تنظیم کنتراست، اشباع و روشنایی یک PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "برش PDF", + "desc": "برش یک PDF برای کاهش اندازه آن (متن را حفظ میکند!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "تقسیم خودکار صفحات", + "desc": "تقسیم خودکار فایل اسکنشده PDF با استفاده از کد QR تقسیمکننده فیزیکی" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "دریافت تمام اطلاعات در مورد PDF", + "desc": "گرفتن هر اطلاعات ممکن در مورد PDF" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "صفحه بزرگ واحد", + "desc": "ادغام تمام صفحات PDF در یک صفحه بزرگ واحد" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "نمایش جاوااسکریپت", + "desc": "جستجو و نمایش هر جاوااسکریپت تزریق شده به PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "حذف تصویر", + "desc": "حذف تصاویر از PDF برای کاهش حجم فایل" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "تقسیم PDF بر اساس فصلها", + "desc": "تقسیم PDF به چند فایل بر اساس ساختار فصلها" + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "اعتبارسنجی امضای PDF", + "desc": "تأیید امضاها و گواهیهای دیجیتال در اسناد PDF" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "استخراج صفحات", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "حذف", + "desc": "حذف صفحات ناخواسته از سند PDF شما." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "تقسیم خودکار بر اساس اندازه/تعداد", + "desc": "تقسیم یک PDF به چند سند بر اساس اندازه، تعداد صفحات، یا تعداد اسناد" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "افزودن رمز عبور", + "desc": "رمزگذاری سند PDF شما با رمز عبور." + }, + "changePermissions": { + "title": "تغییر مجوزها", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "PDFها را بر روی PDF دیگری همپوشانی میکند", + "title": "همپوشانی PDFها" + }, "imageToPDF": { "title": "تصویر به PDF", "desc": "تبدیل یک تصویر (PNG، JPEG، GIF) به PDF." @@ -355,18 +786,6 @@ "title": "PDF به تصویر", "desc": "تبدیل یک فایل PDF به یک تصویر. (PNG، JPEG، GIF)" }, - "pdfOrganiser": { - "title": "سازماندهی", - "desc": "حذف/بازآرایی صفحات به ترتیب دلخواه" - }, - "addImage": { - "title": "افزودن تصویر", - "desc": "افزودن یک تصویر به یک مکان مشخص در PDF" - }, - "watermark": { - "title": "افزودن واترمارک", - "desc": "افزودن یک واترمارک سفارشی به سند PDF." - }, "permissions": { "title": "تغییر مجوزها", "desc": "تغییر مجوزهای سند PDF شما" @@ -375,38 +794,10 @@ "title": "حذف", "desc": "حذف صفحات ناخواسته از سند PDF شما." }, - "addPassword": { - "title": "افزودن رمز عبور", - "desc": "رمزگذاری سند PDF شما با رمز عبور." - }, - "removePassword": { - "title": "حذف رمز عبور", - "desc": "حذف حفاظت رمز عبور از سند PDF شما." - }, - "compress": { - "title": "فشردهسازی", - "desc": "فشردهسازی فایلهای PDF برای کاهش اندازه آنها." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "تغییر متاداده", - "desc": "تغییر/حذف/افزودن متاداده به یک سند PDF" - }, "fileToPDF": { "title": "تبدیل فایل به PDF", "desc": "تبدیل تقریباً هر فایل به PDF (DOCX، PNG، XLS، PPT، TXT و بیشتر)" }, - "ocr": { - "title": "OCR / پاکسازی اسکنها", - "desc": "پاکسازی اسکنها و تشخیص متن از تصاویر درون یک فایل PDF و بازافزودن آن به عنوان متن." - }, - "extractImages": { - "title": "استخراج تصاویر", - "desc": "استخراج تمام تصاویر از یک PDF و ذخیره آنها به صورت فایل زیپ" - }, "pdfToPDFA": { "title": "PDF به PDF/A", "desc": "تبدیل PDF به PDF/A برای ذخیرهسازی بلندمدت" @@ -435,70 +826,14 @@ "title": "تشخیص/تقسیم تصاویر اسکنشده", "desc": "تقسیم چندین تصویر از درون یک تصویر/PDF" }, - "sign": { - "title": "امضا", - "desc": "افزودن امضا به PDF با کشیدن، متن یا تصویر" - }, - "flatten": { - "title": "تسطیح", - "desc": "حذف تمام عناصر تعاملی و فرمها از یک PDF" - }, - "repair": { - "title": "ترمیم", - "desc": "تلاش برای ترمیم یک PDF خراب/شکسته" - }, - "removeBlanks": { - "title": "حذف صفحات خالی", - "desc": "تشخیص و حذف صفحات خالی از یک سند" - }, - "removeAnnotations": { - "title": "حذف حاشیهنویسیها", - "desc": "حذف تمام نظرات/حاشیهنویسیها از یک PDF" - }, - "compare": { - "title": "مقایسه", - "desc": "مقایسه و نمایش تفاوتها بین 2 سند PDF" - }, - "certSign": { - "title": "امضا با گواهینامه", - "desc": "امضای یک PDF با گواهینامه/کلید (PEM/P12)" - }, - "removeCertSign": { - "title": "حذف امضای گواهینامه", - "desc": "حذف امضای گواهینامه از PDF" - }, - "pageLayout": { - "title": "طرحبندی چند صفحهای", - "desc": "ادغام چندین صفحه یک سند PDF در یک صفحه واحد" - }, - "scalePages": { - "title": "تنظیم اندازه/مقیاس صفحه", - "desc": "تغییر اندازه/مقیاس یک صفحه و/یا محتوای آن." - }, "pipeline": { "title": "خط لوله", "desc": "اجرای چندین عملیات بر روی PDFها با تعریف اسکریپتهای خط لوله" }, - "addPageNumbers": { - "title": "افزودن شماره صفحات", - "desc": "افزودن شماره صفحات به تمام سند در یک مکان مشخص" - }, "auto-rename": { "title": "تغییر نام خودکار فایل PDF", "desc": "تغییر نام خودکار یک فایل PDF بر اساس سربرگ تشخیص دادهشده آن" }, - "adjustContrast": { - "title": "تنظیم رنگها/کنتراست", - "desc": "تنظیم کنتراست، اشباع و روشنایی یک PDF" - }, - "crop": { - "title": "برش PDF", - "desc": "برش یک PDF برای کاهش اندازه آن (متن را حفظ میکند!)" - }, - "autoSplitPDF": { - "title": "تقسیم خودکار صفحات", - "desc": "تقسیم خودکار فایل اسکنشده PDF با استفاده از کد QR تقسیمکننده فیزیکی" - }, "sanitizePDF": { "title": "پاکسازی", "desc": "حذف اسکریپتها و سایر عناصر از فایلهای PDF" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "دریافت تمام اطلاعات در مورد PDF", - "desc": "گرفتن هر اطلاعات ممکن در مورد PDF" - }, "pageExtracter": { "title": "استخراج صفحه(ها)", "desc": "استخراج صفحات انتخابی از PDF" }, - "pdfToSinglePage": { - "title": "صفحه بزرگ واحد", - "desc": "ادغام تمام صفحات PDF در یک صفحه بزرگ واحد" - }, - "showJS": { - "title": "نمایش جاوااسکریپت", - "desc": "جستجو و نمایش هر جاوااسکریپت تزریق شده به PDF" - }, "autoRedact": { "title": "سانسور خودکار", "desc": "متنهای مشخص شده در PDF را بهطور خودکار سانسور (سیاه) میکند" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF به CSV", "desc": "جداول را از PDF استخراج کرده و به CSV تبدیل میکند" @@ -551,10 +870,6 @@ "title": "تقسیم خودکار بر اساس اندازه/تعداد", "desc": "تقسیم یک PDF به چند سند بر اساس اندازه، تعداد صفحات، یا تعداد اسناد" }, - "overlay-pdfs": { - "title": "همپوشانی PDFها", - "desc": "PDFها را بر روی PDF دیگری همپوشانی میکند" - }, "split-by-sections": { "title": "تقسیم PDF بر اساس بخشها", "desc": "هر صفحه از PDF را به بخشهای افقی و عمودی کوچکتر تقسیم میکند" @@ -563,43 +878,17 @@ "title": "افزودن مهر به PDF", "desc": "افزودن مهر متنی یا تصویری در مکانهای مشخص" }, - "removeImage": { - "title": "حذف تصویر", - "desc": "حذف تصاویر از PDF برای کاهش حجم فایل" - }, - "splitByChapters": { - "title": "تقسیم PDF بر اساس فصلها", - "desc": "تقسیم PDF به چند فایل بر اساس ساختار فصلها" - }, - "validateSignature": { - "title": "اعتبارسنجی امضای PDF", - "desc": "تأیید امضاها و گواهیهای دیجیتال در اسناد PDF" - }, "replace-color": { "title": "جایگزینی و معکوس کردن رنگ", "desc": "جایگزینی رنگ متن و پسزمینه در PDF و معکوس کردن کل رنگها برای کاهش حجم فایل" }, - "convert": { - "title": "تبدیل" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "استخراج صفحات" - }, - "removePages": { - "title": "حذف", - "desc": "حذف صفحات ناخواسته از سند PDF شما." - }, "removeImagePdf": { "title": "حذف تصویر", "desc": "حذف تصاویر از PDF برای کاهش حجم فایل" }, - "autoSizeSplitPDF": { - "title": "تقسیم خودکار بر اساس اندازه/تعداد", - "desc": "تقسیم یک PDF به چند سند بر اساس اندازه، تعداد صفحات، یا تعداد اسناد" - }, "adjust-contrast": { "title": "تنظیم رنگها/کنتراست", "desc": "تنظیم کنتراست، اشباع و روشنایی یک PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "جایگزینی و معکوس کردن رنگ", "desc": "جایگزینی رنگ متن و پسزمینه در PDF و معکوس کردن کل رنگها برای کاهش حجم فایل" - }, - "changePermissions": { - "title": "تغییر مجوزها" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "مشاهده،خواندن،حاشیهنویسی،متن،تصویر", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "ترکیب،عملیات صفحات،بکاند،سمت سرور", "title": "ادغام", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "ادغام", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "نام فایل", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "ادغام چندین PDF (۲+)", "sortByName": "مرتبسازی بر اساس نام", "sortByDate": "مرتبسازی بر اساس تاریخ", - "removeCertSign": "حذف امضای دیجیتال در فایل ادغامشده؟", - "submit": "ادغام", - "sortBy": { - "filename": "نام فایل" - } + "removeCertSign": "حذف امضای دیجیتال در فایل ادغامشده؟" }, "split": { - "tags": "عملیات صفحات،تقسیم،چند صفحه،برش،سمت سرور", "title": "تقسیم PDF", "header": "تقسیم PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "صفحات برای تقسیم را وارد کنید:", "submit": "تقسیم", "steps": { + "chooseMethod": "Choose Method", "settings": "تنظیمات" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "اندازه فایل" + "name": "اندازه فایل", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "اندازه فایل" + "label": "اندازه فایل", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "عملیات صفحات،تقسیم،چند صفحه،برش،سمت سرور" }, "rotate": { - "tags": "سمت سرور", "title": "چرخش PDF", + "submit": "چرخش", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "سمت سرور", "header": "چرخش PDF", - "selectAngle": "زاویه چرخش را انتخاب کنید (به مضربهای ۹۰ درجه):", - "submit": "چرخش" + "selectAngle": "زاویه چرخش را انتخاب کنید (به مضربهای ۹۰ درجه):" + }, + "convert": { + "title": "تبدیل", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "تنظیمات", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "رنگ", + "greyscale": "خاکستری", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "پر کردن صفحه", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF حاوی یک امضای دیجیتال است. این در مرحله بعد حذف خواهد شد.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "خاکستری", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "تبدیل،عکس،jpg،تصویر،عکس" @@ -727,7 +1263,33 @@ "8": "حذف آخرین", "9": "حذف اول و آخر", "10": "ادغام فرد-زوج", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(مثال: ۱,۳,۲ یا ۴-۸,۲,۱۰-۱۲ یا 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "افزودن تصویر", "submit": "افزودن تصویر" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "متن،تکراری،برچسب،خود،کپیرایت،علامت تجاری،تصویر،jpg،عکس", "title": "افزودن واترمارک", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "افزودن واترمارک", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "متن", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "اندازه فونت", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "متن", + "2": "تصویر" + }, + "tags": "متن،تکراری،برچسب،خود،کپیرایت،علامت تجاری،تصویر،jpg،عکس", "header": "افزودن واترمارک", "customColor": "رنگ متن سفارشی", "selectText": { @@ -755,17 +1506,6 @@ "8": "نوع واترمارک:", "9": "تصویر واترمارک:", "10": "تبدیل PDF به PDF-Image" - }, - "submit": "افزودن واترمارک", - "type": { - "1": "متن", - "2": "تصویر" - }, - "watermarkType": { - "text": "متن" - }, - "settings": { - "fontSize": "اندازه فونت" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "حذف صفحات،پاک کردن صفحات", "title": "حذف", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "حذف" }, - "addPassword": { - "tags": "امن،امنیت", - "title": "افزودن گذرواژه", - "header": "افزودن گذرواژه (رمزنگاری)", - "selectText": { - "1": "انتخاب PDF برای رمزنگاری", - "2": "گذرواژه کاربر", - "3": "طول کلید رمزنگاری", - "4": "مقادیر بالاتر قویترند، اما مقادیر پایینتر بهتر سازگارند.", - "5": "مجوزهایی که باید تنظیم شوند (توصیه میشود همراه با گذرواژه مالک استفاده شود)", - "6": "جلوگیری از مونتاژ سند", - "7": "جلوگیری از استخراج محتوا", - "8": "جلوگیری از استخراج برای دسترسیپذیری", - "9": "جلوگیری از پرکردن فرم", - "10": "جلوگیری از اصلاح", - "11": "جلوگیری از اصلاح حاشیهنویسی", - "12": "جلوگیری از چاپ", - "13": "جلوگیری از چاپ فرمتهای مختلف", - "14": "گذرواژه مالک", - "15": "محدودیتهایی که میتوان بر روی سند اعمال کرد هنگامی که باز است (پشتیبانیشده توسط همه خوانندگان نیست)", - "16": "محدودیتهای باز شدن خود سند" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "رمزنگاری", "tooltip": { - "permissions": { - "title": "تغییر مجوزها" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "امن،رمزگشایی،امنیت،حذف رمز عبور", - "title": "حذف گذرواژه", - "header": "حذف گذرواژه (رمزگشایی)", - "selectText": { - "1": "PDFی را برای رمزگشایی انتخاب کنید", - "2": "گذرواژه" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "حذف", - "desc": "حذف حفاظت رمز عبور از سند PDF شما.", - "password": { - "stepTitle": "حذف رمز عبور", - "label": "رمز عبور فعلی" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "عنوان،نویسنده،تاریخ،ایجاد،زمان،ناشر،تولیدکننده،آمار", - "title": "عنوان:", "header": "تغییر متادادهها", + "submit": "تغییر", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "عنوان،نویسنده،تاریخ،ایجاد،زمان،ناشر،تولیدکننده،آمار", "selectText": { "1": "لطفاً متغیرهایی که مایل به تغییر آنها هستید را ویرایش کنید", "2": "حذف همه متادادهها", @@ -856,15 +1877,7 @@ "4": "سایر متادادهها:", "5": "افزودن ورودی متاداده سفارشی" }, - "author": "نویسنده:", - "creationDate": "تاریخ ایجاد (yyyy/MM/dd HH:mm:ss):", - "creator": "خالق:", - "keywords": "کلمات کلیدی:", - "modDate": "تاریخ اصلاح (yyyy/MM/dd HH:mm:ss):", - "producer": "تولید کننده:", - "subject": "موضوع:", - "trapped": "گیر افتاده:", - "submit": "تغییر" + "modDate": "تاریخ اصلاح (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "تبدیل،فرمت،سند،تصویر،اسلاید،متن،تبدیل،دفتر،اسناد،ورد،اکسل،پاورپوینت", @@ -878,6 +1891,7 @@ "ocr": { "tags": "تشخیص،متن،تصویر،اسکن،خواندن،شناسایی،آشکارسازی،قابل ویرایش", "title": "OCR / مرتبسازی اسکنها", + "desc": "پاکسازی اسکنها و تشخیص متن از تصاویر درون یک فایل PDF و بازافزودن آن به عنوان متن.", "header": "مرتبسازی اسکنها / OCR (بازشناسی نویسه نوری)", "selectText": { "1": "زبانهایی را که باید در PDF شناسایی شوند انتخاب کنید (موارد فهرست شده زبانهایی هستند که در حال حاضر شناسایی شدهاند):", @@ -896,23 +1910,89 @@ "help": "لطفاً این مستندات را بخوانید تا نحوه استفاده از این سرویس برای زبانهای دیگر و/یا استفاده از آن که در داخل داکر نیست را بدانید", "credit": "این سرویس از qpdf و Tesseract برای OCR استفاده میکند.", "submit": "پردازش PDF با OCR", - "desc": "پاکسازی اسکنها و تشخیص متن از تصاویر درون یک فایل PDF و بازافزودن آن به عنوان متن.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "تنظیمات", "ocrMode": { - "label": "حالت OCR" + "label": "حالت OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "زبانها" + "label": "زبانها", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "حالت OCR" + "title": "حالت OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "زبانها" + "title": "زبانها", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "استخراج تصاویر", "selectText": "فرمت تصویری را که تصاویر استخراج شده به آن تبدیل شوند انتخاب کنید", "allowDuplicates": "ذخیره تصاویر تکراری", - "submit": "استخراج" + "submit": "استخراج", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "آرشیو،ذخیرهسازی بلندمدت،استاندارد،تبدیل،ذخیرهسازی،حفظ", @@ -993,17 +2079,53 @@ }, "info": "پایتون نصب نشده است. برای اجرا نیاز است." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "تایید،حروف ابتدایی،امضای کشیده،امضای متنی،امضای تصویری", "title": "امضا", "header": "امضای PDFها", "upload": "بارگذاری تصویر", - "draw": "کشیدن امضا", - "text": "ورودی متن", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "پاک کردن", "add": "اضافه کردن", "saved": "امضاهای ذخیرهشده", "save": "ذخیره امضا", + "applySignatures": "Apply Signatures", "personalSigs": "امضاهای شخصی", "sharedSigs": "امضاهای به اشتراک گذاشتهشده", "noSavedSigs": "هیچ امضای ذخیرهشدهای یافت نشد", @@ -1015,42 +2137,179 @@ "previous": "صفحه قبلی", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "تایید،حروف ابتدایی،امضای کشیده،امضای متنی،امضای تصویری" }, "flatten": { - "tags": "ایستا،غیرفعال،غیرتعاملی،بهینهسازی", "title": "یکپارچهسازی", "header": "یکپارچهسازی PDFها", "flattenOnlyForms": "فقط فرمها را یکپارچه کن", "submit": "یکپارچهسازی", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "تنظیمات" }, "options": { - "flattenOnlyForms": "فقط فرمها را یکپارچه کن" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "فقط فرمها را یکپارچه کن", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "ایستا،غیرفعال،غیرتعاملی،بهینهسازی" }, "repair": { "tags": "ترمیم،بازیابی،اصلاح،بازیابی", "title": "تعمیر", "header": "تعمیر PDFها", - "submit": "تعمیر" + "submit": "تعمیر", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "پاکسازی،بهینهسازی،بدون محتوا،سازماندهی", "title": "حذف صفحات خالی", "header": "حذف صفحات خالی", - "threshold": "آستانه سفیدی پیکسل:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "حذف صفحات خالی", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "پاکسازی،بهینهسازی،بدون محتوا،سازماندهی", "thresholdDesc": "آستانهای که تعیین میکند پیکسل چقدر باید سفید باشد تا به عنوان 'سفید' شناخته شود. 0 = سیاه، 255 کاملاً سفید.", - "whitePercent": "درصد سفیدی (%):", - "whitePercentDesc": "درصد صفحهای که باید پیکسلهای 'سفید' باشد برای حذف", - "submit": "حذف صفحات خالی" + "whitePercentDesc": "درصد صفحهای که باید پیکسلهای 'سفید' باشد برای حذف" }, "removeAnnotations": { "tags": "نظرات،هایلایت،یادداشتها،نشانهگذاری،حذف", "title": "حذف توضیحات", "header": "حذف توضیحات", - "submit": "حذف" + "submit": "حذف", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "تفاوتگذاری،کنتراست،تغییرات،تحلیل", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "تایید،PEM،P12،رسمی،رمزگذاری", "title": "امضای گواهی", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "موقعیت", + "logoTitle": "Logo", + "name": "نام", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "رمز عبور Keystore یا کلید خصوصی خود را وارد کنید (در صورت وجود):", + "passwordOptional": "Leave empty if no password", + "reason": "دلیل", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "نمایش لوگو", "header": "امضا کردن PDF با گواهی خود (در حال پیشرفت)", "selectPDF": "انتخاب فایل PDF برای امضا:", "jksNote": "یادداشت: اگر نوع گواهی شما در زیر ذکر نشده است، لطفاً آن را به یک فایل Java Keystore (.jks) با استفاده از ابزار خط فرمان keytool تبدیل کنید. سپس، گزینه فایل .jks را در زیر انتخاب کنید.", @@ -1089,13 +2484,7 @@ "selectCert": "فایل گواهی خود را انتخاب کنید (فرمت X.509، میتواند .pem یا .der باشد):", "selectP12": "فایل Keystore PKCS#12 خود را انتخاب کنید (.p12 یا .pfx) (اختیاری، در صورت ارائه، باید شامل کلید خصوصی و گواهی شما باشد):", "selectJKS": "فایل Java Keystore خود را انتخاب کنید (.jks یا .keystore):", - "certType": "نوع گواهی", - "password": "رمز عبور Keystore یا کلید خصوصی خود را وارد کنید (در صورت وجود):", "showSig": "نمایش امضا", - "reason": "دلیل", - "location": "موقعیت", - "name": "نام", - "showLogo": "نمایش لوگو", "submit": "امضا کردن PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "حذف امضای گواهی", "header": "حذف گواهی دیجیتال از PDF", "selectPDF": "یک فایل PDF را انتخاب کنید:", - "submit": "حذف امضا" + "submit": "حذف امضا", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "ادغام،ترکیب،نمای واحد،سازماندهی", @@ -1111,16 +2511,157 @@ "header": "طرحبندی چند صفحهای", "pagesPerSheet": "صفحات در هر شیت:", "addBorder": "اضافه کردن مرزها", - "submit": "ارسال" + "submit": "ارسال", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "تغییر اندازه،ویرایش،ابعاد،سازگاری", "title": "تنظیم مقیاس صفحه", "header": "تنظیم مقیاس صفحه", "pageSize": "اندازه صفحه سند.", "keepPageSize": "اندازه اصلی", "scaleFactor": "سطح زوم (برش) یک صفحه.", - "submit": "ارسال" + "submit": "ارسال", + "tags": "تغییر اندازه،ویرایش،ابعاد،سازگاری" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "شمارهگذاری،برچسبگذاری،سازماندهی،فهرست" @@ -1129,16 +2670,83 @@ "tags": "تشخیص خودکار،بر اساس سربرگ،سازماندهی،تغییر نام", "title": "تغییر نام خودکار", "header": "تغییر نام خودکار PDF", - "submit": "تغییر نام خودکار" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "تغییر نام خودکار", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "تصحیح رنگ،تنظیم،ویرایش،بهبود" }, "crop": { - "tags": "برش،کاهش اندازه،ویرایش،شکلدهی", "title": "برش دادن", "header": "برش PDF", - "submit": "ارسال" + "submit": "ارسال", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "برش،کاهش اندازه،ویرایش،شکلدهی" }, "autoSplitPDF": { "tags": "بر اساس QR،جداسازی،تقسیم اسکنشده،سازماندهی", @@ -1221,24 +2829,124 @@ "downloadJS": "دانلود جاوااسکریپت", "submit": "نمایش" }, - "autoRedact": { - "tags": "سانسور، مخفی کردن، سیاه کردن، پنهان", - "title": "سانسور خودکار", - "header": "سانسور خودکار", - "colorLabel": "رنگ", - "textsToRedactLabel": "متن برای سانسور (هر خط جداگانه)", - "textsToRedactPlaceholder": "مثال: \\nمحرمانه \\nفوقسری", - "useRegexLabel": "استفاده از Regex", - "wholeWordSearchLabel": "جستجوی کلمه کامل", - "customPaddingLabel": "افزودن فاصله اضافی", - "convertPDFToImageLabel": "تبدیل PDF به PDF-تصویر (برای حذف متن پشت جعبه استفاده میشود)", - "submitButton": "ارسال" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "پیشرفته" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "اضافه کردن", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "صفحات", + "placeholder": "(مثال: 1,2,8 یا 4,7,12-16 یا 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "صادر کردن", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1264,22 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "پیشرفته" - }, - "wordsToRedact": { - "add": "اضافه کردن" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "صفحات", - "placeholder": "(مثال: 1,2,8 یا 4,7,12-16 یا 2n-1)" - }, - "export": "صادر کردن" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV، استخراج جدول، استخراج، تبدیل" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "همپوشانی", "header": "ترکیب فایلهای PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "انتخاب فایل پایه PDF" }, "overlayFiles": { - "label": "انتخاب فایلهای ترکیبی PDF" + "label": "انتخاب فایلهای ترکیبی PDF", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "انتخاب حالت ترکیب", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "تعداد تکرارهای ترکیب (برای حالت تکرار ثابت)", - "placeholder": "مقادیر تعداد را با کاما جدا کنید (مثلاً ۲,۳,۱)" + "placeholder": "مقادیر تعداد را با کاما جدا کنید (مثلاً ۲,۳,۱)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "انتخاب موقعیت ترکیب", "foreground": "پیشزمینه", "background": "پسزمینه" }, - "submit": "ارسال" + "submit": "ارسال", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "تقسیم بخش، سفارشیسازی", @@ -1332,6 +3068,7 @@ "tags": "مهر، افزودن تصویر، واترمارک، PDF، سفارشیسازی", "header": "مهر زدن به PDF", "title": "مهر زدن به PDF", + "stampSetup": "Stamp Setup", "stampType": "نوع مهر", "stampText": "متن مهر", "stampImage": "تصویر مهر", @@ -1344,7 +3081,19 @@ "overrideY": "تغییر مختصات Y", "customMargin": "حاشیه سفارشی", "customColor": "رنگ متن سفارشی", - "submit": "ارسال" + "submit": "ارسال", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "حذف تصویر، عملیات صفحه، سرور" @@ -1362,7 +3111,8 @@ "status": { "_value": "وضعیت", "valid": "معتبر", - "invalid": "نامعتبر" + "invalid": "نامعتبر", + "complete": "Validation complete" }, "signer": "امضاکننده", "date": "تاریخ", @@ -1389,40 +3139,122 @@ "version": "نسخه", "keyUsage": "کاربرد کلید", "selfSigned": "با امضای خود", - "bits": "بیتها" + "bits": "بیتها", + "details": "Certificate Details" }, "signature": { "info": "اطلاعات امضا", "_value": "امضا", "mathValid": "امضا از لحاظ ریاضی معتبر است اما:" }, - "selectCustomCert": "فایل گواهی سفارشی X.509 (اختیاری)" - }, - "replace-color": { - "title": "جایگزینی/معکوس کردن رنگ", - "header": "جایگزینی/معکوس کردن رنگ PDF", - "selectText": { - "1": "گزینههای جایگزینی یا معکوس کردن رنگ", - "2": "پیشفرض (رنگهای پیشفرض با کنتراست بالا)", - "3": "سفارشی (رنگهای سفارشیسازی شده)", - "4": "معکوس کامل (معکوس کردن تمام رنگها)", - "5": "گزینههای رنگ با کنتراست بالا", - "6": "متن سفید روی پسزمینه سیاه", - "7": "متن سیاه روی پسزمینه سفید", - "8": "متن زرد روی پسزمینه سیاه", - "9": "متن سبز روی پسزمینه سیاه", - "10": "انتخاب رنگ متن", - "11": "انتخاب رنگ پسزمینه" + "selectCustomCert": "فایل گواهی سفارشی X.509 (اختیاری)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "جایگزینی" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "جایگزینی رنگ، عملیات صفحه، سرور" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "ورود", "header": "ورود", "signin": "ورود", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "مرا به خاطر بسپار", "invalid": "نام کاربری یا رمز عبور اشتباه است.", "locked": "حساب شما قفل شده است.", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "شما قبلاً وارد شدهاید در", "alreadyLoggedIn2": "دستگاهها. لطفاً از دستگاهها خارج شده و دوباره تلاش کنید.", "toManySessions": "شما تعداد زیادی نشست فعال دارید.", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF به یک صفحه", "header": "PDF به یک صفحه", - "submit": "تبدیل به یک صفحه" + "submit": "تبدیل به یک صفحه", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "استخراج صفحات", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "تنظیم کنتراست", "header": "تنظیم کنتراست", + "basic": "Basic Adjustments", "contrast": "کنتراست:", "brightness": "روشنایی:", "saturation": "اشباع:", - "download": "دانلود" + "download": "دانلود", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "فشردهسازی", + "desc": "Compress PDFs to reduce their file size.", "header": "فشردهسازی PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "اندازه فایل" + }, "credit": "این سرویس از qpdf برای فشردهسازی / بهینهسازی PDF استفاده میکند.", "grayscale": { "label": "اعمال مقیاس خاکستری برای فشردهسازی" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1491,10 +3435,7 @@ "4": "حالت خودکار - کیفیت را به طور خودکار تنظیم میکند تا PDF به اندازه دقیق برسد", "5": "اندازه PDF مورد انتظار (مثلاً ۲۵MB، ۱۰.۸MB، ۲۵KB)" }, - "submit": "فشردهسازی", - "method": { - "filesize": "اندازه فایل" - } + "submit": "فشردهسازی" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1595,7 +3536,13 @@ "title": "حذف تصویر", "header": "حذف تصویر", "removeImage": "حذف تصویر", - "submit": "حذف تصویر" + "submit": "حذف تصویر", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "تقسیم PDF بر اساس فصلها", @@ -1629,6 +3576,12 @@ }, "note": "یادداشتهای نسخه فقط به زبان انگلیسی موجود است" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "دانلود", - "convert": { - "title": "تبدیل", - "settings": "تنظیمات", - "color": "رنگ", - "greyscale": "خاکستری", - "fillPage": "پر کردن صفحه", - "pdfaDigitalSignatureWarning": "PDF حاوی یک امضای دیجیتال است. این در مرحله بعد حذف خواهد شد.", - "grayscale": "خاکستری" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "انتخاب همه", - "deselectAll": "لغو انتخاب همه" + "deselectAll": "لغو انتخاب همه", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "امضا" + "read": "Read", + "sign": "امضا", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "در حال بارگذاری...", - "or": "یا" + "or": "یا", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "نام", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "نسخه", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "انتخاب همه", "deselectAll": "لغو انتخاب همه", "deleteSelected": "حذف انتخاب شدهها", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "دانلود", - "delete": "حذف" + "delete": "حذف", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "پاکسازی PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "تنظیمات" + "files": "Files", + "settings": "تنظیمات", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "افزودن گذرواژه", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "رمزنگاری", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "تغییر مجوزها", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "امن،امنیت", + "header": "افزودن گذرواژه (رمزنگاری)", + "selectText": { + "1": "انتخاب PDF برای رمزنگاری", + "2": "گذرواژه کاربر", + "3": "طول کلید رمزنگاری", + "4": "مقادیر بالاتر قویترند، اما مقادیر پایینتر بهتر سازگارند.", + "5": "مجوزهایی که باید تنظیم شوند (توصیه میشود همراه با گذرواژه مالک استفاده شود)", + "6": "جلوگیری از مونتاژ سند", + "7": "جلوگیری از استخراج محتوا", + "8": "جلوگیری از استخراج برای دسترسیپذیری", + "9": "جلوگیری از پرکردن فرم", + "10": "جلوگیری از اصلاح", + "11": "جلوگیری از اصلاح حاشیهنویسی", + "12": "جلوگیری از چاپ", + "13": "جلوگیری از چاپ فرمتهای مختلف", + "14": "گذرواژه مالک", + "15": "محدودیتهایی که میتوان بر روی سند اعمال کرد هنگامی که باز است (پشتیبانیشده توسط همه خوانندگان نیست)", + "16": "محدودیتهای باز شدن خود سند" } }, "changePermissions": { "title": "تغییر مجوزها", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "تغییر مجوزها", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "جلوگیری از مونتاژ سند" @@ -1737,10 +4580,784 @@ "label": "جلوگیری از چاپ فرمتهای مختلف" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "تغییر مجوزها" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "حذف گذرواژه", + "desc": "حذف حفاظت رمز عبور از سند PDF شما.", + "tags": "امن،رمزگشایی،امنیت،حذف رمز عبور", + "password": { + "stepTitle": "حذف رمز عبور", + "label": "رمز عبور فعلی", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "حذف", + "results": { + "title": "Decrypted PDFs" + }, + "header": "حذف گذرواژه (رمزگشایی)", + "selectText": { + "1": "PDFی را برای رمزگشایی انتخاب کنید", + "2": "گذرواژه" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "گزینههای جایگزینی یا معکوس کردن رنگ", + "2": "پیشفرض (رنگهای پیشفرض با کنتراست بالا)", + "3": "سفارشی (رنگهای سفارشیسازی شده)", + "4": "معکوس کامل (معکوس کردن تمام رنگها)", + "5": "گزینههای رنگ با کنتراست بالا", + "6": "متن سفید روی پسزمینه سیاه", + "7": "متن سیاه روی پسزمینه سفید", + "8": "متن زرد روی پسزمینه سیاه", + "9": "متن سبز روی پسزمینه سیاه", + "10": "انتخاب رنگ متن", + "11": "انتخاب رنگ پسزمینه", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "جایگزینی", + "title": "جایگزینی/معکوس کردن رنگ", + "header": "جایگزینی/معکوس کردن رنگ PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "سانسور، مخفی کردن، سیاه کردن، پنهان", + "title": "سانسور خودکار", + "header": "سانسور خودکار", + "colorLabel": "رنگ", + "textsToRedactLabel": "متن برای سانسور (هر خط جداگانه)", + "textsToRedactPlaceholder": "مثال: \\nمحرمانه \\nفوقسری", + "useRegexLabel": "استفاده از Regex", + "wholeWordSearchLabel": "جستجوی کلمه کامل", + "customPaddingLabel": "افزودن فاصله اضافی", + "convertPDFToImageLabel": "تبدیل PDF به PDF-تصویر (برای حذف متن پشت جعبه استفاده میشود)", + "submitButton": "ارسال" + }, + "replaceColorPdf": { + "tags": "جایگزینی رنگ، عملیات صفحه، سرور" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/fr-FR/translation.json b/frontend/public/locales/fr-FR/translation.json index b4d390197..04e53d4b4 100644 --- a/frontend/public/locales/fr-FR/translation.json +++ b/frontend/public/locales/fr-FR/translation.json @@ -1,5 +1,35 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, "unsavedChanges": "Vous avez des modifications non enregistrées sur votre PDF. Que souhaitez-vous faire ?", + "areYouSure": "Are you sure you want to leave?", "unsavedChangesTitle": "Modifications non enregistrées", "keepWorking": "Continuer à travailler", "discardChanges": "Ignorer les modifications", @@ -24,8 +54,26 @@ "customTextDesc": "Texte personnalisé", "numberPagesDesc": "Quelles pages numéroter, par défaut 'all' (toutes les pages), accepte également 1-5 ou 2,5,9, etc.", "customNumberDesc": "La valeur par défaut est '{n}', accepte également 'Page {n} sur {total}', 'Texte-{n}', '{filename}-{n}'", - "submit": "Ajouter les numéros de page" + "submit": "Ajouter les numéros de page", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Sélection des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Sélectionnez le(s) PDF", "multiPdfPrompt": "Sélectionnez les PDF", "multiPdfDropPrompt": "Sélectionnez (ou glissez-déposez) tous les PDF dont vous avez besoin", @@ -36,7 +84,6 @@ "uploadLimitExceededPlural": "sont trop grands. La taille maximale autorisée est de", "processTimeWarning": "Attention, ce processus peut prendre jusqu'à une minute en fonction de la taille du fichier.", "pageOrderPrompt": "Ordre des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1) :", - "pageSelectionPrompt": "Sélection des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1) :", "goToPage": "Aller", "true": "Vrai", "false": "Faux", @@ -47,11 +94,18 @@ "save": "Enregistrer", "saveToBrowser": "Enregistrer dans le navigateur", "download": "Télécharger", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", "undoOperationTooltip": "Cliquez pour annuler la dernière opération et restaurer les fichiers d’origine", "undo": "Défaire", "moreOptions": "Plus d’options", "editYourNewFiles": "Modifier votre/vos nouveau(x) fichier(s)", "close": "Fermer", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "Sélectionné : {{filename}}", "chooseFile": "Choisir un fichier", "filesSelected": "fichiers sélectionnés", @@ -61,7 +115,9 @@ "uploadFiles": "Téléverser des fichiers", "addFiles": "Ajouter des fichiers", "selectFromWorkbench": "Sélectionnez des fichiers depuis l’espace de travail ou ", - "selectMultipleFromWorkbench": "Sélectionnez au moins {{count}} fichiers depuis l’espace de travail ou " + "selectMultipleFromWorkbench": "Sélectionnez au moins {{count}} fichiers depuis l’espace de travail ou ", + "created": "Created", + "size": "File Size" }, "noFavourites": "Aucun favori ajouté", "downloadComplete": "Téléchargement terminé", @@ -194,6 +250,7 @@ "title": "Souhaitez-vous améliorer Stirling PDF ?", "paragraph1": "Stirling PDF utilise des analyses volontaires pour nous aider à améliorer le produit. Nous ne suivons aucune information personnelle ni le contenu des fichiers.", "paragraph2": "Veuillez envisager d'activer les analyses pour aider Stirling-PDF à se développer et pour nous permettre de mieux comprendre nos utilisateurs.", + "learnMore": "Learn more", "enable": "Activer les analyses", "disable": "Désactiver les analyses", "settings": "Vous pouvez modifier les paramètres des analyses dans le fichier config/settings.yml" @@ -237,6 +294,54 @@ "cacheInputs": { "name": "Sauvegarder les entrées du formulaire", "help": "Permet de stocker les entrées précédemment utilisées pour les exécutions futures" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -308,8 +413,10 @@ "top20": "Top 20", "all": "Tout", "refresh": "Rafraîchir", - "includeHomepage": "Inclure la page d'accueil ('/')", - "includeLoginPage": "Inclure la page de connexion ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Nombre total de points de terminaison", "totalVisits": "Nombre total de visites", "showing": "Affichage", @@ -324,7 +431,9 @@ "top": "Top", "numberOfVisits": "Nombre de visites", "visitsTooltip": "Visites : {0} ({1}% du total)", - "retry": "Réessayer" + "retry": "Réessayer", + "includeHomepage": "Inclure la page d'accueil ('/')", + "includeLoginPage": "Inclure la page de connexion ('/login')" }, "database": { "title": "Import/Export de la Base de Données", @@ -365,6 +474,16 @@ "alphabetical": "Alphabétique", "globalPopularity": "Popularité globale", "sortBy": "Trier par :", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { "tags": "multiple,outils", "title": "Outil multifonction PDF", @@ -550,11 +669,6 @@ "title": "Caviardage manuel", "desc": "Caviarder un PDF en fonction de texte sélectionné, formes dessinées et/ou des pages sélectionnées." }, - "overlayPdfs": { - "tags": "superposer,combiner,empiler", - "title": "Superposer des PDF", - "desc": "Superpose des PDF au-dessus d’un autre PDF" - }, "splitBySections": { "tags": "diviser,sections,scinder", "title": "Diviser le PDF par sections", @@ -659,6 +773,15 @@ "tags": "workflow,séquence,automatisation", "title": "Automatiser", "desc": "Créez des workflows multi-étapes en enchaînant des actions PDF. Idéal pour les tâches récurrentes." + }, + "overlay-pdfs": { + "desc": "Overlay one PDF on top of another", + "title": "Overlay PDFs" + }, + "overlayPdfs": { + "tags": "superposer,combiner,empiler", + "title": "Superposer des PDF", + "desc": "Superpose des PDF au-dessus d’un autre PDF" } }, "landing": { @@ -698,13 +821,19 @@ "merge": { "tags": "fusionner,opérations sur les pages,backend,server side,merge", "title": "Fusionner", - "removeDigitalSignature.tooltip": { - "title": "Supprimer la signature numérique", - "description": "Les signatures numériques seront invalidées lors de la fusion. Cochez ceci pour les supprimer du PDF final." + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Supprimer la signature numérique", + "description": "Les signatures numériques seront invalidées lors de la fusion. Cochez ceci pour les supprimer du PDF final." + } }, - "generateTableOfContents.tooltip": { - "title": "Générer une table des matières", - "description": "Crée automatiquement une table des matières cliquable dans le PDF fusionné à partir des noms de fichiers d’origine et des numéros de page." + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Générer une table des matières", + "description": "Crée automatiquement une table des matières cliquable dans le PDF fusionné à partir des noms de fichiers d’origine et des numéros de page." + } }, "submit": "Fusionner", "sortBy": { @@ -842,12 +971,50 @@ "bullet1": "Niveau de signet : niveau sur lequel fractionner (1 = niveau supérieur)", "bullet2": "Inclure les métadonnées : préserver les propriétés du document", "bullet3": "Autoriser les doublons : gérer les noms de signets répétés" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" } - } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method" }, "rotate": { "title": "Pivoter", "submit": "Pivoter", + "selectRotation": "Select Rotation Angle (Clockwise)", "error": { "failed": "Une erreur est survenue lors de la rotation du PDF." }, @@ -935,7 +1102,8 @@ "imagesExt": "Images (JPG, PNG, etc.)", "markdown": "Markdown", "textRtf": "Texte/RTF", - "grayscale": "Niveaux de gris" + "grayscale": "Niveaux de gris", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "pdf,conversion,img,jpg,image,photo" @@ -973,7 +1141,20 @@ "8": "Supprimer le dernier", "9": "Supprimer le premier et le dernier", "10": "Méger Impair-Pair", - "11": "Dupliquer toutes les pages" + "11": "Dupliquer toutes les pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, "desc": { "CUSTOM": "Utiliser une séquence personnalisée de numéros de page ou d’expressions pour définir un nouvel ordre.", @@ -1039,7 +1220,9 @@ "opacity": "Opacité (%)", "spacing": { "horizontal": "Espacement horizontal", - "vertical": "Espacement vertical" + "vertical": "Espacement vertical", + "height": "Height Spacing", + "width": "Width Spacing" }, "convertToImage": "Aplatir les pages PDF en images" }, @@ -1182,6 +1365,10 @@ "bullet4": "Idéal pour le contenu sensible ou protégé par droit d’auteur" } } + }, + "type": { + "1": "Text", + "2": "Image" } }, "permissions": { @@ -1255,6 +1442,26 @@ }, "submit": "Supprimer" }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, "pageSelection": { "tooltip": { "header": { @@ -1295,10 +1502,43 @@ }, "examples": { "title": "Exemples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", "header": { "title": "Guide de sélection des pages" }, @@ -1604,6 +1844,9 @@ "text": "Post-traite le PDF final en supprimant les artefacts d’OCR et en optimisant le calque de texte pour une meilleure lisibilité et une taille de fichier plus petite." } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1766,8 +2009,16 @@ "hint": "Téléversez une image PNG ou JPG de votre signature" }, "instructions": { - "title": "Comment ajouter une signature" + "title": "Comment ajouter une signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", "activate": "Activer le placement de signature", "deactivate": "Arrêter le placement de signatures", "results": { @@ -1792,7 +2043,10 @@ "options": { "stepTitle": "Options d’aplatissement", "title": "Options d’aplatissement", - "flattenOnlyForms.desc": "Aplatir uniquement les champs de formulaire, en laissant les autres éléments interactifs intacts", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "Aplatir uniquement les champs de formulaire, en laissant les autres éléments interactifs intacts" + }, "note": "L’aplatissement supprime les éléments interactifs du PDF, les rendant non modifiables." }, "results": { @@ -1882,7 +2136,13 @@ "bullet3": "Peut être désactivé pour réduire la taille du fichier de sortie" } }, - "submit": "Supprimer les pages vierges" + "submit": "Supprimer les pages vierges", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + } }, "removeAnnotations": { "tags": "commentaires,supprimer,annotations,highlight,notes,markup,remove", @@ -1984,7 +2244,12 @@ "bullet3": "Choisissez la page où placer la signature", "bullet4": "Logo facultatif" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, "sign": { "submit": "Signer le PDF", @@ -2045,7 +2310,22 @@ "text": "Convertissez votre fichier en keystore Java (.jks) avec keytool, puis choisissez JKS." } } - } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Certificate Password", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo" }, "removeCertSign": { "tags": "signer,chiffrer,certificat,authenticate,PEM,P12,official,decrypt", @@ -2071,7 +2351,17 @@ "header": "Fusionner des pages", "pagesPerSheet": "Pages par feuille", "addBorder": "Ajouter des bordures", - "submit": "Fusionner" + "submit": "Fusionner", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "livret,imposition,impression,reliure,pliage,signature", @@ -2257,10 +2547,22 @@ "reset": "Réinitialiser au PDF complet", "coordinates": { "title": "Position et taille", - "x": "Position X", - "y": "Position Y", - "width": "Largeur", - "height": "Hauteur" + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } }, "error": { "invalidArea": "La zone de recadrage dépasse les limites du PDF", @@ -2278,6 +2580,10 @@ }, "results": { "title": "Résultats du recadrage" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." } }, "autoSplitPDF": { @@ -2488,11 +2794,15 @@ "overlay-pdfs": { "tags": "Overlay,incrustation", "header": "Incrustation de PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Sélectionner le fichier PDF de base" }, "overlayFiles": { - "label": "Sélectionner les fichiers PDF à superposer" + "label": "Sélectionner les fichiers PDF à superposer", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Sélectionner le mode d'incrustation", @@ -2502,14 +2812,53 @@ }, "counts": { "label": "Nombre de superpositions (pour le mode de répétition fixe)", - "placeholder": "Compteurs (séparés par des virgules, exemple : 2,3,1)" + "placeholder": "Compteurs (séparés par des virgules, exemple : 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Définir la position de l'incrustation", "foreground": "Premier plan", "background": "Arrière-plan" }, - "submit": "Soumettre" + "submit": "Soumettre", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Sections,Diviser,Section Split, Divide, Customize", @@ -2544,7 +2893,18 @@ "customMargin": "Marge personnalisée", "customColor": "Couleur de texte personnalisée", "submit": "Soumettre", - "noStampSelected": "Aucun tampon sélectionné. Retour à l’étape 1." + "noStampSelected": "Aucun tampon sélectionné. Retour à l’étape 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Images,Remove Image,Page operations,Back end,server side" @@ -2562,7 +2922,8 @@ "status": { "_value": "Statut", "valid": "Valide", - "invalid": "Invalide" + "invalid": "Invalide", + "complete": "Validation complete" }, "signer": "Signataire", "date": "Date", @@ -2589,17 +2950,115 @@ "version": "Version", "keyUsage": "Usage de la clé", "selfSigned": "Auto-signé", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Informations sur la signature", "_value": "Signature", "mathValid": "La signature est mathématiquement valide MAIS :" }, - "selectCustomCert": "Fichier de certificat personnalisé X.509 (Optionnel)" + "selectCustomCert": "Fichier de certificat personnalisé X.509 (Optionnel)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" + }, + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, "replaceColor": { - "tags": "Remplacer la couleur,Opérations de page,Back-end,côté serveur" + "tags": "Remplacer la couleur,Opérations de page,Back-end,côté serveur", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Connexion", @@ -2632,6 +3091,11 @@ "enterEmail": "Saisissez votre e-mail", "enterPassword": "Saisissez votre mot de passe", "loggingIn": "Connexion…", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", "signingIn": "Connexion en cours…", "login": "Se connecter", "or": "Ou", @@ -2649,7 +3113,10 @@ "magicLinkSent": "Lien magique envoyé à {{email}} ! Consultez votre e-mail et cliquez sur le lien pour vous connecter.", "passwordResetSent": "Lien de réinitialisation envoyé à {{email}} ! Consultez votre e-mail et suivez les instructions.", "failedToSignIn": "Échec de connexion avec {{provider}} : {{message}}", - "unexpectedError": "Erreur inattendue : {{message}}" + "unexpectedError": "Erreur inattendue : {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." }, "signup": { "title": "Créer un compte", @@ -2672,7 +3139,12 @@ "invalidEmail": "Veuillez saisir une adresse e-mail valide", "checkEmailConfirmation": "Consultez votre e-mail pour un lien de confirmation afin de terminer votre inscription.", "accountCreatedSuccessfully": "Compte créé avec succès ! Vous pouvez maintenant vous connecter.", - "unexpectedError": "Erreur inattendue : {{message}}" + "unexpectedError": "Erreur inattendue : {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "Fusionner les pages", @@ -2712,10 +3184,23 @@ "adjustContrast": { "title": "Ajuster les couleurs", "header": "Ajuster les couleurs", + "basic": "Basic Adjustments", "contrast": "Contraste", "brightness": "Luminosité", "saturation": "Saturation", - "download": "Télécharger" + "download": "Télécharger", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Compresser un PDF", @@ -2862,7 +3347,13 @@ "title": "Supprimer l'image", "header": "Supprimer l'image", "removeImage": "Supprimer l'image", - "submit": "Supprimer l'image" + "submit": "Supprimer l'image", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Diviser un PDF par Chapitres", @@ -2937,6 +3428,10 @@ "title": "Analyse", "description": "Ces cookies nous aident à comprendre comment nos outils sont utilisés, afin que nous puissions nous concentrer sur les fonctionnalités les plus appréciées par notre communauté. Soyez rassuré — Stirling PDF ne peut pas et ne suivra jamais le contenu des documents que vous utilisez." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, "removeMetadata": { @@ -2998,11 +3493,18 @@ "panMode": "Mode panoramique", "rotateLeft": "Pivoter à gauche", "rotateRight": "Pivoter à droite", - "toggleSidebar": "Afficher/masquer la barre latérale" + "toggleSidebar": "Afficher/masquer la barre latérale", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" }, "search": { "title": "Rechercher dans le PDF", - "placeholder": "Saisir un terme de recherche…" + "placeholder": "Saisir un terme de recherche…", + "noResults": "No results found", + "searching": "Searching..." }, "guestBanner": { "title": "Vous utilisez Stirling PDF en tant qu’invité !", @@ -3040,9 +3542,597 @@ "automate": "Automatiser", "files": "Fichiers", "activity": "Activité", + "help": "Help", + "account": "Account", "config": "Configuration", + "adminSettings": "Admin Settings", "allTools": "Tous les outils" }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, "fileUpload": { "selectFile": "Sélectionner un fichier", "selectFiles": "Sélectionner des fichiers", @@ -3067,6 +4157,9 @@ "addFiles": "Ajouter des fichiers", "dragFilesInOrClick": "Glissez des fichiers ou cliquez sur « Ajouter des fichiers » pour parcourir" }, + "fileEditor": { + "addFiles": "Add Files" + }, "fileManager": { "title": "Téléverser des fichiers PDF", "subtitle": "Ajoutez des fichiers à votre stockage pour un accès facile dans tous les outils", @@ -3095,6 +4188,7 @@ "lastModified": "Dernière modification", "toolChain": "Outils appliqués", "restore": "Restaurer", + "unzip": "Unzip", "searchFiles": "Rechercher des fichiers…", "recent": "Récents", "localFiles": "Fichiers locaux", @@ -3102,7 +4196,6 @@ "googleDriveShort": "Drive", "myFiles": "Mes fichiers", "noRecentFiles": "Aucun fichier récent trouvé", - "dropFilesHint": "Déposez les fichiers ici pour les téléverser", "googleDriveNotAvailable": "Intégration Google Drive non disponible", "openFiles": "Ouvrir des fichiers", "openFile": "Ouvrir le fichier", @@ -3120,7 +4213,18 @@ "selectedCount": "{{count}} sélectionné(s)", "download": "Télécharger", "delete": "Supprimer", - "unsupported": "Non pris en charge" + "unsupported": "Non pris en charge", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "Déposez les fichiers ici pour les téléverser" }, "storage": { "temporaryNotice": "Les fichiers sont stockés temporairement dans votre navigateur et peuvent être effacés automatiquement", @@ -3136,8 +4240,10 @@ "desc": "Supprimer les éléments potentiellement nuisibles des fichiers PDF.", "submit": "Assainir", "completed": "Assainissement effectué avec succès", - "error.generic": "Échec de l’assainissement", - "error.failed": "Une erreur est survenue lors de l’assainissement du PDF.", + "error": { + "generic": "Échec de l’assainissement", + "failed": "Une erreur est survenue lors de l’assainissement du PDF." + }, "filenamePrefix": "sanitised", "sanitizationResults": "Résultats de l’assainissement", "steps": { @@ -3151,12 +4257,30 @@ "options": { "title": "Options d’assainissement", "note": "Sélectionnez les éléments à supprimer du PDF. Au moins une option doit être sélectionnée.", - "removeJavaScript.desc": "Supprimer les actions et scripts JavaScript du PDF", - "removeEmbeddedFiles.desc": "Supprimer tous les fichiers intégrés dans le PDF", - "removeXMPMetadata.desc": "Supprimer les métadonnées XMP du PDF", - "removeMetadata.desc": "Supprimer les informations de document (titre, auteur, etc.)", - "removeLinks.desc": "Supprimer les liens externes et actions de lancement du PDF", - "removeFonts.desc": "Supprimer les polices intégrées du PDF" + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Supprimer les actions et scripts JavaScript du PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Supprimer tous les fichiers intégrés dans le PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Supprimer les métadonnées XMP du PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Supprimer les informations de document (titre, auteur, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Supprimer les liens externes et actions de lancement du PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Supprimer les polices intégrées du PDF" + } } }, "addPassword": { @@ -3377,9 +4501,14 @@ "remaining": "restant", "used": "utilisé", "available": "disponible", - "cancel": "Annuler" + "cancel": "Annuler", + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { "title": "Paramètres du compte", @@ -3435,8 +4564,570 @@ "submit": "Ajouter les pièces jointes", "results": { "title": "Résultats des pièces jointes" + }, + "error": { + "failed": "Add attachments operation failed" } }, "termsAndConditions": "Conditions générales", - "logOut": "Se déconnecter" -} \ No newline at end of file + "logOut": "Se déconnecter", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or invert colour options", + "2": "Default (preset high contrast colours)", + "3": "Custom (choose your own colours)", + "4": "Full invert (invert all colours)", + "5": "High contrast color options", + "6": "White text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + } +} diff --git a/frontend/public/locales/ga-IE/translation.json b/frontend/public/locales/ga-IE/translation.json index 7f9316e63..f9cf59afa 100644 --- a/frontend/public/locales/ga-IE/translation.json +++ b/frontend/public/locales/ga-IE/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Téacs Saincheaptha", "numberPagesDesc": "Cé na leathanaigh le huimhriú, réamhshocraithe 'gach duine', a ghlacann freisin 1-5 nó 2,5,9 etc", "customNumberDesc": "Réamhshocrú go {n}, glacann sé freisin le 'Leathanach {n} de {total}', 'Text-{n}', '{filename}-{n}", - "submit": "Cuir Uimhreacha Leathanaigh leis" + "submit": "Cuir Uimhreacha Leathanaigh leis", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Roghnú Leathanach Saincheaptha (Iontráil liosta leathanach scartha le camóg d'uimhreacha 1,5,6 nó Feidhmeanna ar nós 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Roghnaigh PDF(anna)", "multiPdfPrompt": "Roghnaigh PDFs (2+)", "multiPdfDropPrompt": "Roghnaigh (nó tarraing & scaoil) gach PDF atá uait", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Rabhadh: Féadfaidh an próiseas seo suas le nóiméad a ghlacadh ag brath ar mhéid an chomhaid", "pageOrderPrompt": "Ordú Leathanach Saincheaptha (Iontráil liosta uimhreacha leathanaigh nó Feidhmeanna ar nós 2n+1 le camóga deighilte):", - "pageSelectionPrompt": "Roghnú Leathanach Saincheaptha (Iontráil liosta leathanach scartha le camóg d'uimhreacha 1,5,6 nó Feidhmeanna ar nós 2n+1):", "goToPage": "Téigh", "true": "Fíor", "false": "Bréagach", "unknown": "Anaithnid", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Sábháil", "saveToBrowser": "Sábháil go Brabhsálaí", + "download": "Íosluchtaigh", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Dún", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "comhaid roghnaithe", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Níor cuireadh aon cheanáin leis", "downloadComplete": "Íosluchtaigh Críochnaithe", "bored": "Leamh Ag Feitheamh?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "Tá pasfhocal ar an Doiciméad PDF agus níor soláthraíodh an pasfhocal nó bhí sé mícheart", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Earráid", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Gabh mo leithscéal as an gceist!", "needHelp": "Cabhair uait / Ar aimsíodh fadhb?", "contactTip": "Má tá trioblóid agat fós, ná bíodh leisce ort teagmháil a dhéanamh linn le haghaidh cabhrach. Is féidir leat ticéad a chur isteach ar ár leathanach GitHub nó déan teagmháil linn trí Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Cuir ticéad isteach", "discordSubmit": "Discord - Cuir post Tacaíochta" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Scrios", "username": "Ainm úsáideora", "password": "Pasfhocal", @@ -82,6 +169,7 @@ "green": "Glas", "blue": "Gorm", "custom": "Saincheaptha...", + "comingSoon": "Coming soon", "WorkInProgess": "Obair idir lámha, B’fhéidir nach n-oibreoidh sí nó nach mbeidh bugaí ann, Tuairiscigh aon fhadhbanna le do thoil!", "poweredBy": "Cumhachtaithe ag", "yes": "Tá", @@ -115,12 +203,14 @@ "page": "Leathanach", "pages": "Leathanaigh", "loading": "Á lódáil...", + "review": "Review", "addToDoc": "Cuir le Doiciméad", "reset": "Athshocraigh", "apply": "Cuir i bhFeidhm", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Polasaí Príobháideachta", + "iAgreeToThe": "I agree to all of the", "terms": "Téarmaí agus Coinníollacha", "accessibility": "Inrochtaineacht", "cookie": "Polasaí Fianán", @@ -160,6 +250,7 @@ "title": "An bhfuil fonn ort PDF Stirling a fheabhsú?", "paragraph1": "Tá rogha an diúltaithe ag PDF Stirling chun cabhrú linn an táirge a fheabhsú. Ní rianaimid aon fhaisnéis phearsanta nó ábhar comhaid.", "paragraph2": "Smaoinigh le do thoil ar anailísíocht a chumasú chun cabhrú le Stirling-PDF fás agus chun ligean dúinn ár n-úsáideoirí a thuiscint níos fearr.", + "learnMore": "Learn more", "enable": "Cumasaigh anailísíocht", "disable": "Díchumasaigh anailísíocht", "settings": "Is féidir leat na socruithe don anailísíocht a athrú sa chomhad config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Sábháil ionchuir fhoirm", "help": "Cumasaigh ionchuir a úsáideadh roimhe seo a stóráil le haghaidh ritheanna amach anseo" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Iompórtáil/Easpórtáil Bunachar Sonraí", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Il-uirlis PDF", "desc": "Cumaisc, Rothlaigh, Atheagraigh, agus Bain leathanaigh" }, "merge": { + "tags": "combine,join,unite", "title": "Cumaisc", "desc": "Go héasca chumasadh go leor PDFanna isteach i gceann amháin." }, "split": { + "tags": "divide,separate,break", "title": "Scoilt", "desc": "Scoilt comhaid PDF isteach i ndoiciméid iolracha" }, "rotate": { + "tags": "turn,flip,orient", "title": "Rothlaigh", "desc": "Rothlaigh do PDFanna go héasca." }, + "convert": { + "tags": "transform,change", + "title": "Tiontaigh", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Eagraigh", + "desc": "Bain/Atheagraigh na leathanaigh in ord ar bith" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Cuir íomhá leis", + "desc": "Cuireann sé íomhá ar shuíomh socraithe ar an PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Cuir Uisce leis", + "desc": "Cuir comhartha uisce saincheaptha le do dhoiciméad PDF." + }, + "removePassword": { + "tags": "unlock", + "title": "Bain Pasfhocal", + "desc": "Bain cosaint phasfhocal ó do dhoiciméad PDF." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Comhbhrúigh", + "desc": "Comhbhrúigh PDFanna chun a méid comhaid a laghdú." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Athraigh Meiteashonraí", + "desc": "Athraigh/Bain/Cuir meiteashonraí ó dhoiciméad PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Scananna glanta", + "desc": "Scanann glantachán agus aimsíonn sé téacs ó íomhánna laistigh de PDF agus cuireann sé isteach arís é mar théacs." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Sliocht Íomhánna", + "desc": "Sliochtann sé gach íomhá ó PDF agus sábhálann sé iad a zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Comhartha", + "desc": "Cuireann síniú le PDF trí líníocht, téacs nó íomhá" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Comhcheangail", + "desc": "Bain gach eilimint agus foirm idirghníomhach as PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Sínigh le Deimhniú", + "desc": "Síníonn sé PDF le Deimhniú/Eochair (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Deisiúchán", + "desc": "Déanann sé iarracht PDF truaillithe/briste a dheisiú" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Bain leathanaigh Bhána", + "desc": "Aimsíonn agus baintear leathanaigh bhána de dhoiciméad" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Bain Anótálacha", + "desc": "Baintear gach trácht/nóta de PDF" + }, + "compare": { + "tags": "difference", + "title": "Déan comparáid idir", + "desc": "Déanann sé na difríochtaí idir 2 Dhoiciméad PDF a chur i gcomparáid agus a thaispeáint" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Bain Comhartha Teastais", + "desc": "Bain síniú teastas ó PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Leagan Amach Illeathanaigh", + "desc": "Cumaisc leathanaigh iolracha de dhoiciméad PDF isteach i leathanach amháin" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Coigeartaigh méid/scála an leathanaigh", + "desc": "Athraigh méid/scála leathanaigh agus/nó a bhfuil ann." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Cuir Uimhreacha Leathanaigh leis", + "desc": "Cuir uimhreacha Leathanach leis an doiciméad i suíomh socraithe" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Coigeartaigh Dathanna/Codarsnacht", + "desc": "Coigeartaigh Codarsnacht, Sáithiú agus Gile PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF a ghearradh", + "desc": "Bearr PDF chun a mhéid a laghdú (coimeádann an téacs!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Leathanaigh Scoilte Uathoibríoch", + "desc": "Auto Scoilt PDF Scanta le Cód QR scoilteoir leathanach scanadh fisiciúil" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Faigh GACH Eolas ar PDF", + "desc": "Grab aon fhaisnéis agus is féidir ar PDFs" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF go leathanach mór amháin", + "desc": "Cumasc gach leathanach PDF isteach i leathanach mór amháin" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Taispeáin Javascript", + "desc": "Déanann sé cuardach agus taispeáint ar aon JS a instealladh isteach i PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Athchóiriú de Láimh", + "desc": "Réiteann sé PDF bunaithe ar théacs roghnaithe, cruthanna tarraingthe agus/nó leathanaigh roghnaithe" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Bain íomhá", + "desc": "Bain íomhá de PDF chun méid comhaid a laghdú" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Scoil PDF ar Chaibidlí", + "desc": "Scoilt PDF ina chomhaid iolracha bunaithe ar a struchtúr caibidle." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Bailíochtaigh Síniú PDF", + "desc": "Fíoraigh sínithe digiteacha agus teastais i gcáipéisí PDF" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Leathanaigh Sliocht", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Bain", + "desc": "Scrios leathanaigh nach dteastaíonn ó do dhoiciméad PDF." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Auto Scoilte de réir Méid/Comhaireamh", + "desc": "Scoilt PDF amháin i ndoiciméid iolracha bunaithe ar mhéid, líon na leathanach, nó comhaireamh doiciméad" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Cuir Pasfhocal leis", + "desc": "Criptigh do dhoiciméad PDF le focal faire." + }, + "changePermissions": { + "title": "Athrú Ceadanna", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Forleagain PDF ar bharr PDF eile", + "title": "Forleagan PDF" + }, "imageToPDF": { "title": "Íomhá go PDF", "desc": "Tiontaigh íomhá (PNG, JPEG, GIF) go PDF." @@ -355,18 +786,6 @@ "title": "PDF go íomhá", "desc": "Tiontaigh PDF a íomhá. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Eagraigh", - "desc": "Bain/Atheagraigh na leathanaigh in ord ar bith" - }, - "addImage": { - "title": "Cuir íomhá leis", - "desc": "Cuireann sé íomhá ar shuíomh socraithe ar an PDF" - }, - "watermark": { - "title": "Cuir Uisce leis", - "desc": "Cuir comhartha uisce saincheaptha le do dhoiciméad PDF." - }, "permissions": { "title": "Athrú Ceadanna", "desc": "Athraigh ceadanna do dhoiciméad PDF" @@ -375,38 +794,10 @@ "title": "Bain", "desc": "Scrios leathanaigh nach dteastaíonn ó do dhoiciméad PDF." }, - "addPassword": { - "title": "Cuir Pasfhocal leis", - "desc": "Criptigh do dhoiciméad PDF le focal faire." - }, - "removePassword": { - "title": "Bain Pasfhocal", - "desc": "Bain cosaint phasfhocal ó do dhoiciméad PDF." - }, - "compress": { - "title": "Comhbhrúigh", - "desc": "Comhbhrúigh PDFanna chun a méid comhaid a laghdú." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Athraigh Meiteashonraí", - "desc": "Athraigh/Bain/Cuir meiteashonraí ó dhoiciméad PDF" - }, "fileToPDF": { "title": "Comhad a thiontú go PDF", "desc": "Tiontaigh beagnach aon chomhad go PDF (DOCX, PNG, XLS, PPT, TXT agus go leor eile)" }, - "ocr": { - "title": "OCR / Scananna glanta", - "desc": "Scanann glantachán agus aimsíonn sé téacs ó íomhánna laistigh de PDF agus cuireann sé isteach arís é mar théacs." - }, - "extractImages": { - "title": "Sliocht Íomhánna", - "desc": "Sliochtann sé gach íomhá ó PDF agus sábhálann sé iad a zip" - }, "pdfToPDFA": { "title": "PDF go PDF/A", "desc": "Tiontaigh PDF go PDF/A le haghaidh stórála fadtéarmach" @@ -435,70 +826,14 @@ "title": "Braith / Scoilt grianghraif Scanta", "desc": "Scoilteann sé grianghraif iolracha ó laistigh de ghrianghraf/PDF" }, - "sign": { - "title": "Comhartha", - "desc": "Cuireann síniú le PDF trí líníocht, téacs nó íomhá" - }, - "flatten": { - "title": "Comhcheangail", - "desc": "Bain gach eilimint agus foirm idirghníomhach as PDF" - }, - "repair": { - "title": "Deisiúchán", - "desc": "Déanann sé iarracht PDF truaillithe/briste a dheisiú" - }, - "removeBlanks": { - "title": "Bain leathanaigh Bhána", - "desc": "Aimsíonn agus baintear leathanaigh bhána de dhoiciméad" - }, - "removeAnnotations": { - "title": "Bain Anótálacha", - "desc": "Baintear gach trácht/nóta de PDF" - }, - "compare": { - "title": "Déan comparáid idir", - "desc": "Déanann sé na difríochtaí idir 2 Dhoiciméad PDF a chur i gcomparáid agus a thaispeáint" - }, - "certSign": { - "title": "Sínigh le Deimhniú", - "desc": "Síníonn sé PDF le Deimhniú/Eochair (PEM/P12)" - }, - "removeCertSign": { - "title": "Bain Comhartha Teastais", - "desc": "Bain síniú teastas ó PDF" - }, - "pageLayout": { - "title": "Leagan Amach Illeathanaigh", - "desc": "Cumaisc leathanaigh iolracha de dhoiciméad PDF isteach i leathanach amháin" - }, - "scalePages": { - "title": "Coigeartaigh méid/scála an leathanaigh", - "desc": "Athraigh méid/scála leathanaigh agus/nó a bhfuil ann." - }, "pipeline": { "title": "Píblíne (Ardleibhéal)", "desc": "Rith gníomhartha iolracha ar PDFanna trí scripteanna píblíne a shainiú" }, - "addPageNumbers": { - "title": "Cuir Uimhreacha Leathanaigh leis", - "desc": "Cuir uimhreacha Leathanach leis an doiciméad i suíomh socraithe" - }, "auto-rename": { "title": "Comhad PDF a athainmniú go huathoibríoch", "desc": "Athainmníonn Auto comhad PDF bunaithe ar a cheanntásc braite" }, - "adjustContrast": { - "title": "Coigeartaigh Dathanna/Codarsnacht", - "desc": "Coigeartaigh Codarsnacht, Sáithiú agus Gile PDF" - }, - "crop": { - "title": "PDF a ghearradh", - "desc": "Bearr PDF chun a mhéid a laghdú (coimeádann an téacs!)" - }, - "autoSplitPDF": { - "title": "Leathanaigh Scoilte Uathoibríoch", - "desc": "Auto Scoilt PDF Scanta le Cód QR scoilteoir leathanach scanadh fisiciúil" - }, "sanitizePDF": { "title": "Sláintíocht", "desc": "Bain scripteanna agus gnéithe eile ó chomhaid PDF" @@ -519,30 +854,14 @@ "title": "PDF chuig Markdown", "desc": "Tiontaíonn PDF ar bith go Markdown" }, - "getPdfInfo": { - "title": "Faigh GACH Eolas ar PDF", - "desc": "Grab aon fhaisnéis agus is féidir ar PDFs" - }, "pageExtracter": { "title": "Sliocht leathanach(eacha)", "desc": "Sleachta roghnaigh leathanaigh ó PDF" }, - "pdfToSinglePage": { - "title": "PDF go leathanach mór amháin", - "desc": "Cumasc gach leathanach PDF isteach i leathanach mór amháin" - }, - "showJS": { - "title": "Taispeáin Javascript", - "desc": "Déanann sé cuardach agus taispeáint ar aon JS a instealladh isteach i PDF" - }, "autoRedact": { "title": "Auto Redact", "desc": "Auto Redacts (Blacks out) téacs i PDF bunaithe ar an téacs ionchuir" }, - "redact": { - "title": "Athchóiriú de Láimh", - "desc": "Réiteann sé PDF bunaithe ar théacs roghnaithe, cruthanna tarraingthe agus/nó leathanaigh roghnaithe" - }, "PDFToCSV": { "title": "Ó CSV go PDF", "desc": "Sleachta Táblaí ó PDF agus é a thiontú go CSV" @@ -551,10 +870,6 @@ "title": "Auto Scoilte de réir Méid/Comhaireamh", "desc": "Scoilt PDF amháin i ndoiciméid iolracha bunaithe ar mhéid, líon na leathanach, nó comhaireamh doiciméad" }, - "overlay-pdfs": { - "title": "Forleagan PDF", - "desc": "Forleagain PDF ar bharr PDF eile" - }, "split-by-sections": { "title": "Scoilt PDF de réir ailt", "desc": "Roinn gach leathanach de PDF i gcodanna cothrománacha agus ingearacha níos lú" @@ -563,43 +878,17 @@ "title": "Cuir Stampa go PDF", "desc": "Cuir téacs leis nó cuir stampaí íomhá leis ag láithreacha socraithe" }, - "removeImage": { - "title": "Bain íomhá", - "desc": "Bain íomhá de PDF chun méid comhaid a laghdú" - }, - "splitByChapters": { - "title": "Scoil PDF ar Chaibidlí", - "desc": "Scoilt PDF ina chomhaid iolracha bunaithe ar a struchtúr caibidle." - }, - "validateSignature": { - "title": "Bailíochtaigh Síniú PDF", - "desc": "Fíoraigh sínithe digiteacha agus teastais i gcáipéisí PDF" - }, "replace-color": { "title": "Athchuir agus Inbhéartaigh Dath", "desc": "Athchuir dath an téacs agus an chúlra i bhformáid PDF agus inbhéartaigh dath iomlán pdf chun méid comhaid a laghdú" }, - "convert": { - "title": "Tiontaigh" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Leathanaigh Sliocht" - }, - "removePages": { - "title": "Bain", - "desc": "Scrios leathanaigh nach dteastaíonn ó do dhoiciméad PDF." - }, "removeImagePdf": { "title": "Bain íomhá", "desc": "Bain íomhá de PDF chun méid comhaid a laghdú" }, - "autoSizeSplitPDF": { - "title": "Auto Scoilte de réir Méid/Comhaireamh", - "desc": "Scoilt PDF amháin i ndoiciméid iolracha bunaithe ar mhéid, líon na leathanach, nó comhaireamh doiciméad" - }, "adjust-contrast": { "title": "Coigeartaigh Dathanna/Codarsnacht", "desc": "Coigeartaigh Codarsnacht, Sáithiú agus Gile PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Athchuir agus Inbhéartaigh Dath", "desc": "Athchuir dath an téacs agus an chúlra i bhformáid PDF agus inbhéartaigh dath iomlán pdf chun méid comhaid a laghdú" - }, - "changePermissions": { - "title": "Athrú Ceadanna" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "amharc, léamh, anótáil, téacs, íomhá", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "chumasadh,Oibríochtaí Leathanaigh,Cúl-deireadh,taobh freastalaí", "title": "Cumaisc", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Cumaisc", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Ainm comhaid", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Cumaisc PDFanna iolracha (2+)", "sortByName": "Sórtáil de réir ainm", "sortByDate": "Sórtáil de réir dáta", - "removeCertSign": "Bain síniú digiteach sa chomhad cumaiscthe?", - "submit": "Cumaisc", - "sortBy": { - "filename": "Ainm comhaid" - } + "removeCertSign": "Bain síniú digiteach sa chomhad cumaiscthe?" }, "split": { - "tags": "Oibríochtaí leathanach, roinnt, Leathanach Il, gearrtha, taobh freastalaí", "title": "Scoilt PDF", "header": "Scoilt PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Iontráil leathanaigh le scoilt ar:", "submit": "Scoilt", "steps": { + "chooseMethod": "Choose Method", "settings": "Socruithe" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Méid an Chomhaid" + "name": "Méid an Chomhaid", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Méid an Chomhaid" + "label": "Méid an Chomhaid", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Oibríochtaí leathanach, roinnt, Leathanach Il, gearrtha, taobh freastalaí" }, "rotate": { - "tags": "taobh freastalaí", "title": "Rothlaigh PDF", + "submit": "Rothlaigh", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "taobh freastalaí", "header": "Rothlaigh PDF", - "selectAngle": "Roghnaigh uillinn rothlaithe (i iolraí de 90 céim):", - "submit": "Rothlaigh" + "selectAngle": "Roghnaigh uillinn rothlaithe (i iolraí de 90 céim):" + }, + "convert": { + "title": "Tiontaigh", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Socruithe", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Dath", + "greyscale": "Scála Liath", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Líon Leathanach", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "Tá síniú digiteach ar an PDF. Bainfear é seo sa chéad chéim eile.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Scála Liath", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "comhshó, img, jpg, pictiúr, grianghraf" @@ -727,7 +1263,33 @@ "8": "Bain Last", "9": "Bain An Chéad agus an Deireadh", "10": "Corr-Fiú Cumaisc", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(m.sh. 1,3,2 nó 4-8,2,10-12 nó 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Cuir íomhá leis", "submit": "Cuir íomhá leis" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Téacs, athrá, lipéad, úinéireacht, cóipcheart, trádmharc, img, jpg, pictiúr, grianghraf", "title": "Cuir Uisce leis", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Cuir Uisce leis", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Téacs", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Méid an Chló", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Téacs", + "2": "Íomha" + }, + "tags": "Téacs, athrá, lipéad, úinéireacht, cóipcheart, trádmharc, img, jpg, pictiúr, grianghraf", "header": "Cuir Uisce leis", "customColor": "Dath Téacs Saincheaptha", "selectText": { @@ -755,17 +1506,6 @@ "8": "Cineál Comhartha Uisce:", "9": "Íomhá Comhartha Uisce:", "10": "Tiontaigh PDF go PDF-Íomhá" - }, - "submit": "Cuir Uisce leis", - "type": { - "1": "Téacs", - "2": "Íomha" - }, - "watermarkType": { - "text": "Téacs" - }, - "settings": { - "fontSize": "Méid an Chló" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Bain leathanaigh, scrios leathanaigh", "title": "Bain", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Bain" }, - "addPassword": { - "tags": "slán, slándáil", - "title": "Cuir Pasfhocal leis", - "header": "Cuir pasfhocal leis (Criptigh)", - "selectText": { - "1": "Roghnaigh PDF le criptiú", - "2": "Pasfhocal Úsáideora", - "3": "Fad Eochracha Criptithe", - "4": "Tá luachanna níos airde níos láidre, ach tá comhoiriúnacht níos fearr ag luachanna níos ísle.", - "5": "Ceadanna le socrú (Moltar iad a úsáid in éineacht le pasfhocal an Úinéara)", - "6": "Cosc a chur le chéile doiciméad", - "7": "Cosc a chur ar eastóscadh ábhar", - "8": "Cosc a chur ar eastóscadh le haghaidh inrochtaineachta", - "9": "Cosc ar fhoirm a líonadh", - "10": "Cosc a chur ar mhodhnú", - "11": "Cosc a chur ar mhodhnú anótála", - "12": "Cosc a chur ar phriontáil", - "13": "Cosc a chur ar phriontáil bhformáidí éagsúla", - "14": "Pasfhocal Úinéir", - "15": "Cuireann sé srian lenar féidir a dhéanamh leis an doiciméad nuair a osclaítear é (Ní thacaíonn gach léitheoir leis)", - "16": "Cuireann sé srian le hoscailt an doiciméid féin" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Criptigh", "tooltip": { - "permissions": { - "title": "Athrú Ceadanna" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "slán, Díchriptiú, slándáil, Unpassword, scrios pasfhocal", - "title": "Bain pasfhocal", - "header": "Bain pasfhocal (Díchriptigh)", - "selectText": { - "1": "Roghnaigh PDF le Díchriptiú", - "2": "Pasfhocal" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Bain", - "desc": "Bain cosaint phasfhocal ó do dhoiciméad PDF.", - "password": { - "stepTitle": "Bain Pasfhocal", - "label": "Pasfhocal reatha" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Teideal,údar, dáta, cruthú, am, foilsitheoir, léiritheoir, staitisticí", - "title": "Athraigh Meiteashonraí", "header": "Athraigh Meiteashonraí", + "submit": "Athrú", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Teideal,údar, dáta, cruthú, am, foilsitheoir, léiritheoir, staitisticí", "selectText": { "1": "Cuir na hathróga is mian leat a athrú in eagar", "2": "Scrios na meiteashonraí go léir", @@ -856,15 +1877,7 @@ "4": "Meiteashonraí Eile:", "5": "Cuir Iontráil Meiteashonraí Saincheaptha leis" }, - "author": "Údar:", - "creationDate": "Dáta Cruthaithe (bbbb/MM/ll HH:mm:ss):", - "creator": "Cruthaitheoir:", - "keywords": "Eochairfhocail:", - "modDate": "Dáta Mionathraithe (bbbb/MM/ll HH:mm:ss):", - "producer": "léiritheoir:", - "subject": "Ábhar:", - "trapped": "Gafa:", - "submit": "Athrú" + "modDate": "Dáta Mionathraithe (bbbb/MM/ll HH:mm:ss):" }, "fileToPDF": { "tags": "claochlú, formáid, doiciméad, pictiúr, sleamhnán, téacs, comhshó, oifig, docs, focal, excel, powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "aithint, téacs, íomhá, scanadh, léamh, a aithint, a bhrath, in eagar", "title": "OCR / Glanta Scan", + "desc": "Scanann glantachán agus aimsíonn sé téacs ó íomhánna laistigh de PDF agus cuireann sé isteach arís é mar théacs.", "header": "Scananna Glanta / OCR (Aithint Optúil Carachtair)", "selectText": { "1": "Roghnaigh teangacha atá le brath laistigh den PDF (Is iad na cinn a liostaítear na cinn a aimsítear faoi láthair):", @@ -896,23 +1910,89 @@ "help": "Léigh le do thoil an doiciméadú seo ar conas é seo a úsáid do theangacha eile agus/nó úsáid nach bhfuil i ndugairí", "credit": "Úsáideann an tseirbhís seo qpdf agus Tesseract le haghaidh OCR.", "submit": "Próiseáil PDF le OCR", - "desc": "Scanann glantachán agus aimsíonn sé téacs ó íomhánna laistigh de PDF agus cuireann sé isteach arís é mar théacs.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Socruithe", "ocrMode": { - "label": "Mód OCR" + "label": "Mód OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Teangacha" + "label": "Teangacha", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Mód OCR" + "title": "Mód OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Teangacha" + "title": "Teangacha", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Sliocht Íomhánna", "selectText": "Roghnaigh formáid íomhá chun íomhánna bainte a thiontú go", "allowDuplicates": "Sábháil íomhánna dúblacha", - "submit": "Sliocht" + "submit": "Sliocht", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "cartlann, fadtéarmach, caighdeánach, comhshó, stóráil, caomhnú", @@ -993,17 +2079,53 @@ }, "info": "Níl Python suiteáilte. Tá sé ag teastáil a rith." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "údarú, tosaigh, síniú tarraingthe, comhartha téacs, íomhá-shíniú", "title": "Comhartha", "header": "Sínigh comhaid PDF", "upload": "Uaslódáil Íomhá", - "draw": "Tarraing Síniú", - "text": "Ionchur Téacs", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Glan", "add": "Cuir", "saved": "Sínithe Sínithe", "save": "Sábháil an Síniú", + "applySignatures": "Apply Signatures", "personalSigs": "Sínithe Pearsanta", "sharedSigs": "Sínithe Roinnte", "noSavedSigs": "Níor aimsíodh aon síniú sábháilte", @@ -1015,42 +2137,179 @@ "previous": "Leathanach roimhe seo", "maintainRatio": "Scoránaigh, coinnigh an cóimheas gné", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "údarú, tosaigh, síniú tarraingthe, comhartha téacs, íomhá-shíniú" }, "flatten": { - "tags": "statach, díghníomhachtú, neamh-idirghníomhach, sruthlíniú", "title": "Comhcheangail", "header": "PDF cothromú", "flattenOnlyForms": "Flatten foirmeacha amháin", "submit": "Comhcheangail", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Socruithe" }, "options": { - "flattenOnlyForms": "Flatten foirmeacha amháin" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Flatten foirmeacha amháin", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statach, díghníomhachtú, neamh-idirghníomhach, sruthlíniú" }, "repair": { "tags": "deisiú, athchóiriú, ceartú, aisghabháil", "title": "Deisiúchán", "header": "PDF a dheisiú", - "submit": "Deisiúchán" + "submit": "Deisiúchán", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "glanta, sruthlíniú, neamhábhar, eagrú", "title": "Bain Bearnaí", "header": "Bain Leathanaigh Bhána", - "threshold": "Tairseach Bánachta picteilíní:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Bain Bearnaí", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "glanta, sruthlíniú, neamhábhar, eagrú", "thresholdDesc": "An tairseach chun a chinneadh cé chomh bán is gá picteilín bán a bheith le rangú mar 'Bán'. 0", - "whitePercent": "Céatadán Bán (%):", - "whitePercentDesc": "Céatadán an leathanaigh a chaithfidh picteilíní 'bán' a bheith ann lena bhaint", - "submit": "Bain Bearnaí" + "whitePercentDesc": "Céatadán an leathanaigh a chaithfidh picteilíní 'bán' a bheith ann lena bhaint" }, "removeAnnotations": { "tags": "tuairimí, aibhsiú, nótaí, marcáil, bain", "title": "Bain Anótálacha", "header": "Bain Anótálacha", - "submit": "Bain" + "submit": "Bain", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "idirdhealú, codarsnacht, athruithe, anailís", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "fíordheimhnigh, PEM, P12, oifigiúil, criptigh", "title": "Síniú Teastais", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Suíomh", + "logoTitle": "Logo", + "name": "Ainm", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Cuir isteach do Phasfhocal Stórais Eochracha nó Eochracha Príobháidí (más ann dó):", + "passwordOptional": "Leave empty if no password", + "reason": "Cúis", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Taispeáin Lógó", "header": "Sínigh PDF le do theastas (Obair ar siúl)", "selectPDF": "Roghnaigh Comhad PDF le síniú:", "jksNote": "Nóta: Mura bhfuil do chineál teastais liostaithe thíos, le do thoil é a thiontú go comhad Java Keystore (.jks) ag baint úsáide as an uirlis líne ordaithe keytool. Ansin, roghnaigh an rogha comhad .jks thíos.", @@ -1089,13 +2484,7 @@ "selectCert": "Roghnaigh Do Chomhad Teastais (formáid X.509, d'fhéadfadh sé a bheith .pem nó .der):", "selectP12": "Roghnaigh Do Chomhad Siopa Eochracha PKCS#12 (.p12 nó .pfx) (Roghnach, Má chuirtear ar fáil é, ba cheart go mbeadh d'eochair phríobháideach agus teastas ann):", "selectJKS": "Roghnaigh Do Chomhad Keystore Java (.jks nó .keystore):", - "certType": "Cineál Teastais", - "password": "Cuir isteach do Phasfhocal Stórais Eochracha nó Eochracha Príobháidí (más ann dó):", "showSig": "Taispeáin Síniú", - "reason": "Cúis", - "location": "Suíomh", - "name": "Ainm", - "showLogo": "Taispeáin Lógó", "submit": "Sínigh PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Bain Síniú Teastais", "header": "Bain an deimhniú digiteach ó PDF", "selectPDF": "Roghnaigh comhad PDF:", - "submit": "Bain Síniú" + "submit": "Bain Síniú", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "chumasc, ilchodach, aon-amharc, a eagrú", @@ -1111,16 +2511,157 @@ "header": "Leagan Amach Illeathanaigh", "pagesPerSheet": "Leathanaigh in aghaidh na bileoige:", "addBorder": "Cuir Teorainneacha leis", - "submit": "Cuir isteach" + "submit": "Cuir isteach", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "athraigh, modhnaigh, toise, cuir in oiriúint", "title": "Coigeartaigh scála an leathanaigh", "header": "Coigeartaigh scála an leathanaigh", "pageSize": "Méid leathanach den doiciméad.", "keepPageSize": "Méid Bunaidh", "scaleFactor": "Leibhéal súmáil (barr) de leathanach.", - "submit": "Cuir isteach" + "submit": "Cuir isteach", + "tags": "athraigh, modhnaigh, toise, cuir in oiriúint" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "leathanach, lipéad, eagraigh, innéacs" @@ -1129,16 +2670,83 @@ "tags": "auto-bhrath, ceanntásc-bhunaithe, a eagrú, a athlipéadú", "title": "Athainmnigh Uathainm", "header": "Auto Athainmnigh PDF", - "submit": "Athainmnigh Uathainm" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Athainmnigh Uathainm", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "dath-cheartú, tune, a mhodhnú, a fheabhsú" }, "crop": { - "tags": "Baile Átha Troim, Laghdaigh, Cuir in eagar, Cruth", "title": "Barraí", "header": "PDF a ghearradh", - "submit": "Cuir isteach" + "submit": "Cuir isteach", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "Baile Átha Troim, Laghdaigh, Cuir in eagar, Cruth" }, "autoSplitPDF": { "tags": "QR-bhunaithe, ar leith, scanadh-deighleog, eagrú", @@ -1221,24 +2829,124 @@ "downloadJS": "Íosluchtaigh Javascript", "submit": "Taispeáin" }, - "autoRedact": { - "tags": "Dearg, Folaigh, dubh amach, dubh, marcóir, i bhfolach", - "title": "Auto Redact", - "header": "Auto Redact", - "colorLabel": "Dath", - "textsToRedactLabel": "Téacs go Deighilt (línescartha)", - "textsToRedactPlaceholder": "e.g. \\nRúnda \\nTrí-rúnda", - "useRegexLabel": "Bain úsáid as Regex", - "wholeWordSearchLabel": "Cuardach Focal Iomlán", - "customPaddingLabel": "Stuáil Breise Saincheaptha", - "convertPDFToImageLabel": "Tiontaigh PDF go PDF-Image (Úsáidte chun téacs a bhaint taobh thiar den bhosca)", - "submitButton": "Cuir isteach" - }, "redact": { "tags": "Réiteach, Folaigh, dubh amach, dubh, marcóir, i bhfolach, lámhleabhar", "title": "Athchóiriú de Láimh", - "header": "Athchóiriú de Láimh", "submit": "Réiteach", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Casta" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Cuir", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Leathanaigh", + "placeholder": "(m.sh. 1,2,8 nó 4,7,12-16 nó 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Easpórtáil", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Athchóiriú de Láimh", "textBasedRedaction": "Athrú Téacsbhunaithe", "pageBasedRedaction": "Athrú bunaithe ar Leathanaigh", "convertPDFToImageLabel": "Tiontaigh PDF go PDF-Image (Úsáidte chun téacs a bhaint taobh thiar den bhosca)", @@ -1264,22 +2972,7 @@ "showLayers": "Taispeáin Sraitheanna (cliceáil faoi dhó chun gach sraith a athshocrú go dtí an staid réamhshocraithe)", "colourPicker": "Roghnóir Dathanna", "findCurrentOutlineItem": "Faigh imlíne reatha", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Casta" - }, - "wordsToRedact": { - "add": "Cuir" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Leathanaigh", - "placeholder": "(m.sh. 1,2,8 nó 4,7,12-16 nó 2n-1)" - }, - "export": "Easpórtáil" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV, Eastóscadh Tábla, sliocht, tiontú" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "Forleagan", "header": "Forleagan comhaid PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Roghnaigh Bonn Comhad PDF" }, "overlayFiles": { - "label": "Roghnaigh Forleagan Comhaid PDF" + "label": "Roghnaigh Forleagan Comhaid PDF", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Roghnaigh Mód Forleagan", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "Áireamh Forleagan (do Mhód Athdhéanta Seasta)", - "placeholder": "Cuir isteach comhairimh scartha le camóga (m.sh., 2,3,1)" + "placeholder": "Cuir isteach comhairimh scartha le camóga (m.sh., 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Roghnaigh Post Forleagan", "foreground": "Tulra", "background": "Cúlra" }, - "submit": "Cuir isteach" + "submit": "Cuir isteach", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Roinn Scoilt, Roinn, Saincheap", @@ -1332,6 +3068,7 @@ "tags": "Stampa, Cuir íomhá, íomhá lár, Uisce, PDF, Leabú, Saincheap", "header": "Stampa PDF", "title": "Stampa PDF", + "stampSetup": "Stamp Setup", "stampType": "Cineál Stampa", "stampText": "Téacs Stampa", "stampImage": "Íomhá Stampa", @@ -1344,7 +3081,19 @@ "overrideY": "Sáraigh Y Comhordanáid", "customMargin": "Imeall an Chustaim", "customColor": "Dath Téacs Saincheaptha", - "submit": "Cuir isteach" + "submit": "Cuir isteach", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Bain Íomhá, Oibríochtaí Leathanaigh, Cúl, taobh an fhreastalaí" @@ -1362,7 +3111,8 @@ "status": { "_value": "Stádas", "valid": "Bailí", - "invalid": "Neamhbhailí" + "invalid": "Neamhbhailí", + "complete": "Validation complete" }, "signer": "Sínitheoir", "date": "Dáta", @@ -1389,40 +3139,122 @@ "version": "Leagan", "keyUsage": "Úsáid Eochrach", "selfSigned": "Féin-Sínithe", - "bits": "giotáin" + "bits": "giotáin", + "details": "Certificate Details" }, "signature": { "info": "Eolas Sínithe", "_value": "Síniú", "mathValid": "Tá an síniú bailí go matamaiticiúil ACH:" }, - "selectCustomCert": "Comhad Teastais Saincheaptha X.509 (Roghnach)" - }, - "replace-color": { - "title": "Athchuir-Inbhéartaigh-Dath", - "header": "Athchuir-Inbhéartaigh Dath PDF", - "selectText": { - "1": "Athchuir nó Inbhéartaigh Roghanna datha", - "2": "Réamhshocrú(Réamhshocrú dathanna ardchodarsnachta)", - "3": "Saincheaptha(dathanna saincheaptha)", - "4": "Iompaithe Lán(Inbhéartaigh gach dath)", - "5": "Roghanna dathanna ardchodarsnachta", - "6": "téacs bán ar chúlra dubh", - "7": "Téacs dubh ar chúlra bán", - "8": "Téacs buí ar chúlra dubh", - "9": "Téacs glas ar chúlra dubh", - "10": "Roghnaigh Dath an téacs", - "11": "Roghnaigh Dath an Chúlra" + "selectCustomCert": "Comhad Teastais Saincheaptha X.509 (Roghnach)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Ionadaigh" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Athchuir Dath,Oibríochtaí Leathanaigh,Cúl,taobh an fhreastalaí" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Sínigh isteach", "header": "Sínigh isteach", "signin": "Sínigh isteach", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Cuimhnigh orm", "invalid": "Ainm úsáideora nó pasfhocal neamhbhailí.", "locked": "Tá do chuntas glasáilte.", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "Tá tú logáilte isteach cheana", "alreadyLoggedIn2": "gléasanna. Logáil amach as na gléasanna agus bain triail eile as.", "toManySessions": "Tá an iomarca seisiún gníomhach agat", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF go leathanach amháin", "header": "PDF go leathanach amháin", - "submit": "Tiontaigh go Leathanach Aonair" + "submit": "Tiontaigh go Leathanach Aonair", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Leathanaigh Sliocht", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "Coigeartaigh Codarsnacht", "header": "Coigeartaigh Codarsnacht", + "basic": "Basic Adjustments", "contrast": "Codarsnacht:", "brightness": "Gile:", "saturation": "Sáithiú:", - "download": "Íosluchtaigh" + "download": "Íosluchtaigh", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Comhbhrúigh", + "desc": "Compress PDFs to reduce their file size.", "header": "Comhbhrúigh PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Méid an Chomhaid" + }, "credit": "Úsáideann an tseirbhís seo qpdf le haghaidh Comhbhrú/Optimization PDF.", "grayscale": { "label": "Cuir Scála Liath i bhFeidhm le Comhbhrú" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1491,10 +3435,7 @@ "4": "Mód uathoibríoch - Coigeartaíonn Auto cáilíocht chun PDF a fháil go dtí an méid cruinn", "5": "Méid PDF a bhfuiltear ag súil leis (m.sh. 25MB, 10.8MB, 25KB)" }, - "submit": "Comhbhrúigh", - "method": { - "filesize": "Méid an Chomhaid" - } + "submit": "Comhbhrúigh" }, "decrypt": { "passwordPrompt": "Tá an comhad seo cosanta ag pasfhocal. Cuir isteach an pasfhocal le do thoil:", @@ -1595,7 +3536,13 @@ "title": "Bain íomhá", "header": "Bain íomhá", "removeImage": "Bain íomhá", - "submit": "Bain íomhá" + "submit": "Bain íomhá", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Scoil PDF de réir Caibidlí", @@ -1629,6 +3576,12 @@ }, "note": "Tá nótaí eisiúna ar fáil i mBéarla amháin" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Íosluchtaigh", - "convert": { - "title": "Tiontaigh", - "settings": "Socruithe", - "color": "Dath", - "greyscale": "Scála Liath", - "fillPage": "Líon Leathanach", - "pdfaDigitalSignatureWarning": "Tá síniú digiteach ar an PDF. Bainfear é seo sa chéad chéim eile.", - "grayscale": "Scála Liath" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Roghnaigh Uile", - "deselectAll": "Díroghnaigh Uile" + "deselectAll": "Díroghnaigh Uile", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Comhartha" + "read": "Read", + "sign": "Comhartha", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Á lódáil...", - "or": "nó" + "or": "nó", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Ainm", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Leagan", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Roghnaigh Uile", "deselectAll": "Díroghnaigh Uile", "deleteSelected": "Scrios Roghnaithe", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Íosluchtaigh", - "delete": "Scrios" + "delete": "Scrios", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDF sláintíocht", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Socruithe" + "files": "Files", + "settings": "Socruithe", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Cuir Pasfhocal leis", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Criptigh", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Athrú Ceadanna", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "slán, slándáil", + "header": "Cuir pasfhocal leis (Criptigh)", + "selectText": { + "1": "Roghnaigh PDF le criptiú", + "2": "Pasfhocal Úsáideora", + "3": "Fad Eochracha Criptithe", + "4": "Tá luachanna níos airde níos láidre, ach tá comhoiriúnacht níos fearr ag luachanna níos ísle.", + "5": "Ceadanna le socrú (Moltar iad a úsáid in éineacht le pasfhocal an Úinéara)", + "6": "Cosc a chur le chéile doiciméad", + "7": "Cosc a chur ar eastóscadh ábhar", + "8": "Cosc a chur ar eastóscadh le haghaidh inrochtaineachta", + "9": "Cosc ar fhoirm a líonadh", + "10": "Cosc a chur ar mhodhnú", + "11": "Cosc a chur ar mhodhnú anótála", + "12": "Cosc a chur ar phriontáil", + "13": "Cosc a chur ar phriontáil bhformáidí éagsúla", + "14": "Pasfhocal Úinéir", + "15": "Cuireann sé srian lenar féidir a dhéanamh leis an doiciméad nuair a osclaítear é (Ní thacaíonn gach léitheoir leis)", + "16": "Cuireann sé srian le hoscailt an doiciméid féin" } }, "changePermissions": { "title": "Athrú Ceadanna", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Athrú Ceadanna", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Cosc a chur le chéile doiciméad" @@ -1737,10 +4580,784 @@ "label": "Cosc a chur ar phriontáil bhformáidí éagsúla" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Athrú Ceadanna" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Bain pasfhocal", + "desc": "Bain cosaint phasfhocal ó do dhoiciméad PDF.", + "tags": "slán, Díchriptiú, slándáil, Unpassword, scrios pasfhocal", + "password": { + "stepTitle": "Bain Pasfhocal", + "label": "Pasfhocal reatha", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Bain", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Bain pasfhocal (Díchriptigh)", + "selectText": { + "1": "Roghnaigh PDF le Díchriptiú", + "2": "Pasfhocal" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Athchuir nó Inbhéartaigh Roghanna datha", + "2": "Réamhshocrú(Réamhshocrú dathanna ardchodarsnachta)", + "3": "Saincheaptha(dathanna saincheaptha)", + "4": "Iompaithe Lán(Inbhéartaigh gach dath)", + "5": "Roghanna dathanna ardchodarsnachta", + "6": "téacs bán ar chúlra dubh", + "7": "Téacs dubh ar chúlra bán", + "8": "Téacs buí ar chúlra dubh", + "9": "Téacs glas ar chúlra dubh", + "10": "Roghnaigh Dath an téacs", + "11": "Roghnaigh Dath an Chúlra", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Ionadaigh", + "title": "Athchuir-Inbhéartaigh-Dath", + "header": "Athchuir-Inbhéartaigh Dath PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Dearg, Folaigh, dubh amach, dubh, marcóir, i bhfolach", + "title": "Auto Redact", + "header": "Auto Redact", + "colorLabel": "Dath", + "textsToRedactLabel": "Téacs go Deighilt (línescartha)", + "textsToRedactPlaceholder": "e.g. \\nRúnda \\nTrí-rúnda", + "useRegexLabel": "Bain úsáid as Regex", + "wholeWordSearchLabel": "Cuardach Focal Iomlán", + "customPaddingLabel": "Stuáil Breise Saincheaptha", + "convertPDFToImageLabel": "Tiontaigh PDF go PDF-Image (Úsáidte chun téacs a bhaint taobh thiar den bhosca)", + "submitButton": "Cuir isteach" + }, + "replaceColorPdf": { + "tags": "Athchuir Dath,Oibríochtaí Leathanaigh,Cúl,taobh an fhreastalaí" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/hi-IN/translation.json b/frontend/public/locales/hi-IN/translation.json index 75025f7a2..919b4a7b5 100644 --- a/frontend/public/locales/hi-IN/translation.json +++ b/frontend/public/locales/hi-IN/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "कस्टम टेक्स्ट", "numberPagesDesc": "कौन से पृष्ठ संख्यांकित करने हैं, डिफ़ॉल्ट 'सभी', 1-5 या 2,5,9 आदि भी स्वीकार करता है", "customNumberDesc": "डिफ़ॉल्ट {n}, 'पृष्ठ {n} कुल {total}', 'टेक्स्ट-{n}', '{filename}-{n}' भी स्वीकार करता है", - "submit": "पृष्ठ संख्या जोड़ें" + "submit": "पृष्ठ संख्या जोड़ें", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "कस्टम पृष्ठ चयन (पृष्ठ संख्याओं 1,5,6 या 2n+1 जैसे फ़ंक्शन की अल्पविराम से अलग सूची दर्ज करें):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "पीडीएफ फ़ाइल(ें) चुनें", "multiPdfPrompt": "पीडीएफ फ़ाइलें चुनें (2+)", "multiPdfDropPrompt": "आवश्यक सभी पीडीएफ फ़ाइलों को चुनें (या खींच कर छोड़ें)", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "चेतावनी: फ़ाइल के आकार के आधार पर यह प्रक्रिया एक मिनट तक ले सकती है", "pageOrderPrompt": "कस्टम पृष्ठ क्रम (पृष्ठ संख्याओं की अल्पविराम से अलग सूची या 2n+1 जैसे फ़ंक्शन दर्ज करें):", - "pageSelectionPrompt": "कस्टम पृष्ठ चयन (पृष्ठ संख्याओं 1,5,6 या 2n+1 जैसे फ़ंक्शन की अल्पविराम से अलग सूची दर्ज करें):", "goToPage": "जाएं", "true": "हाँ", "false": "नहीं", "unknown": "अज्ञात", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "सहेजें", "saveToBrowser": "ब्राउज़र में सहेजें", + "download": "डाउनलोड करें", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "बंद करें", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "फ़ाइलें चयनित", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "कोई पसंदीदा नहीं जोड़ा गया", "downloadComplete": "डाउनलोड पूर्ण", "bored": "इंतज़ार करते हुए बोर हो रहे हैं?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "पीडीएफ दस्तावेज़ पासवर्ड से सुरक्षित है और या तो पासवर्ड नहीं दिया गया था या गलत था", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "त्रुटि", + "dismissAllErrors": "Dismiss All Errors", "sorry": "समस्या के लिए खेद है!", "needHelp": "मदद चाहिए / कोई समस्या मिली?", "contactTip": "यदि आप अभी भी समस्याओं का सामना कर रहे हैं, तो मदद के लिए हमसे संपर्क करने में संकोच न करें। आप हमारे GitHub पृष्ठ पर टिकट जमा कर सकते हैं या Discord के माध्यम से हमसे संपर्क कर सकते हैं:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - समस्या टिकट जमा करें", "discordSubmit": "Discord - सहायता अनुरोध जमा करें" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "हटाएं", "username": "उपयोगकर्ता नाम", "password": "पासवर्ड", @@ -82,6 +169,7 @@ "green": "हरा", "blue": "नीला", "custom": "कस्टम...", + "comingSoon": "Coming soon", "WorkInProgess": "कार्य प्रगति पर है, काम नहीं कर सकता है या बग हो सकते हैं, कृपया किसी भी समस्या की रिपोर्ट करें!", "poweredBy": "द्वारा संचालित", "yes": "हाँ", @@ -115,12 +203,14 @@ "page": "पृष्ठ", "pages": "पृष्ठ", "loading": "लोड हो रहा है...", + "review": "Review", "addToDoc": "दस्तावेज़ में जोड़ें", "reset": "रीसेट", "apply": "लागू करें", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "गोपनीयता नीति", + "iAgreeToThe": "I agree to all of the", "terms": "नियम और शर्तें", "accessibility": "सुलभता", "cookie": "कुकी नीति", @@ -160,6 +250,7 @@ "title": "क्या आप Stirling PDF को बेहतर बनाना चाहते हैं?", "paragraph1": "Stirling PDF में उत्पाद को बेहतर बनाने में मदद करने के लिए विकल्प विश्लेषण है। हम किसी भी व्यक्तिगत जानकारी या फ़ाइल सामग्री को ट्रैक नहीं करते हैं।", "paragraph2": "कृपया Stirling-PDF को बढ़ने में मदद करने और हमें अपने उपयोगकर्ताओं को बेहतर समझने के लिए विश्लेषण सक्षम करने पर विचार करें।", + "learnMore": "Learn more", "enable": "विश्लेषण सक्षम करें", "disable": "विश्लेषण अक्षम करें", "settings": "आप config/settings.yml फ़ाइल में विश्लेषण के लिए सेटिंग्स बदल सकते हैं" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "फ़ॉर्म इनपुट सहेजें", "help": "भविष्य के उपयोग के लिए पहले से उपयोग किए गए इनपुट को स्टोर करने के लिए सक्षम करें" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "डेटाबेस आयात/निर्यात", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF मल्टी टूल", "desc": "मर्ज करें, घुमाएं, पुनर्व्यवस्थित करें और पृष्ठ हटाएं" }, "merge": { + "tags": "combine,join,unite", "title": "मर्ज", "desc": "कई PDF को आसानी से एक में मर्ज करें।" }, "split": { + "tags": "divide,separate,break", "title": "विभाजित", "desc": "PDF को कई दस्तावेजों में विभाजित करें" }, "rotate": { + "tags": "turn,flip,orient", "title": "घुमाएं", "desc": "अपनी PDF को आसानी से घुमाएं।" }, + "convert": { + "tags": "transform,change", + "title": "बदलें", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "व्यवस्थित करें", + "desc": "किसी भी क्रम में पृष्ठ निकालें/पुनर्व्यवस्थित करें" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "छवि जोड़ें", + "desc": "PDF पर एक निर्धारित स्थान पर छवि जोड़ें" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "वॉटरमार्क जोड़ें", + "desc": "अपने PDF दस्तावेज में कस्टम वॉटरमार्क जोड़ें।" + }, + "removePassword": { + "tags": "unlock", + "title": "पासवर्ड हटाएं", + "desc": "अपने PDF दस्तावेज से पासवर्ड सुरक्षा हटाएं।" + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "कम्प्रेस", + "desc": "PDF को कम्प्रेस करें ताकि उनका फ़ाइल आकार कम हो जाए।" + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "मेटाडेटा बदलें", + "desc": "PDF दस्तावेज से मेटाडेटा बदलें/हटाएं/जोड़ें" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / स्कैन साफ करें", + "desc": "स्कैन को साफ करें और PDF के अंदर छवियों से टेक्स्ट का पता लगाएं और उसे टेक्स्ट के रूप में फिर से जोड़ें।" + }, + "extractImages": { + "tags": "pull,save,export", + "title": "छवियां निकालें", + "desc": "PDF से सभी छवियों को निकालें और उन्हें ज़िप में सहेजें" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "हस्ताक्षर करें", + "desc": "चित्र बनाकर, टेक्स्ट या छवि द्वारा PDF में हस्ताक्षर जोड़ें" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "समतल करें", + "desc": "PDF से सभी इंटरैक्टिव तत्वों और फॉर्म को हटाएं" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "प्रमाणपत्र से हस्ताक्षर करें", + "desc": "प्रमाणपत्र/कुंजी (PEM/P12) से PDF पर हस्ताक्षर करें" + }, + "repair": { + "tags": "fix,restore", + "title": "मरम्मत करें", + "desc": "खराब/टूटी हुई PDF को ठीक करने का प्रयास करें" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "खाली पृष्ठ हटाएं", + "desc": "दस्तावेज़ से खाली पृष्ठों का पता लगाएं और हटाएं" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "टिप्पणियां हटाएं", + "desc": "PDF से सभी टिप्पणियां/एनोटेशन हटाएं" + }, + "compare": { + "tags": "difference", + "title": "तुलना करें", + "desc": "2 PDF दस्तावेजों के बीच अंतर की तुलना करें और दिखाएं" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "प्रमाणपत्र हस्ताक्षर हटाएं", + "desc": "PDF से प्रमाणपत्र हस्ताक्षर हटाएं" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "मल्टी-पेज लेआउट", + "desc": "PDF दस्तावेज के कई पृष्ठों को एक पृष्ठ में मर्ज करें" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "पृष्ठ आकार/स्केल समायोजित करें", + "desc": "पृष्ठ और/या उसकी सामग्री का आकार/स्केल बदलें।" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "पृष्ठ संख्या जोड़ें", + "desc": "दस्तावेज़ में एक निर्धारित स्थान पर पृष्ठ संख्या जोड़ें" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "रंग/कंट्रास्ट समायोजित करें", + "desc": "PDF का कंट्रास्ट, संतृप्ति और चमक समायोजित करें" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF क्रॉप करें", + "desc": "आकार कम करने के लिए PDF को क्रॉप करें (टेक्स्ट बनाए रखें!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "स्वतः पृष्ठ विभाजित करें", + "desc": "भौतिक स्कैन किए गए पृष्ठ विभाजक QR कोड के साथ स्कैन की गई PDF को स्वतः विभाजित करें" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "PDF की सभी जानकारी प्राप्त करें", + "desc": "PDF से संभव सभी जानकारी प्राप्त करें" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "एक बड़ा पृष्ठ", + "desc": "सभी PDF पृष्ठों को एक बड़े एकल पृष्ठ में मर्ज करें" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "जावास्क्रिप्ट दिखाएं", + "desc": "PDF में इंजेक्ट किए गए किसी भी जावास्क्रिप्ट को खोजें और दिखाएं" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "मैनुअल गोपनीयकरण", + "desc": "चयनित टेक्स्ट, बनाई गई आकृतियों और/या चयनित पृष्ठों के आधार पर PDF को गोपनीयकृत करें" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "छवि हटाएं", + "desc": "फ़ाइल आकार कम करने के लिए PDF से छवि हटाएं" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "अध्यायों द्वारा PDF विभाजित करें", + "desc": "PDF को उसकी अध्याय संरचना के आधार पर कई फ़ाइलों में विभाजित करें।" + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "PDF हस्ताक्षर सत्यापित करें", + "desc": "PDF दस्तावेजों में डिजिटल हस्ताक्षर और प्रमाणपत्रों को सत्यापित करें" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "पृष्ठ निकालें", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "निकालें", + "desc": "अपने PDF दस्तावेज से अवांछित पृष्ठ हटाएं।" + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "आकार/संख्या के आधार पर स्वतः विभाजित करें", + "desc": "एक PDF को आकार, पृष्ठ संख्या, या दस्तावेज़ संख्या के आधार पर कई दस्तावेज़ों में विभाजित करें" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "पासवर्ड जोड़ें", + "desc": "पासवर्ड के साथ अपने PDF दस्तावेज को एन्क्रिप्ट करें।" + }, + "changePermissions": { + "title": "अनुमतियां बदलें", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "PDF को दूसरी PDF के ऊपर ओवरले करें", + "title": "PDF ओवरले करें" + }, "imageToPDF": { "title": "छवि से PDF", "desc": "छवि (PNG, JPEG, GIF) को PDF में बदलें।" @@ -355,18 +786,6 @@ "title": "PDF से छवि", "desc": "PDF को छवि में बदलें। (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "व्यवस्थित करें", - "desc": "किसी भी क्रम में पृष्ठ निकालें/पुनर्व्यवस्थित करें" - }, - "addImage": { - "title": "छवि जोड़ें", - "desc": "PDF पर एक निर्धारित स्थान पर छवि जोड़ें" - }, - "watermark": { - "title": "वॉटरमार्क जोड़ें", - "desc": "अपने PDF दस्तावेज में कस्टम वॉटरमार्क जोड़ें।" - }, "permissions": { "title": "अनुमतियां बदलें", "desc": "अपने PDF दस्तावेज की अनुमतियां बदलें" @@ -375,38 +794,10 @@ "title": "निकालें", "desc": "अपने PDF दस्तावेज से अवांछित पृष्ठ हटाएं।" }, - "addPassword": { - "title": "पासवर्ड जोड़ें", - "desc": "पासवर्ड के साथ अपने PDF दस्तावेज को एन्क्रिप्ट करें।" - }, - "removePassword": { - "title": "पासवर्ड हटाएं", - "desc": "अपने PDF दस्तावेज से पासवर्ड सुरक्षा हटाएं।" - }, - "compress": { - "title": "कम्प्रेस", - "desc": "PDF को कम्प्रेस करें ताकि उनका फ़ाइल आकार कम हो जाए।" - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "मेटाडेटा बदलें", - "desc": "PDF दस्तावेज से मेटाडेटा बदलें/हटाएं/जोड़ें" - }, "fileToPDF": { "title": "फ़ाइल को PDF में बदलें", "desc": "लगभग किसी भी फ़ाइल को PDF में बदलें (DOCX, PNG, XLS, PPT, TXT और अधिक)" }, - "ocr": { - "title": "OCR / स्कैन साफ करें", - "desc": "स्कैन को साफ करें और PDF के अंदर छवियों से टेक्स्ट का पता लगाएं और उसे टेक्स्ट के रूप में फिर से जोड़ें।" - }, - "extractImages": { - "title": "छवियां निकालें", - "desc": "PDF से सभी छवियों को निकालें और उन्हें ज़िप में सहेजें" - }, "pdfToPDFA": { "title": "PDF से PDF/A", "desc": "लंबी अवधि के भंडारण के लिए PDF को PDF/A में बदलें" @@ -435,70 +826,14 @@ "title": "स्कैन की गई फोटो का पता लगाएं/विभाजित करें", "desc": "फोटो/PDF के अंदर से कई फोटो को विभाजित करें" }, - "sign": { - "title": "हस्ताक्षर करें", - "desc": "चित्र बनाकर, टेक्स्ट या छवि द्वारा PDF में हस्ताक्षर जोड़ें" - }, - "flatten": { - "title": "समतल करें", - "desc": "PDF से सभी इंटरैक्टिव तत्वों और फॉर्म को हटाएं" - }, - "repair": { - "title": "मरम्मत करें", - "desc": "खराब/टूटी हुई PDF को ठीक करने का प्रयास करें" - }, - "removeBlanks": { - "title": "खाली पृष्ठ हटाएं", - "desc": "दस्तावेज़ से खाली पृष्ठों का पता लगाएं और हटाएं" - }, - "removeAnnotations": { - "title": "टिप्पणियां हटाएं", - "desc": "PDF से सभी टिप्पणियां/एनोटेशन हटाएं" - }, - "compare": { - "title": "तुलना करें", - "desc": "2 PDF दस्तावेजों के बीच अंतर की तुलना करें और दिखाएं" - }, - "certSign": { - "title": "प्रमाणपत्र से हस्ताक्षर करें", - "desc": "प्रमाणपत्र/कुंजी (PEM/P12) से PDF पर हस्ताक्षर करें" - }, - "removeCertSign": { - "title": "प्रमाणपत्र हस्ताक्षर हटाएं", - "desc": "PDF से प्रमाणपत्र हस्ताक्षर हटाएं" - }, - "pageLayout": { - "title": "मल्टी-पेज लेआउट", - "desc": "PDF दस्तावेज के कई पृष्ठों को एक पृष्ठ में मर्ज करें" - }, - "scalePages": { - "title": "पृष्ठ आकार/स्केल समायोजित करें", - "desc": "पृष्ठ और/या उसकी सामग्री का आकार/स्केल बदलें।" - }, "pipeline": { "title": "पाइपलाइन", "desc": "पाइपलाइन स्क्रिप्ट परिभाषित करके PDF पर कई कार्य करें" }, - "addPageNumbers": { - "title": "पृष्ठ संख्या जोड़ें", - "desc": "दस्तावेज़ में एक निर्धारित स्थान पर पृष्ठ संख्या जोड़ें" - }, "auto-rename": { "title": "स्वतः PDF फ़ाइल का नाम बदलें", "desc": "पाए गए हेडर के आधार पर PDF फ़ाइल का नाम स्वचालित रूप से बदलें" }, - "adjustContrast": { - "title": "रंग/कंट्रास्ट समायोजित करें", - "desc": "PDF का कंट्रास्ट, संतृप्ति और चमक समायोजित करें" - }, - "crop": { - "title": "PDF क्रॉप करें", - "desc": "आकार कम करने के लिए PDF को क्रॉप करें (टेक्स्ट बनाए रखें!)" - }, - "autoSplitPDF": { - "title": "स्वतः पृष्ठ विभाजित करें", - "desc": "भौतिक स्कैन किए गए पृष्ठ विभाजक QR कोड के साथ स्कैन की गई PDF को स्वतः विभाजित करें" - }, "sanitizePDF": { "title": "सैनिटाइज़", "desc": "PDF फ़ाइलों से स्क्रिप्ट और अन्य तत्वों को हटाएं" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "PDF की सभी जानकारी प्राप्त करें", - "desc": "PDF से संभव सभी जानकारी प्राप्त करें" - }, "pageExtracter": { "title": "पृष्ठ निकालें", "desc": "PDF से चयनित पृष्ठों को निकालें" }, - "pdfToSinglePage": { - "title": "एक बड़ा पृष्ठ", - "desc": "सभी PDF पृष्ठों को एक बड़े एकल पृष्ठ में मर्ज करें" - }, - "showJS": { - "title": "जावास्क्रिप्ट दिखाएं", - "desc": "PDF में इंजेक्ट किए गए किसी भी जावास्क्रिप्ट को खोजें और दिखाएं" - }, "autoRedact": { "title": "स्वतः गोपनीयकरण", "desc": "इनपुट टेक्स्ट के आधार पर PDF में टेक्स्ट को स्वतः गोपनीयकृत करें (काला करें)" }, - "redact": { - "title": "मैनुअल गोपनीयकरण", - "desc": "चयनित टेक्स्ट, बनाई गई आकृतियों और/या चयनित पृष्ठों के आधार पर PDF को गोपनीयकृत करें" - }, "PDFToCSV": { "title": "PDF से CSV", "desc": "PDF से तालिकाओं को निकालकर CSV में बदलें" @@ -551,10 +870,6 @@ "title": "आकार/संख्या के आधार पर स्वतः विभाजित करें", "desc": "एक PDF को आकार, पृष्ठ संख्या, या दस्तावेज़ संख्या के आधार पर कई दस्तावेज़ों में विभाजित करें" }, - "overlay-pdfs": { - "title": "PDF ओवरले करें", - "desc": "PDF को दूसरी PDF के ऊपर ओवरले करें" - }, "split-by-sections": { "title": "खंडों द्वारा PDF विभाजित करें", "desc": "PDF के प्रत्येक पृष्ठ को छोटे क्षैतिज और ऊर्ध्वाधर खंडों में विभाजित करें" @@ -563,43 +878,17 @@ "title": "PDF में स्टैम्प जोड़ें", "desc": "निर्धारित स्थानों पर टेक्स्ट या छवि स्टैम्प जोड़ें" }, - "removeImage": { - "title": "छवि हटाएं", - "desc": "फ़ाइल आकार कम करने के लिए PDF से छवि हटाएं" - }, - "splitByChapters": { - "title": "अध्यायों द्वारा PDF विभाजित करें", - "desc": "PDF को उसकी अध्याय संरचना के आधार पर कई फ़ाइलों में विभाजित करें।" - }, - "validateSignature": { - "title": "PDF हस्ताक्षर सत्यापित करें", - "desc": "PDF दस्तावेजों में डिजिटल हस्ताक्षर और प्रमाणपत्रों को सत्यापित करें" - }, "replace-color": { "title": "रंग बदलें और उल्टा करें", "desc": "PDF में टेक्स्ट और पृष्ठभूमि के लिए रंग बदलें और फ़ाइल आकार कम करने के लिए पूर्ण रंग को उल्टा करें" }, - "convert": { - "title": "बदलें" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "पृष्ठ निकालें" - }, - "removePages": { - "title": "निकालें", - "desc": "अपने PDF दस्तावेज से अवांछित पृष्ठ हटाएं।" - }, "removeImagePdf": { "title": "छवि हटाएं", "desc": "फ़ाइल आकार कम करने के लिए PDF से छवि हटाएं" }, - "autoSizeSplitPDF": { - "title": "आकार/संख्या के आधार पर स्वतः विभाजित करें", - "desc": "एक PDF को आकार, पृष्ठ संख्या, या दस्तावेज़ संख्या के आधार पर कई दस्तावेज़ों में विभाजित करें" - }, "adjust-contrast": { "title": "रंग/कंट्रास्ट समायोजित करें", "desc": "PDF का कंट्रास्ट, संतृप्ति और चमक समायोजित करें" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "रंग बदलें और उल्टा करें", "desc": "PDF में टेक्स्ट और पृष्ठभूमि के लिए रंग बदलें और फ़ाइल आकार कम करने के लिए पूर्ण रंग को उल्टा करें" - }, - "changePermissions": { - "title": "अनुमतियां बदलें" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "देखें,पढ़ें,टिप्पणी,टेक्स्ट,छवि", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "मर्ज,पेज ऑपरेशन्स,बैक एंड,सर्वर साइड", "title": "मर्ज करें", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "मर्ज करें", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "फ़ाइल नाम", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "कई PDF मर्ज करें (2+)", "sortByName": "नाम से क्रमबद्ध करें", "sortByDate": "तिथि से क्रमबद्ध करें", - "removeCertSign": "मर्ज की गई फ़ाइल में डिजिटल हस्ताक्षर हटाएं?", - "submit": "मर्ज करें", - "sortBy": { - "filename": "फ़ाइल नाम" - } + "removeCertSign": "मर्ज की गई फ़ाइल में डिजिटल हस्ताक्षर हटाएं?" }, "split": { - "tags": "पेज ऑपरेशन्स,डिवाइड,मल्टी पेज,कट,सर्वर साइड", "title": "PDF विभाजित करें", "header": "PDF विभाजित करें", "desc": { @@ -671,25 +983,249 @@ "splitPages": "विभाजन करने के लिए पृष्ठ दर्ज करें:", "submit": "विभाजित करें", "steps": { + "chooseMethod": "Choose Method", "settings": "सेटिंग्स" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "फ़ाइल आकार" + "name": "फ़ाइल आकार", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "फ़ाइल आकार" + "label": "फ़ाइल आकार", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "पेज ऑपरेशन्स,डिवाइड,मल्टी पेज,कट,सर्वर साइड" }, "rotate": { - "tags": "सर्वर साइड", "title": "PDF घुमाएं", + "submit": "घुमाएं", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "सर्वर साइड", "header": "PDF घुमाएं", - "selectAngle": "घुमाने का कोण चुनें (90 डिग्री के गुणकों में):", - "submit": "घुमाएं" + "selectAngle": "घुमाने का कोण चुनें (90 डिग्री के गुणकों में):" + }, + "convert": { + "title": "बदलें", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "सेटिंग्स", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "रंग", + "greyscale": "ग्रेस्केल", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "पृष्ठ भरें", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF में एक डिजिटल हस्ताक्षर है। यह अगले चरण में हटा दिया जाएगा।", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "ग्रेस्केल", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "रूपांतरण,img,jpg,चित्र,फोटो" @@ -727,7 +1263,33 @@ "8": "अंतिम हटाएं", "9": "प्रथम और अंतिम हटाएं", "10": "विषम-सम मर्ज", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(जैसे 1,3,2 या 4-8,2,10-12 या 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "छवि जोड़ें", "submit": "छवि जोड़ें" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "टेक्स्ट,दोहराव,लेबल,स्वयं,कॉपीराइट,ट्रेडमार्क,img,jpg,चित्र,फोटो", "title": "वॉटरमार्क जोड़ें", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "वॉटरमार्क जोड़ें", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "टेक्स्ट", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "फ़ॉन्ट आकार", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "टेक्स्ट", + "2": "छवि" + }, + "tags": "टेक्स्ट,दोहराव,लेबल,स्वयं,कॉपीराइट,ट्रेडमार्क,img,jpg,चित्र,फोटो", "header": "वॉटरमार्क जोड़ें", "customColor": "कस्टम टेक्स्ट रंग", "selectText": { @@ -755,17 +1506,6 @@ "8": "वॉटरमार्क प्रकार:", "9": "वॉटरमार्क छवि:", "10": "PDF को PDF-छवि में बदलें" - }, - "submit": "वॉटरमार्क जोड़ें", - "type": { - "1": "टेक्स्ट", - "2": "छवि" - }, - "watermarkType": { - "text": "टेक्स्ट" - }, - "settings": { - "fontSize": "फ़ॉन्ट आकार" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "पृष्ठ निकालें,पृष्ठ हटाएं", "title": "निकालें", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "निकालें" }, - "addPassword": { - "tags": "सुरक्षित,सुरक्षा", - "title": "पासवर्ड जोड़ें", - "header": "पासवर्ड जोड़ें (एन्क्रिप्ट)", - "selectText": { - "1": "एन्क्रिप्ट करने के लिए PDF चुनें", - "2": "उपयोगकर्ता पासवर्ड", - "3": "एन्क्रिप्शन कुंजी लंबाई", - "4": "उच्च मान अधिक मजबूत हैं, लेकिन निम्न मान बेहतर संगतता रखते हैं।", - "5": "सेट करने के लिए अनुमतियां (स्वामी पासवर्ड के साथ उपयोग करने की सिफारिश की जाती है)", - "6": "दस्तावेज़ असेंबली को रोकें", - "7": "सामग्री निष्कर्षण को रोकें", - "8": "पहुंच योग्यता के लिए निष्कर्षण को रोकें", - "9": "फॉर्म भरने को रोकें", - "10": "संशोधन को रोकें", - "11": "टिप्पणी संशोधन को रोकें", - "12": "प्रिंटिंग को रोकें", - "13": "विभिन्न प्रारूपों में प्रिंटिंग को रोकें", - "14": "स्वामी पासवर्ड", - "15": "एक बार खुलने के बाद दस्तावेज़ के साथ क्या किया जा सकता है को प्रतिबंधित करता है (सभी पाठकों द्वारा समर्थित नहीं)", - "16": "दस्तावेज़ को खोलने को प्रतिबंधित करता है" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "एन्क्रिप्ट करें", "tooltip": { - "permissions": { - "title": "अनुमतियां बदलें" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "सुरक्षित,डिक्रिप्ट,सुरक्षा,अनपासवर्ड,पासवर्ड हटाएं", - "title": "पासवर्ड हटाएं", - "header": "पासवर्ड हटाएं (डिक्रिप्ट)", - "selectText": { - "1": "डिक्रिप्ट करने के लिए PDF चुनें", - "2": "पासवर्ड" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "हटाएं", - "desc": "अपने PDF दस्तावेज से पासवर्ड सुरक्षा हटाएं।", - "password": { - "stepTitle": "पासवर्ड हटाएं", - "label": "वर्तमान पासवर्ड" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "शीर्षक,लेखक,तिथि,निर्माण,समय,प्रकाशक,निर्माता,आंकड़े", - "title": "शीर्षक:", "header": "मेटाडेटा बदलें", + "submit": "बदलें", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "शीर्षक,लेखक,तिथि,निर्माण,समय,प्रकाशक,निर्माता,आंकड़े", "selectText": { "1": "कृपया वे चर संपादित करें जिन्हें आप बदलना चाहते हैं", "2": "सभी मेटाडेटा हटाएं", @@ -856,15 +1877,7 @@ "4": "अन्य मेटाडेटा:", "5": "कस्टम मेटाडेटा प्रविष्टि जोड़ें" }, - "author": "लेखक:", - "creationDate": "निर्माण तिथि (yyyy/MM/dd HH:mm:ss):", - "creator": "निर्माता:", - "keywords": "कीवर्ड्स:", - "modDate": "संशोधन तिथि (yyyy/MM/dd HH:mm:ss):", - "producer": "प्रोड्यूसर:", - "subject": "विषय:", - "trapped": "ट्रैप्ड:", - "submit": "बदलें" + "modDate": "संशोधन तिथि (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "रूपांतरण,प्रारूप,दस्तावेज,चित्र,स्लाइड,टेक्स्ट,रूपांतरण,कार्यालय,डॉक्स,वर्ड,एक्सेल,पावरपॉइंट", @@ -878,6 +1891,7 @@ "ocr": { "tags": "पहचान,टेक्स्ट,छवि,स्कैन,पढ़ें,पहचानें,पहचान,संपादन योग्य", "title": "OCR / स्कैन साफ करें", + "desc": "स्कैन को साफ करें और PDF के अंदर छवियों से टेक्स्ट का पता लगाएं और उसे टेक्स्ट के रूप में फिर से जोड़ें।", "header": "स्कैन साफ करें / OCR (ऑप्टिकल कैरेक्टर रिकग्निशन)", "selectText": { "1": "PDF में पता लगाए जाने वाली भाषाएं चुनें (जो वर्तमान में पता लगाई गई हैं उन्हें सूचीबद्ध किया गया है):", @@ -896,23 +1910,89 @@ "help": "कृपया अन्य भाषाओं के लिए उपयोग और/या डॉकर में उपयोग न करने के बारे में यह दस्तावेज़ीकरण पढ़ें", "credit": "यह सेवा OCR के लिए qpdf और Tesseract का उपयोग करती है।", "submit": "OCR के साथ PDF प्रोसेस करें", - "desc": "स्कैन को साफ करें और PDF के अंदर छवियों से टेक्स्ट का पता लगाएं और उसे टेक्स्ट के रूप में फिर से जोड़ें।", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "सेटिंग्स", "ocrMode": { - "label": "OCR मोड" + "label": "OCR मोड", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "भाषाएं" + "label": "भाषाएं", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR मोड" + "title": "OCR मोड", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "भाषाएं" + "title": "भाषाएं", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "छवियां निकालें", "selectText": "निकाली गई छवियों को बदलने के लिए छवि प्रारूप चुनें", "allowDuplicates": "डुप्लिकेट छवियां सहेजें", - "submit": "निकालें" + "submit": "निकालें", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "संग्रह,लंबी अवधि,मानक,रूपांतरण,भंडारण,संरक्षण", @@ -993,17 +2079,53 @@ }, "info": "Python स्थापित नहीं है। चलाने के लिए आवश्यक है।" }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "अधिकृत,आद्याक्षर,चित्रित-हस्ताक्षर,टेक्स्ट-हस्ताक्षर,छवि-हस्ताक्षर", "title": "हस्ताक्षर", "header": "PDF पर हस्ताक्षर करें", "upload": "छवि अपलोड करें", - "draw": "हस्ताक्षर बनाएं", - "text": "टेक्स्ट इनपुट", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "साफ़ करें", "add": "जोड़ें", "saved": "सहेजे गए हस्ताक्षर", "save": "हस्ताक्षर सहेजें", + "applySignatures": "Apply Signatures", "personalSigs": "व्यक्तिगत हस्ताक्षर", "sharedSigs": "साझा किए गए हस्ताक्षर", "noSavedSigs": "कोई सहेजा गया हस्ताक्षर नहीं मिला", @@ -1015,42 +2137,179 @@ "previous": "पिछला पृष्ठ", "maintainRatio": "आनुपातिक अनुपात बनाए रखें टॉगल करें", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "अधिकृत,आद्याक्षर,चित्रित-हस्ताक्षर,टेक्स्ट-हस्ताक्षर,छवि-हस्ताक्षर" }, "flatten": { - "tags": "स्थिर,निष्क्रिय,गैर-इंटरैक्टिव,सरलीकृत", "title": "समतल करें", "header": "PDF समतल करें", "flattenOnlyForms": "केवल फ़ॉर्म समतल करें", "submit": "समतल करें", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "सेटिंग्स" }, "options": { - "flattenOnlyForms": "केवल फ़ॉर्म समतल करें" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "केवल फ़ॉर्म समतल करें", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "स्थिर,निष्क्रिय,गैर-इंटरैक्टिव,सरलीकृत" }, "repair": { "tags": "ठीक करें,पुनर्स्थापित करें,सुधार,पुनर्प्राप्त करें", "title": "मरम्मत", "header": "PDF मरम्मत", - "submit": "मरम्मत" + "submit": "मरम्मत", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "साफ करें,सरलीकृत करें,गैर-सामग्री,व्यवस्थित करें", "title": "खाली पृष्ठ हटाएं", "header": "खाली पृष्ठ हटाएं", - "threshold": "पिक्सेल श्वेतता सीमा:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "खाली हटाएं", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "साफ करें,सरलीकृत करें,गैर-सामग्री,व्यवस्थित करें", "thresholdDesc": "एक श्वेत पिक्सेल को 'श्वेत' वर्गीकृत करने के लिए कितना श्वेत होना चाहिए यह निर्धारित करने के लिए सीमा। 0 = काला, 255 पूर्ण श्वेत।", - "whitePercent": "श्वेत प्रतिशत (%):", - "whitePercentDesc": "हटाए जाने के लिए पृष्ठ का कितना प्रतिशत 'श्वेत' पिक्सेल होना चाहिए", - "submit": "खाली हटाएं" + "whitePercentDesc": "हटाए जाने के लिए पृष्ठ का कितना प्रतिशत 'श्वेत' पिक्सेल होना चाहिए" }, "removeAnnotations": { "tags": "टिप्पणियां,हाइलाइट,नोट्स,मार्कअप,हटाएं", "title": "टिप्पणियां हटाएं", "header": "टिप्पणियां हटाएं", - "submit": "हटाएं" + "submit": "हटाएं", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "अंतर,तुलना,परिवर्तन,विश्लेषण", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "प्रमाणीकरण,PEM,P12,आधिकारिक,एन्क्रिप्ट", "title": "प्रमाणपत्र हस्ताक्षर", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "स्थान", + "logoTitle": "Logo", + "name": "नाम", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "अपनी कीस्टोर या निजी कुंजी पासवर्ड दर्ज करें (यदि कोई हो):", + "passwordOptional": "Leave empty if no password", + "reason": "कारण", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "लोगो दिखाएं", "header": "प्रमाणपत्र से हस्ताक्षर करें (कार्य प्रगति पर है)", "selectPDF": "हस्ताक्षर के लिए PDF फ़ाइल चुनें:", "jksNote": "नोट: यदि आपके प्रमाणपत्र का प्रकार नीचे सूचीबद्ध नहीं है, तो कृपया keytool कमांड लाइन टूल का उपयोग करके इसे Java Keystore (.jks) फ़ाइल में बदलें। फिर नीचे .jks फ़ाइल विकल्प चुनें।", @@ -1089,13 +2484,7 @@ "selectCert": "अपना प्रमाणपत्र फ़ाइल चुनें (X.509 प्रारूप, .pem या .der हो सकती है):", "selectP12": "अपनी PKCS#12 कीस्टोर फ़ाइल चुनें (.p12 या .pfx) (वैकल्पिक, यदि प्रदान की गई है, तो इसमें आपकी निजी कुंजी और प्रमाणपत्र होना चाहिए):", "selectJKS": "अपनी Java Keystore फ़ाइल (.jks या .keystore) चुनें:", - "certType": "प्रमाणपत्र प्रकार", - "password": "अपनी कीस्टोर या निजी कुंजी पासवर्ड दर्ज करें (यदि कोई हो):", "showSig": "हस्ताक्षर दिखाएं", - "reason": "कारण", - "location": "स्थान", - "name": "नाम", - "showLogo": "लोगो दिखाएं", "submit": "PDF पर हस्ताक्षर करें" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "प्रमाणपत्र हस्ताक्षर हटाएं", "header": "PDF से डिजिटल प्रमाणपत्र हटाएं", "selectPDF": "PDF फ़ाइल चुनें:", - "submit": "हस्ताक्षर हटाएं" + "submit": "हस्ताक्षर हटाएं", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "मर्ज,संयोजित,एकल-दृश्य,व्यवस्थित", @@ -1111,16 +2511,157 @@ "header": "मल्टी पेज लेआउट", "pagesPerSheet": "प्रति शीट पृष्ठ:", "addBorder": "बॉर्डर जोड़ें", - "submit": "जमा करें" + "submit": "जमा करें", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "आकार बदलें,संशोधित करें,आयाम,अनुकूल करें", "title": "पृष्ठ-स्केल समायोजित करें", "header": "पृष्ठ-स्केल समायोजित करें", "pageSize": "दस्तावेज़ के एक पृष्ठ का आकार।", "keepPageSize": "मूल आकार", "scaleFactor": "एक पृष्ठ का ज़ूम स्तर (क्रॉप)।", - "submit": "जमा करें" + "submit": "जमा करें", + "tags": "आकार बदलें,संशोधित करें,आयाम,अनुकूल करें" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "पृष्ठांकन,लेबल,व्यवस्थित,अनुक्रमणिका" @@ -1129,16 +2670,83 @@ "tags": "स्वतः-पहचान,हेडर-आधारित,व्यवस्थित,पुनर्नामांकन", "title": "स्वतः नाम बदलें", "header": "स्वतः PDF नाम बदलें", - "submit": "स्वतः नाम बदलें" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "स्वतः नाम बदलें", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "रंग-सुधार,ट्यून,संशोधित,बढ़ाएं" }, "crop": { - "tags": "ट्रिम,सिकोड़ें,संपादित करें,आकार", "title": "क्रॉप करें", "header": "PDF क्रॉप करें", - "submit": "जमा करें" + "submit": "जमा करें", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "ट्रिम,सिकोड़ें,संपादित करें,आकार" }, "autoSplitPDF": { "tags": "QR-आधारित,अलग करें,स्कैन-खंड,व्यवस्थित करें", @@ -1221,24 +2829,124 @@ "downloadJS": "जावास्क्रिप्ट डाउनलोड करें", "submit": "दिखाएं" }, - "autoRedact": { - "tags": "गोपनीयकरण,छिपाएं,काला करें,काला,मार्कर,छिपा हुआ", - "title": "स्वतः गोपनीयकरण", - "header": "स्वतः गोपनीयकरण", - "colorLabel": "रंग", - "textsToRedactLabel": "गोपनीयकृत करने के लिए टेक्स्ट (लाइन-अलग)", - "textsToRedactPlaceholder": "उदाहरण \\nगोपनीय \\nटॉप-सीक्रेट", - "useRegexLabel": "रेगेक्स का उपयोग करें", - "wholeWordSearchLabel": "पूर्ण शब्द खोज", - "customPaddingLabel": "कस्टम अतिरिक्त पैडिंग", - "convertPDFToImageLabel": "PDF को PDF-छवि में बदलें (बॉक्स के पीछे के टेक्स्ट को हटाने के लिए उपयोग किया जाता है)", - "submitButton": "जमा करें" - }, "redact": { "tags": "गोपनीयकरण,छिपाएं,काला करें,काला,मार्कर,छिपा हुआ,मैनुअल", "title": "मैनुअल गोपनीयकरण", - "header": "मैनुअल गोपनीयकरण", "submit": "गोपनीयकृत करें", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "उन्नत" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "जोड़ें", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "पृष्ठ", + "placeholder": "(जैसे 1,2,8 या 4,7,12-16 या 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "निर्यात करें", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "मैनुअल गोपनीयकरण", "textBasedRedaction": "टेक्स्ट आधारित गोपनीयकरण", "pageBasedRedaction": "पृष्ठ-आधारित गोपनीयकरण", "convertPDFToImageLabel": "PDF को PDF-छवि में बदलें (बॉक्स के पीछे का टेक्स्ट हटाने के लिए उपयोग किया जाता है)", @@ -1264,22 +2972,7 @@ "showLayers": "लेयर्स दिखाएं (सभी लेयर्स को डिफ़ॉल्ट स्थिति में रीसेट करने के लिए डबल-क्लिक करें)", "colourPicker": "रंग चयनकर्ता", "findCurrentOutlineItem": "वर्तमान आउटलाइन आइटम खोजें", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "उन्नत" - }, - "wordsToRedact": { - "add": "जोड़ें" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "पृष्ठ", - "placeholder": "(जैसे 1,2,8 या 4,7,12-16 या 2n-1)" - }, - "export": "निर्यात करें" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,तालिका निष्कर्षण,निकालें,बदलें" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "ओवरले", "header": "PDF फ़ाइलें ओवरले करें", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "बेस PDF फ़ाइल चुनें" }, "overlayFiles": { - "label": "ओवरले PDF फ़ाइलें चुनें" + "label": "ओवरले PDF फ़ाइलें चुनें", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "ओवरले मोड चुनें", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "ओवरले गिनती (निश्चित दोहराव मोड के लिए)", - "placeholder": "अल्पविराम से अलग गिनती दर्ज करें (जैसे 2,3,1)" + "placeholder": "अल्पविराम से अलग गिनती दर्ज करें (जैसे 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "ओवरले स्थिति चुनें", "foreground": "अग्रभूमि", "background": "पृष्ठभूमि" }, - "submit": "जमा करें" + "submit": "जमा करें", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "खंड विभाजन, विभाजित करें, अनुकूलित", @@ -1332,6 +3068,7 @@ "tags": "स्टैम्प, छवि जोड़ें, केंद्र छवि, वॉटरमार्क, PDF, एम्बेड, अनुकूलित", "header": "PDF स्टैम्प करें", "title": "PDF स्टैम्प करें", + "stampSetup": "Stamp Setup", "stampType": "स्टैम्प प्रकार", "stampText": "स्टैम्प टेक्स्ट", "stampImage": "स्टैम्प छवि", @@ -1344,7 +3081,19 @@ "overrideY": "Y निर्देशांक ओवरराइड करें", "customMargin": "कस्टम मार्जिन", "customColor": "कस्टम टेक्स्ट रंग", - "submit": "जमा करें" + "submit": "जमा करें", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "छवि हटाएं,पृष्ठ कार्य,बैक एंड,सर्वर साइड" @@ -1362,7 +3111,8 @@ "status": { "_value": "स्थिति", "valid": "मान्य", - "invalid": "अमान्य" + "invalid": "अमान्य", + "complete": "Validation complete" }, "signer": "हस्ताक्षरकर्ता", "date": "तिथि", @@ -1389,40 +3139,122 @@ "version": "संस्करण", "keyUsage": "कुंजी उपयोग", "selfSigned": "स्व-हस्ताक्षरित", - "bits": "बिट्स" + "bits": "बिट्स", + "details": "Certificate Details" }, "signature": { "info": "हस्ताक्षर जानकारी", "_value": "हस्ताक्षर", "mathValid": "हस्ताक्षर गणितीय रूप से मान्य है लेकिन:" }, - "selectCustomCert": "कस्टम प्रमाणपत्र फ़ाइल X.509 (वैकल्पिक)" - }, - "replace-color": { - "title": "रंग बदलें-उल्टा करें", - "header": "रंग बदलें-उल्टा करें PDF", - "selectText": { - "1": "रंग बदलें या उल्टा करें विकल्प", - "2": "डिफ़ॉल्ट (डिफ़ॉल्ट उच्च कंट्रास्ट रंग)", - "3": "कस्टम (अनुकूलित रंग)", - "4": "पूर्ण-उल्टा (सभी रंगों को उल्टा करें)", - "5": "उच्च कंट्रास्ट रंग विकल्प", - "6": "काली पृष्ठभूमि पर सफेद टेक्स्ट", - "7": "सफेद पृष्ठभूमि पर काला टेक्स्ट", - "8": "काली पृष्ठभूमि पर पीला टेक्स्ट", - "9": "काली पृष्ठभूमि पर हरा टेक्स्ट", - "10": "टेक्स्ट रंग चुनें", - "11": "पृष्ठभूमि रंग चुनें" + "selectCustomCert": "कस्टम प्रमाणपत्र फ़ाइल X.509 (वैकल्पिक)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "बदलें" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "रंग बदलें,पृष्ठ कार्य,बैक एंड,सर्वर साइड" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "साइन इन करें", "header": "साइन इन करें", "signin": "साइन इन करें", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "मुझे याद रखें", "invalid": "अमान्य उपयोगकर्ता नाम या पासवर्ड।", "locked": "आपका खाता लॉक कर दिया गया है।", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "आप पहले से ही", "alreadyLoggedIn2": "उपकरणों में लॉग इन हैं। कृपया उपकरणों से लॉग आउट करें और पुनः प्रयास करें।", "toManySessions": "आपके बहुत सारे सक्रिय सत्र हैं", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF को एकल पृष्ठ में", "header": "PDF को एकल पृष्ठ में", - "submit": "एकल पृष्ठ में बदलें" + "submit": "एकल पृष्ठ में बदलें", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "पृष्ठ निकालें", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "कंट्रास्ट समायोजित करें", "header": "कंट्रास्ट समायोजित करें", + "basic": "Basic Adjustments", "contrast": "कंट्रास्ट:", "brightness": "चमक:", "saturation": "संतृप्ति:", - "download": "डाउनलोड करें" + "download": "डाउनलोड करें", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "कम्प्रेस", + "desc": "Compress PDFs to reduce their file size.", "header": "PDF कम्प्रेस करें", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "फ़ाइल आकार" + }, "credit": "यह सेवा PDF कम्प्रेस/अनुकूलन के लिए qpdf का उपयोग करती है।", "grayscale": { "label": "संपीड़न के लिए ग्रेस्केल लागू करें" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1491,10 +3435,7 @@ "4": "स्वतः मोड - PDF को सटीक आकार प्राप्त करने के लिए गुणवत्ता को स्वतः समायोजित करता है", "5": "अपेक्षित PDF आकार (जैसे 25MB, 10.8MB, 25KB)" }, - "submit": "कम्प्रेस करें", - "method": { - "filesize": "फ़ाइल आकार" - } + "submit": "कम्प्रेस करें" }, "decrypt": { "passwordPrompt": "यह फ़ाइल पासवर्ड से सुरक्षित है। कृपया पासवर्ड दर्ज करें:", @@ -1595,7 +3536,13 @@ "title": "छवियां हटाएं", "header": "छवियां हटाएं", "removeImage": "छवियां हटाएं", - "submit": "छवियां हटाएं" + "submit": "छवियां हटाएं", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "अध्यायों द्वारा PDF विभाजित करें", @@ -1629,6 +3576,12 @@ }, "note": "रिलीज़ नोट्स केवल अंग्रेजी में उपलब्ध हैं" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "डाउनलोड करें", - "convert": { - "title": "बदलें", - "settings": "सेटिंग्स", - "color": "रंग", - "greyscale": "ग्रेस्केल", - "fillPage": "पृष्ठ भरें", - "pdfaDigitalSignatureWarning": "PDF में एक डिजिटल हस्ताक्षर है। यह अगले चरण में हटा दिया जाएगा।", - "grayscale": "ग्रेस्केल" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "सभी चुनें", - "deselectAll": "सभी अचयनित करें" + "deselectAll": "सभी अचयनित करें", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "हस्ताक्षर करें" + "read": "Read", + "sign": "हस्ताक्षर करें", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "लोड हो रहा है...", - "or": "या" + "or": "या", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "नाम", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "संस्करण", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "सभी चुनें", "deselectAll": "सभी अचयनित करें", "deleteSelected": "चयनित हटाएं", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "डाउनलोड करें", - "delete": "हटाएं" + "delete": "हटाएं", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDF सैनिटाइज़ करें", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "सेटिंग्स" + "files": "Files", + "settings": "सेटिंग्स", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "पासवर्ड जोड़ें", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "एन्क्रिप्ट करें", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "अनुमतियां बदलें", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "सुरक्षित,सुरक्षा", + "header": "पासवर्ड जोड़ें (एन्क्रिप्ट)", + "selectText": { + "1": "एन्क्रिप्ट करने के लिए PDF चुनें", + "2": "उपयोगकर्ता पासवर्ड", + "3": "एन्क्रिप्शन कुंजी लंबाई", + "4": "उच्च मान अधिक मजबूत हैं, लेकिन निम्न मान बेहतर संगतता रखते हैं।", + "5": "सेट करने के लिए अनुमतियां (स्वामी पासवर्ड के साथ उपयोग करने की सिफारिश की जाती है)", + "6": "दस्तावेज़ असेंबली को रोकें", + "7": "सामग्री निष्कर्षण को रोकें", + "8": "पहुंच योग्यता के लिए निष्कर्षण को रोकें", + "9": "फॉर्म भरने को रोकें", + "10": "संशोधन को रोकें", + "11": "टिप्पणी संशोधन को रोकें", + "12": "प्रिंटिंग को रोकें", + "13": "विभिन्न प्रारूपों में प्रिंटिंग को रोकें", + "14": "स्वामी पासवर्ड", + "15": "एक बार खुलने के बाद दस्तावेज़ के साथ क्या किया जा सकता है को प्रतिबंधित करता है (सभी पाठकों द्वारा समर्थित नहीं)", + "16": "दस्तावेज़ को खोलने को प्रतिबंधित करता है" } }, "changePermissions": { "title": "अनुमतियां बदलें", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "अनुमतियां बदलें", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "दस्तावेज़ असेंबली को रोकें" @@ -1737,10 +4580,784 @@ "label": "विभिन्न प्रारूपों में प्रिंटिंग को रोकें" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "अनुमतियां बदलें" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "पासवर्ड हटाएं", + "desc": "अपने PDF दस्तावेज से पासवर्ड सुरक्षा हटाएं।", + "tags": "सुरक्षित,डिक्रिप्ट,सुरक्षा,अनपासवर्ड,पासवर्ड हटाएं", + "password": { + "stepTitle": "पासवर्ड हटाएं", + "label": "वर्तमान पासवर्ड", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "हटाएं", + "results": { + "title": "Decrypted PDFs" + }, + "header": "पासवर्ड हटाएं (डिक्रिप्ट)", + "selectText": { + "1": "डिक्रिप्ट करने के लिए PDF चुनें", + "2": "पासवर्ड" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "रंग बदलें या उल्टा करें विकल्प", + "2": "डिफ़ॉल्ट (डिफ़ॉल्ट उच्च कंट्रास्ट रंग)", + "3": "कस्टम (अनुकूलित रंग)", + "4": "पूर्ण-उल्टा (सभी रंगों को उल्टा करें)", + "5": "उच्च कंट्रास्ट रंग विकल्प", + "6": "काली पृष्ठभूमि पर सफेद टेक्स्ट", + "7": "सफेद पृष्ठभूमि पर काला टेक्स्ट", + "8": "काली पृष्ठभूमि पर पीला टेक्स्ट", + "9": "काली पृष्ठभूमि पर हरा टेक्स्ट", + "10": "टेक्स्ट रंग चुनें", + "11": "पृष्ठभूमि रंग चुनें", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "बदलें", + "title": "रंग बदलें-उल्टा करें", + "header": "रंग बदलें-उल्टा करें PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "गोपनीयकरण,छिपाएं,काला करें,काला,मार्कर,छिपा हुआ", + "title": "स्वतः गोपनीयकरण", + "header": "स्वतः गोपनीयकरण", + "colorLabel": "रंग", + "textsToRedactLabel": "गोपनीयकृत करने के लिए टेक्स्ट (लाइन-अलग)", + "textsToRedactPlaceholder": "उदाहरण \\nगोपनीय \\nटॉप-सीक्रेट", + "useRegexLabel": "रेगेक्स का उपयोग करें", + "wholeWordSearchLabel": "पूर्ण शब्द खोज", + "customPaddingLabel": "कस्टम अतिरिक्त पैडिंग", + "convertPDFToImageLabel": "PDF को PDF-छवि में बदलें (बॉक्स के पीछे के टेक्स्ट को हटाने के लिए उपयोग किया जाता है)", + "submitButton": "जमा करें" + }, + "replaceColorPdf": { + "tags": "रंग बदलें,पृष्ठ कार्य,बैक एंड,सर्वर साइड" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/hr-HR/translation.json b/frontend/public/locales/hr-HR/translation.json index 6d798a0df..795cc75fa 100644 --- a/frontend/public/locales/hr-HR/translation.json +++ b/frontend/public/locales/hr-HR/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Prilagođeni tekst", "numberPagesDesc": "Koje stranice numerirati, zadano je 'sve', također prihvaća 1-5 ili 2,5,9 itd.", "customNumberDesc": "Zadano je {n}, također prihvaća 'Stranica {n} od {total}', 'Tekst-{n}', '{ime datoteke}-{n}'", - "submit": "Dodaj brojeve stranica" + "submit": "Dodaj brojeve stranica", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Prilagođeni odabir stranica (unesi listu brojeva stranica ili funkcija, kao što su 2n+1, razdvojene zarezima) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Odaberi PDF(ove)", "multiPdfPrompt": "Odaberi PDF-ove (2+)", "multiPdfDropPrompt": "Odaberi (ili povuci i ispusti) sve potrebne PDF-ove", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Upozorenje: Ovaj proces može trajati i do minutu, u zavisnosti od veličine dokumenta", "pageOrderPrompt": "Prilagođeni redoslijed stranica (unesi listu brojeva stranica ili funkcija, kao što su 2n+1, razdvojene zarezima) :", - "pageSelectionPrompt": "Prilagođeni odabir stranica (unesi listu brojeva stranica ili funkcija, kao što su 2n+1, razdvojene zarezima) :", "goToPage": "Idi na stranicu", "true": "Točno", "false": "Netočno", "unknown": "Nepoznato", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Spremi", "saveToBrowser": "spremi u Preglednik", + "download": "Preuzmi datoteku", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Zatvori", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "odabrane datoteke", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Nema dodanih favorita", "downloadComplete": "Preuzimanje završeno", "bored": "Dosađujete se čekajući?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF dokument je šifriran i zaporka nije dana ili je netočna", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Greška", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Oprostite zbog problema!", "needHelp": "Trebate pomoć / Pronašli ste problem?", "contactTip": "Ako i dalje imate problema, ne ustručavajte se obratiti nam se za pomoć. Tiket možete poslati na našoj GitHub stranici ili nas kontaktirati putem Discorda:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Pošaljite ticket", "discordSubmit": "Discord - Pošalji objavu podrške" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Izbriši", "username": "Korisničko ime", "password": "Zaporka", @@ -82,6 +169,7 @@ "green": "Zeleno", "blue": "Plavo", "custom": "Prilagođeno...", + "comingSoon": "Coming soon", "WorkInProgess": "Radovi u tijeku, u slučaju grešaka molimo prijavite probleme!", "poweredBy": "Pokreće", "yes": "Da", @@ -115,12 +203,14 @@ "page": "Stranica", "pages": "Stranice", "loading": "Učitavanje...", + "review": "Review", "addToDoc": "Dodaj u dokument", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Politika privatnosti", + "iAgreeToThe": "I agree to all of the", "terms": "Uspe sodržine", "accessibility": "Dostupnost", "cookie": "Politika kolačića", @@ -160,6 +250,7 @@ "title": "Želite li da stvarate Stirling PDF bolji?", "paragraph1": "Stirling PDF ima uključene analitike koje nam pomažu da proizvod poboljšamo. Niste pratili nikakva osobna informacija ni sadržaj datoteka.", "paragraph2": "Razmotrite omogućivanje analitičkih podataka kako biste stvorili Stirling-PDF veće i da bismo bolje razumeli naših korisnika.", + "learnMore": "Learn more", "enable": "Omogući analitike", "disable": "Onemogući analitike", "settings": "Možete promijeniti postavke za analitike u datoteci config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Spremi unose obrazaca", "help": "omogućiti pohranjivanje prethodno korištenih ulaza za buduća izvođenja" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Database Import/Export", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Višestruki alat", "desc": "Spajanje, rotiranje, preuređivanje i uklanjanje stranica" }, "merge": { + "tags": "combine,join,unite", "title": "Spajanje", "desc": "Jednostavno spojite više PDF-ova u jedan." }, "split": { + "tags": "divide,separate,break", "title": "Razdvajanje", "desc": "Razdvojite PDF-ove u više dokumenata" }, "rotate": { + "tags": "turn,flip,orient", "title": "Rotacija", "desc": "Jednostavno rotirajte vaše PDF-ove." }, + "convert": { + "tags": "transform,change", + "title": "Pretvori", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organiziranje", + "desc": "Uklonite/preuredite stranice bilo kojim redoslijedom" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Dodaj sliku", + "desc": "Dodaje sliku na zadano mjesto u PDF-u" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Dodaj vodeni žig", + "desc": "DDodajte prilagođeni vodeni žig svom PDF dokumentu." + }, + "removePassword": { + "tags": "unlock", + "title": "Ukloni lozinku", + "desc": "Uklonite zaštitu lozinkom sa svog PDF dokumenta.." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Komprimiraj", + "desc": "Komprimirajte PDF-ove kako biste smanjili njihovu veličinu." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Promjena metapodataka", + "desc": "Promjeni/Ukloni/Dodaj metapodatke iz PDF dokumenta" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Čišćenje skeniranih dokumenata", + "desc": "Čišćenje skenira i otkriva tekst sa slika unutar PDF-a i ponovno ga dodaje kao tekst." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Ekstrakt slika", + "desc": "Izdvaja sve slike iz PDF-a i sprema ih u zip format" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Potpisati", + "desc": "Dodaje potpis u PDF crtežom, tekstom ili slikom" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Ravnanje (Flatten)", + "desc": "Uklonite sve interaktivne elemente i obrasce iz PDF-a" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Potpišite s certifikatom", + "desc": "Potpisuje PDF s certifikatom/ključem (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Popravi", + "desc": "Pokušava popraviti oštećeni/pokvareni PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Ukloni prazne stranice", + "desc": "Otkriva i uklanja prazne stranice iz dokumenta" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Ukloni komentare", + "desc": "Uklanja sve komentare/anotacije iz PDF-a" + }, + "compare": { + "tags": "difference", + "title": "Uporedi", + "desc": "Uspoređuje i pokazuje razlike između 2 PDF dokumenta" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Ukloni potpis sertifikata", + "desc": "Uklonite potpis sertifikata iz PDF-a" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Izgled s više stranica", + "desc": "Spojite više stranica PDF dokumenta u jednu stranicu" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Prilagodite veličinu/razmjer stranice", + "desc": "Promijenite veličinu/razmjer stranice i/ili njezin sadržaj." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Dodaj brojeve stranica", + "desc": "Dodajte brojeve stranica kroz dokument na određeno mjesto" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Podesi boje/kontrast", + "desc": "Podesite kontrast, zasićenost i svjetlinu PDF-a" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Izrežite PDF", + "desc": "Izrežite PDF kako biste smanjili njegovu veličinu (zadržava tekst!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Automatsko dijeljenje stranica", + "desc": "Automatsko dijeljenje skeniranog PDF-a s fizičkim QR kodom za dijeljenje stranica" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Dohvati SVE informacije o PDF-u", + "desc": "Dohvaća sve moguće informacije o PDF-ovima" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF u Jednu Veliku Stranicu", + "desc": "Spaja sve PDF stranice u jednu veliku stranicu" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Prikaži JavaScript", + "desc": "Pretražuje i prikazuje bilo koji JavaScript umetnut u PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Ukloni sliku", + "desc": "Ukloni sliku iz PDF-a kako bi se smanjio veličina datoteke" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Podijeli PDF prema glavama", + "desc": "Podijeli PDF na više datoteka prema njegovom strukturnom obliku glava." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Izdvojiti stranice", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Ukloniti", + "desc": "Izbrišite neželjene stranice iz svog PDF dokumenta." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Automatska podjela po veličini/broju", + "desc": "Podijelite jedan PDF na više dokumenata na temelju veličine, broja stranica ili broja dokumenata" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Dodaj lozinku", + "desc": "Šifrirajte svoj PDF dokument lozinkom.." + }, + "changePermissions": { + "title": "Promjena dopuštenja", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Preklapa PDF-ove na drugi PDF", + "title": "Preklapanje PDF-ova" + }, "imageToPDF": { "title": "Slika u PDF", "desc": "Pretvorite sliku (PNG, JPEG, GIF) u PDF." @@ -355,18 +786,6 @@ "title": "PDF u Sliku", "desc": "Pretvorite PDF u sliku. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organiziranje", - "desc": "Uklonite/preuredite stranice bilo kojim redoslijedom" - }, - "addImage": { - "title": "Dodaj sliku", - "desc": "Dodaje sliku na zadano mjesto u PDF-u" - }, - "watermark": { - "title": "Dodaj vodeni žig", - "desc": "DDodajte prilagođeni vodeni žig svom PDF dokumentu." - }, "permissions": { "title": "Promjena dopuštenja", "desc": "Promijenite dopuštenja svog PDF dokumenta" @@ -375,38 +794,10 @@ "title": "Ukloniti", "desc": "Izbrišite neželjene stranice iz svog PDF dokumenta." }, - "addPassword": { - "title": "Dodaj lozinku", - "desc": "Šifrirajte svoj PDF dokument lozinkom.." - }, - "removePassword": { - "title": "Ukloni lozinku", - "desc": "Uklonite zaštitu lozinkom sa svog PDF dokumenta.." - }, - "compress": { - "title": "Komprimiraj", - "desc": "Komprimirajte PDF-ove kako biste smanjili njihovu veličinu." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Promjena metapodataka", - "desc": "Promjeni/Ukloni/Dodaj metapodatke iz PDF dokumenta" - }, "fileToPDF": { "title": "Pretvori datoteku u PDF", "desc": "Pretvorite gotovo sve datoteke u PDF (DOCX, PNG, XLS, PPT, TXT i više)" }, - "ocr": { - "title": "OCR / Čišćenje skeniranih dokumenata", - "desc": "Čišćenje skenira i otkriva tekst sa slika unutar PDF-a i ponovno ga dodaje kao tekst." - }, - "extractImages": { - "title": "Ekstrakt slika", - "desc": "Izdvaja sve slike iz PDF-a i sprema ih u zip format" - }, "pdfToPDFA": { "title": "PDF u PDF/A", "desc": "Pretvorite PDF u PDF/A za dugoročnu pohranu" @@ -435,70 +826,14 @@ "title": "Otkrij/razdvoji skenirane fotografije", "desc": "Razdvaja više fotografija iz fotografije/PDF-a" }, - "sign": { - "title": "Potpisati", - "desc": "Dodaje potpis u PDF crtežom, tekstom ili slikom" - }, - "flatten": { - "title": "Ravnanje (Flatten)", - "desc": "Uklonite sve interaktivne elemente i obrasce iz PDF-a" - }, - "repair": { - "title": "Popravi", - "desc": "Pokušava popraviti oštećeni/pokvareni PDF" - }, - "removeBlanks": { - "title": "Ukloni prazne stranice", - "desc": "Otkriva i uklanja prazne stranice iz dokumenta" - }, - "removeAnnotations": { - "title": "Ukloni komentare", - "desc": "Uklanja sve komentare/anotacije iz PDF-a" - }, - "compare": { - "title": "Uporedi", - "desc": "Uspoređuje i pokazuje razlike između 2 PDF dokumenta" - }, - "certSign": { - "title": "Potpišite s certifikatom", - "desc": "Potpisuje PDF s certifikatom/ključem (PEM/P12)" - }, - "removeCertSign": { - "title": "Ukloni potpis sertifikata", - "desc": "Uklonite potpis sertifikata iz PDF-a" - }, - "pageLayout": { - "title": "Izgled s više stranica", - "desc": "Spojite više stranica PDF dokumenta u jednu stranicu" - }, - "scalePages": { - "title": "Prilagodite veličinu/razmjer stranice", - "desc": "Promijenite veličinu/razmjer stranice i/ili njezin sadržaj." - }, "pipeline": { "title": "Tok rada", "desc": "Izvršite više radnji na PDF-ovima definiranjem skripti u pipeline-u" }, - "addPageNumbers": { - "title": "Dodaj brojeve stranica", - "desc": "Dodajte brojeve stranica kroz dokument na određeno mjesto" - }, "auto-rename": { "title": "Automatsko preimenovanje PDF datoteka", "desc": "Automatski preimenuje PDF datoteku na temelju otkrivenog zaglavlja" }, - "adjustContrast": { - "title": "Podesi boje/kontrast", - "desc": "Podesite kontrast, zasićenost i svjetlinu PDF-a" - }, - "crop": { - "title": "Izrežite PDF", - "desc": "Izrežite PDF kako biste smanjili njegovu veličinu (zadržava tekst!)" - }, - "autoSplitPDF": { - "title": "Automatsko dijeljenje stranica", - "desc": "Automatsko dijeljenje skeniranog PDF-a s fizičkim QR kodom za dijeljenje stranica" - }, "sanitizePDF": { "title": "Dezinficirati (Sanitize)", "desc": "Uklonite skripte i druge elemente iz PDF datoteka" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Dohvati SVE informacije o PDF-u", - "desc": "Dohvaća sve moguće informacije o PDF-ovima" - }, "pageExtracter": { "title": "Izdvoji stranicu(e)", "desc": "Izdvaja odabrane stranice iz PDF-a" }, - "pdfToSinglePage": { - "title": "PDF u Jednu Veliku Stranicu", - "desc": "Spaja sve PDF stranice u jednu veliku stranicu" - }, - "showJS": { - "title": "Prikaži JavaScript", - "desc": "Pretražuje i prikazuje bilo koji JavaScript umetnut u PDF" - }, "autoRedact": { "title": "Automatsko uređivanje", "desc": "Automatski redigira (zacrni) tekst u PDF-u na temelju unosa teksta" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF u CSV", "desc": "Izdvaja tablice iz PDF-a pretvarajući ga u CSV" @@ -551,10 +870,6 @@ "title": "Automatska podjela po veličini/broju", "desc": "Podijelite jedan PDF na više dokumenata na temelju veličine, broja stranica ili broja dokumenata" }, - "overlay-pdfs": { - "title": "Preklapanje PDF-ova", - "desc": "Preklapa PDF-ove na drugi PDF" - }, "split-by-sections": { "title": "Podijeli PDF po odjeljcima", "desc": "Svaku stranicu PDF-a podijelite na manje vodoravne i okomite dijelove" @@ -563,43 +878,17 @@ "title": "Dodaj pečat u PDF", "desc": "Dodajte tekst ili dodajte slikovne oznake na postavljenim mjestima" }, - "removeImage": { - "title": "Ukloni sliku", - "desc": "Ukloni sliku iz PDF-a kako bi se smanjio veličina datoteke" - }, - "splitByChapters": { - "title": "Podijeli PDF prema glavama", - "desc": "Podijeli PDF na više datoteka prema njegovom strukturnom obliku glava." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Zamenite boju teksta i pozadine u PDF-u te inverzirajte cijeli PDF kako bi se smanjila veličina datoteke." }, - "convert": { - "title": "Pretvori" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Izdvojiti stranice" - }, - "removePages": { - "title": "Ukloniti", - "desc": "Izbrišite neželjene stranice iz svog PDF dokumenta." - }, "removeImagePdf": { "title": "Ukloni sliku", "desc": "Ukloni sliku iz PDF-a kako bi se smanjio veličina datoteke" }, - "autoSizeSplitPDF": { - "title": "Automatska podjela po veličini/broju", - "desc": "Podijelite jedan PDF na više dokumenata na temelju veličine, broja stranica ili broja dokumenata" - }, "adjust-contrast": { "title": "Podesi boje/kontrast", "desc": "Podesite kontrast, zasićenost i svjetlinu PDF-a" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Replace and Invert Color", "desc": "Zamenite boju teksta i pozadine u PDF-u te inverzirajte cijeli PDF kako bi se smanjila veličina datoteke." - }, - "changePermissions": { - "title": "Promjena dopuštenja" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "pregled,čitanje,komentiranje,tekst,slika", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "spajanje,Operacije sa stranicama,Backend,poslužiteljska strana", "title": "Spajanje", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Spajanje", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Ime datoteke", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Spajanje više PDF-ova (2+)", "sortByName": "Poredaj po imenu", "sortByDate": "Poredaj po datumu", - "removeCertSign": "Ukloniti digitalni potpis u kombiniranom datoteku?", - "submit": "Spajanje", - "sortBy": { - "filename": "Ime datoteke" - } + "removeCertSign": "Ukloniti digitalni potpis u kombiniranom datoteku?" }, "split": { - "tags": "Operacije stranice, dijeljenje, više stranica, rezanje,poslužiteljska strana", "title": "Razdvajanje PDF-a", "header": "Razdvajanje PDF-a", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Unesite stranice za razdvajanje:", "submit": "Razdvoji", "steps": { + "chooseMethod": "Choose Method", "settings": "Postavke" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Veličina datoteke" + "name": "Veličina datoteke", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Veličina datoteke" + "label": "Veličina datoteke", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operacije stranice, dijeljenje, više stranica, rezanje,poslužiteljska strana" }, "rotate": { - "tags": "poslužiteljska strana", "title": "Zakreni PDF", + "submit": "Zakreni", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "poslužiteljska strana", "header": "Zakreni PDF", - "selectAngle": "Odaberite kut rotacije (u umnošcima od 90 stupnjeva):", - "submit": "Zakreni" + "selectAngle": "Odaberite kut rotacije (u umnošcima od 90 stupnjeva):" + }, + "convert": { + "title": "Pretvori", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Postavke", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Boja", + "greyscale": "Sivi tonovi", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Ispuni stranicu", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF sadrži digitalni potpis. U sledećem koraku će biti uklonjen.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Sivi tonovi", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konverzija,pretvaranje,img,jpg,slika,foto" @@ -727,7 +1263,33 @@ "8": "Ukloni Zadnju", "9": "Ukloni Prvu i Zadnju", "10": "Neparno-parna kombinacija", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(npr. 1,3,2 ili 4-8,2,10-12 ili 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Dodaj sliku", "submit": "Dodaj sliku" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Tekst,ponavljanje,etiketa,vlastiti,autorsko pravo,zaštita, img,jpg,slika,foto", "title": "Dodaj vodeni žig", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Dodaj vodeni žig", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Tekst", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Veličina pisma", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Tekst", + "2": "Slika" + }, + "tags": "Tekst,ponavljanje,etiketa,vlastiti,autorsko pravo,zaštita, img,jpg,slika,foto", "header": "Dodaj vodeni žig", "customColor": "Prilagođena boja teksta", "selectText": { @@ -755,17 +1506,6 @@ "8": "Vrsta vodenog žiga:", "9": "Slika vodenog žiga:", "10": "Konvertiraj PDF u PDF-Sliku" - }, - "submit": "Dodaj vodeni žig", - "type": { - "1": "Tekst", - "2": "Slika" - }, - "watermarkType": { - "text": "Tekst" - }, - "settings": { - "fontSize": "Veličina pisma" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Ukloni stranice,izbriši stranice", "title": "Ukloniti", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Ukloniti" }, - "addPassword": { - "tags": "sigurno, sigurnost", - "title": "Dodajte zaporku", - "header": "Dodajte zaporku (kriptiraj)", - "selectText": { - "1": "Odaberite PDF za šifriranje", - "2": "Korisnička Zaporka", - "3": "Dužina ključa šifriranja", - "4": "Više vrijednosti su jače, ali niže vrijednosti imaju bolju kompatibilnost.", - "5": "Dopuštenja za postavljanje (preporučuje se korištenje uz vlasničku lozinku)", - "6": "Spriječiti sastavljanje dokumenta", - "7": "Spriječite izdvajanje sadržaja", - "8": "Spriječite izvlačenje radi pristupačnosti", - "9": "Spriječiti ispunjavanje obrasca", - "10": "Spriječiti izmjene", - "11": "Spriječi modificiranje napomena", - "12": "Spriječiti ispis", - "13": "Spriječite ispis različitih formata", - "14": "Zaporka vlasnika", - "15": "Ograničava što se može učiniti s dokumentom nakon što se otvori (ne podržavaju svi čitači)", - "16": "Ograničava otvaranje samog dokumenta" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Šifriraj", "tooltip": { - "permissions": { - "title": "Promjena dopuštenja" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "sigurno, dešifriranje, sigurnost, poništi lozinku, izbriši lozinku", - "title": "Ukloni zaporku", - "header": "Ukloni zaporku (dekriptiraj)", - "selectText": { - "1": "Odaberite PDF za dekriptiranje", - "2": "Zaporka" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Ukloniti", - "desc": "Uklonite zaštitu lozinkom sa svog PDF dokumenta..", - "password": { - "stepTitle": "Ukloni lozinku", - "label": "Trenutna zaporka" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Naslov,autor,datum,kreacije,vrijeme,izdavač,proizvođač,statistike", - "title": "Promjena metapodataka", "header": "Promjena metapodataka", + "submit": "Promijeniti", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Naslov,autor,datum,kreacije,vrijeme,izdavač,proizvođač,statistike", "selectText": { "1": "Uredite varijable koje želite promijeniti", "2": "Izbriši sve metapodatke", @@ -856,15 +1877,7 @@ "4": "Ostali metapodaci:", "5": "Dodaj prilagođeni unos metapodataka" }, - "author": "Autor:", - "creationDate": "Datum stvaranja (gggg/MM/dd HH:mm:ss):", - "creator": "Kreator:", - "keywords": "Ključne riječi:", - "modDate": "Datum izmjene (gggg/MM/dd HH:mm:ss):", - "producer": "Proizvođač:", - "subject": "Predmet:", - "trapped": "Zarobljen:", - "submit": "Promijeniti" + "modDate": "Datum izmjene (gggg/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformacija,format,dokument,slika,slajd,tekst,konverzija,office,docs,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "prepoznavanje,tekst,slika,sken,čitanje,identifikacija,detektiranje,uređivanje", "title": "OCR / čišćenje skeniranja", + "desc": "Čišćenje skenira i otkriva tekst sa slika unutar PDF-a i ponovno ga dodaje kao tekst.", "header": "Čišćenje skeniranja / OCR (optičko prepoznavanje znakova)", "selectText": { "1": "Odaberite jezike koji će se otkriti unutar PDF-a (navedeni su oni koji su trenutno otkriveni):", @@ -896,23 +1910,89 @@ "help": "Pročitajte ovu dokumentaciju o tome kako ovo koristiti za druge jezike i/ili koristiti ne u dockeru", "credit": "Ova usluga koristi qpdf i Tesseract za OCR.", "submit": "Obradi PDF sa OCR-om", - "desc": "Čišćenje skenira i otkriva tekst sa slika unutar PDF-a i ponovno ga dodaje kao tekst.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Postavke", "ocrMode": { - "label": "OCR način" + "label": "OCR način", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Jezici" + "label": "Jezici", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR način" + "title": "OCR način", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Jezici" + "title": "Jezici", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Ekstrakt slika", "selectText": "Odaberite format slike za pretvaranje izdvojenih slika", "allowDuplicates": "Sačuvaj duplikate slike", - "submit": "Izdvajanje" + "submit": "Izdvajanje", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arhiva,dugoročno,standardno,konverzija,čuvanje,čuvanje", @@ -993,17 +2079,53 @@ }, "info": "Python nije instaliran. Treba je za izvršenje." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autorizacija,inicijali,crtani-potpis,tekstualni-potpis,slikovni-potpis", "title": "Potpišite", "header": "Potpišite PDF-ove", "upload": "Učitaj sliku", - "draw": "Nacrtaj potpis", - "text": "Tekstualni unos", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Obriši", "add": "Dodaj", "saved": "Sacuvane potpisne oznake", "save": "Sačuvaj potpisnu oznaku", + "applySignatures": "Apply Signatures", "personalSigs": "Osobni potpisi", "sharedSigs": "Dijeljeni potpisi", "noSavedSigs": "Nema sacuvanih potpisa pronađenih", @@ -1015,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autorizacija,inicijali,crtani-potpis,tekstualni-potpis,slikovni-potpis" }, "flatten": { - "tags": "statično,deaktivirati,neinteraktivno,usmjeriti", "title": "Izravnati", "header": "Izravnati pdf", "flattenOnlyForms": "Izravnati samo obrasce", "submit": "Izravnati", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Postavke" }, "options": { - "flattenOnlyForms": "Izravnati samo obrasce" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Izravnati samo obrasce", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statično,deaktivirati,neinteraktivno,usmjeriti" }, "repair": { "tags": "popravi,vrati,korekcija,obnovi", "title": "Popravi", "header": "Popravi PDF datoteku", - "submit": "Popravi" + "submit": "Popravi", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "čišćenje,usmjeriti,ne-sadržaj,organizacija", "title": "Uklonite prazne stranice", "header": "Uklonite prazne stranice", - "threshold": "Prag bjeline piksela:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Uklonite prazne stranice", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "čišćenje,usmjeriti,ne-sadržaj,organizacija", "thresholdDesc": "Prag za određivanje koliko bijeli piksel mora biti bijel da bi bio klasificiran kao 'bijeli'. 0 = crno, 255 čisto bijelo.", - "whitePercent": "Postotak bijele boje (%):", - "whitePercentDesc": "Postotak stranice koji mora biti \"bijeli\" piksel da bi se uklonio", - "submit": "Uklonite prazne stranice" + "whitePercentDesc": "Postotak stranice koji mora biti \"bijeli\" piksel da bi se uklonio" }, "removeAnnotations": { "tags": "komentari,isticanje,bilješke,oznake,ukloni", "title": "Ukloni komentare", "header": "Ukloni komentare", - "submit": "Ukloni" + "submit": "Ukloni", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "razlikovati,kontrast,izmjene,analiza", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "autentifikacija,PEM,P12,zvanično,šifriranje", "title": "Potpisivanje Certifikatom", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Mjesto", + "logoTitle": "Logo", + "name": "Ime", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Unesite svoju lozinku za skladište ključeva ili privatni ključ (ako postoji):", + "passwordOptional": "Leave empty if no password", + "reason": "Razlog", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Prikaži logo", "header": "Potpišite PDF svojim certifikatom (Rad u tijeku)", "selectPDF": "Odaberite PDF datoteku za potpisivanje:", "jksNote": "Napomena: Ako vrsta vašeg certifikata nije navedena u nastavku, pretvorite ga u datoteku Java Keystore (.jks) pomoću alata naredbenog retka keytool. Zatim odaberite opciju .jks datoteke u nastavku.", @@ -1089,13 +2484,7 @@ "selectCert": "Odaberite svoju datoteku certifikata (format X.509, može biti .pem ili .der):", "selectP12": "Odaberite svoju PKCS#12 datoteku pohrane ključeva (.p12 ili .pfx) (neobavezno, ako je dostupna, trebala bi sadržavati vaš privatni ključ i certifikat):", "selectJKS": "Odaberite datoteku Java Keystore (.jks ili .keystore):", - "certType": "Tip certifikata", - "password": "Unesite svoju lozinku za skladište ključeva ili privatni ključ (ako postoji):", "showSig": "Prikaži potpis", - "reason": "Razlog", - "location": "Mjesto", - "name": "Ime", - "showLogo": "Prikaži logo", "submit": "Potpiši PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Ukloni digitalno potpisano dokazilo", "header": "Uklonite digitalni potpis iz PDF-a", "selectPDF": "Odaberite datoteku PDF:", - "submit": "Ukloni potpisi" + "submit": "Ukloni potpisi", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "spajanje,kompozitni,pojedinačan-prikaz,organizacija", @@ -1111,16 +2511,157 @@ "header": "Izgled s više stranica", "pagesPerSheet": "Broj stranica po listu:", "addBorder": "Dodajte granice dokumenta", - "submit": "Potvrdi" + "submit": "Potvrdi", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "izmjena,modifikacija,dimenzija,adaptacija", "title": "Podesite veličinu stranice", "header": "Podesite veličinu stranice", "pageSize": "Veličina stranice dokumenta.", "keepPageSize": "Originalna veličina", "scaleFactor": "Razina zumiranja (obrezivanje) stranice.", - "submit": "Potvrdi" + "submit": "Potvrdi", + "tags": "izmjena,modifikacija,dimenzija,adaptacija" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginirati, označiti, organizirati, indeksirati" @@ -1129,16 +2670,83 @@ "tags": "auto-detekcija,zaglavlje-bazirano,organizacija,preimenovanje", "title": "Automatski preimenuj", "header": "Automatski preimenuj PDF", - "submit": "Automatski preimenuj" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Automatski preimenuj", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "korekcija boje, ugađanje, modificiranje, poboljšanje" }, "crop": { - "tags": "obrezivanje, smanjivanje, uređivanje, oblikovanje", "title": "Izreži", "header": "Izreži sliku", - "submit": "Potvrdi" + "submit": "Potvrdi", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "obrezivanje, smanjivanje, uređivanje, oblikovanje" }, "autoSplitPDF": { "tags": "QR-bazirano,razdvoji,segment-skeniranja,organizacija", @@ -1221,24 +2829,124 @@ "downloadJS": "Preuzmite Javascript", "submit": "Prikaži" }, - "autoRedact": { - "tags": "Cenzura,Sakrij,prekrivanje,crna,marker,skriveno", - "title": "Automatsko uređivanje", - "header": "Automatsko uređivanje", - "colorLabel": "Boja", - "textsToRedactLabel": "Tekst za uređivanje (razdvojen linijama)", - "textsToRedactPlaceholder": "npr. \\nPovjerljivo \\nStrogo čuvana tajna", - "useRegexLabel": "Koristi Regex", - "wholeWordSearchLabel": "Pretraživanje cijelih riječi", - "customPaddingLabel": "Dodatni prazan prostor", - "convertPDFToImageLabel": "Pretvorite PDF u PDF-sliku (koristi se za uklanjanje teksta iza okvira)", - "submitButton": "Potvrdi" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Napredno" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Dodaj", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Stranice", + "placeholder": "(t.j. 1,2,8 ili 4,7,12-16 ili 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1264,21 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Napredno" - }, - "wordsToRedact": { - "add": "Dodaj" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Stranice", - "placeholder": "(t.j. 1,2,8 ili 4,7,12-16 ili 2n-1)" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Izdvajanje tabela,izdvajanje,pretvaranje" @@ -1289,11 +2983,15 @@ "overlay-pdfs": { "tags": "Preklapanje", "header": "Prekrivanje PDF datoteka", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Odaberite Osnovnu PDF datoteka" }, "overlayFiles": { - "label": "Izaberite PDF datoteke za prekrivanje" + "label": "Izaberite PDF datoteke za prekrivanje", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Odaberite način preklapanja", @@ -1303,14 +3001,53 @@ }, "counts": { "label": "Brojevi preklapanja (za način fiksnog ponavljanja)", - "placeholder": "Unesite brojeve odvojene zarezima (npr. 2,3,1)" + "placeholder": "Unesite brojeve odvojene zarezima (npr. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Odaberite položaj preklapanja", "foreground": "Prednji plan", "background": "Pozadina" }, - "submit": "Potvrditi" + "submit": "Potvrditi", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Dijeljenje odjeljaka,Dijeljenje,Postavke", @@ -1331,6 +3068,7 @@ "tags": "Pečat, dodavanje slike, središnja slika, vodeni žig, PDF, ugradnja, prilagodba", "header": "Pečat PDF", "title": "Pečat PDF", + "stampSetup": "Stamp Setup", "stampType": "Pečat Tip", "stampText": "Pečat Tekst", "stampImage": "Pečat Slika", @@ -1343,7 +3081,19 @@ "overrideY": "Poništi Y koordinatu", "customMargin": "Prilagođena margina", "customColor": "Prilagođena boja teksta", - "submit": "Pošalji" + "submit": "Pošalji", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Ukloni sliku, Rad sa stranicama, Back end, server strana" @@ -1361,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1388,40 +3139,122 @@ "version": "Verzija", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Zameni-inverziranje boja u PDF-u", - "selectText": { - "1": "Optije za zamenu ili inverziranje boja", - "2": "Standardno (standarske visoko kontrastne boje)", - "3": "Napčno (prilagođene boje)", - "4": "Cijelo-inverzirajte (inverzirajte sve boje)", - "5": "Optije visoko kontrastne boje", - "6": "Crna tekst na bijelu pozadini", - "7": "Bijeli tekst na crvenoj pozadini", - "8": "Žutni tekst na crnoj pozadini", - "9": "Zeleni tekst na crnoj pozadini", - "10": "Izaberite boju teksta", - "11": "Izaberite pozadinu boju" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Zamijeni" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Zameni boju, Rad sa stranicama, Back end, server strana" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Prijavite se", "header": "Prijavite se", "signin": "Prijavite se", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Zapamti me", "invalid": "Neispravno korisničko ime ili zaporka.", "locked": "Vaš račun je zaključan.", @@ -1440,12 +3273,83 @@ "alreadyLoggedIn": "Već ste se prijavili na", "alreadyLoggedIn2": "ure. Odjavite se s ure i pokušajte ponovo.", "toManySessions": "Imate preko mrežne sesije aktivnih", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF u Jednu Stranicu", "header": "PDF u Jednu Stranicu", - "submit": "Pretvori u Jednu Stranicu" + "submit": "Pretvori u Jednu Stranicu", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Izdvojiti stranice", @@ -1469,18 +3373,59 @@ "adjustContrast": { "title": "Podesite kontrast", "header": "Podesite kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Osvjetljenje:", "saturation": "Zasićenje:", - "download": "Preuzmi" + "download": "Preuzmi", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Komprimirajte", + "desc": "Compress PDFs to reduce their file size.", "header": "Komprimirajte PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Veličina datoteke" + }, "credit": "Ova usluga koristi qpdf za komprimiranje / optimizaciju PDF-a.", "grayscale": { "label": "Primijeni sivinu za kompresiju" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1490,10 +3435,7 @@ "4": "Automatski način - Automatski prilagođava kvalitetu kako bi PDF dobio točnu veličinu", "5": "Očekivana veličina PDF-a (npr. 25 MB, 10,8 MB, 25 KB)" }, - "submit": "Kompresiraj", - "method": { - "filesize": "Veličina datoteke" - } + "submit": "Kompresiraj" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1594,7 +3536,13 @@ "title": "Ukloni sliku", "header": "Ukloni sliku", "removeImage": "Ukloni sliku", - "submit": "Izbriši sliku" + "submit": "Izbriši sliku", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Podijeli PDF naoglazdene glave", @@ -1628,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1663,45 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Preuzmi datoteku", - "convert": { - "title": "Pretvori", - "settings": "Postavke", - "color": "Boja", - "greyscale": "Sivi tonovi", - "fillPage": "Ispuni stranicu", - "pdfaDigitalSignatureWarning": "PDF sadrži digitalni potpis. U sledećem koraku će biti uklonjen.", - "grayscale": "Sivi tonovi" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Potpisati" + "read": "Read", + "sign": "Potpisati", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { - "loading": "Učitavanje..." + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Učitavanje...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Ime", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Verzija", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Preuzmi datoteku", - "delete": "Izbriši" + "delete": "Izbriši", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Sanirajte PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Postavke" + "files": "Files", + "settings": "Postavke", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Dodajte zaporku", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Šifriraj", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Promjena dopuštenja", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "sigurno, sigurnost", + "header": "Dodajte zaporku (kriptiraj)", + "selectText": { + "1": "Odaberite PDF za šifriranje", + "2": "Korisnička Zaporka", + "3": "Dužina ključa šifriranja", + "4": "Više vrijednosti su jače, ali niže vrijednosti imaju bolju kompatibilnost.", + "5": "Dopuštenja za postavljanje (preporučuje se korištenje uz vlasničku lozinku)", + "6": "Spriječiti sastavljanje dokumenta", + "7": "Spriječite izdvajanje sadržaja", + "8": "Spriječite izvlačenje radi pristupačnosti", + "9": "Spriječiti ispunjavanje obrasca", + "10": "Spriječiti izmjene", + "11": "Spriječi modificiranje napomena", + "12": "Spriječiti ispis", + "13": "Spriječite ispis različitih formata", + "14": "Zaporka vlasnika", + "15": "Ograničava što se može učiniti s dokumentom nakon što se otvori (ne podržavaju svi čitači)", + "16": "Ograničava otvaranje samog dokumenta" } }, "changePermissions": { "title": "Promjena dopuštenja", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Promjena dopuštenja", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Spriječiti sastavljanje dokumenta" @@ -1728,10 +4580,784 @@ "label": "Spriječite ispis različitih formata" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Promjena dopuštenja" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Ukloni zaporku", + "desc": "Uklonite zaštitu lozinkom sa svog PDF dokumenta..", + "tags": "sigurno, dešifriranje, sigurnost, poništi lozinku, izbriši lozinku", + "password": { + "stepTitle": "Ukloni lozinku", + "label": "Trenutna zaporka", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Ukloniti", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Ukloni zaporku (dekriptiraj)", + "selectText": { + "1": "Odaberite PDF za dekriptiranje", + "2": "Zaporka" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Optije za zamenu ili inverziranje boja", + "2": "Standardno (standarske visoko kontrastne boje)", + "3": "Napčno (prilagođene boje)", + "4": "Cijelo-inverzirajte (inverzirajte sve boje)", + "5": "Optije visoko kontrastne boje", + "6": "Crna tekst na bijelu pozadini", + "7": "Bijeli tekst na crvenoj pozadini", + "8": "Žutni tekst na crnoj pozadini", + "9": "Zeleni tekst na crnoj pozadini", + "10": "Izaberite boju teksta", + "11": "Izaberite pozadinu boju", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Zamijeni", + "title": "Replace-Invert-Color", + "header": "Zameni-inverziranje boja u PDF-u" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Cenzura,Sakrij,prekrivanje,crna,marker,skriveno", + "title": "Automatsko uređivanje", + "header": "Automatsko uređivanje", + "colorLabel": "Boja", + "textsToRedactLabel": "Tekst za uređivanje (razdvojen linijama)", + "textsToRedactPlaceholder": "npr. \\nPovjerljivo \\nStrogo čuvana tajna", + "useRegexLabel": "Koristi Regex", + "wholeWordSearchLabel": "Pretraživanje cijelih riječi", + "customPaddingLabel": "Dodatni prazan prostor", + "convertPDFToImageLabel": "Pretvorite PDF u PDF-sliku (koristi se za uklanjanje teksta iza okvira)", + "submitButton": "Potvrdi" + }, + "replaceColorPdf": { + "tags": "Zameni boju, Rad sa stranicama, Back end, server strana" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/hu-HU/translation.json b/frontend/public/locales/hu-HU/translation.json index f166a30a7..dc0b250fc 100644 --- a/frontend/public/locales/hu-HU/translation.json +++ b/frontend/public/locales/hu-HU/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Egyedi szöveg", "numberPagesDesc": "Mely oldalakat számozzuk, alapértelmezett 'mind', elfogad 1-5 vagy 2,5,9 formátumot is", "customNumberDesc": "Alapértelmezett {n}, elfogad 'Oldal {n} / {total}', 'Szöveg-{n}', '{filename}-{n}' formátumot", - "submit": "Oldalszámozás hozzáadása" + "submit": "Oldalszámozás hozzáadása", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Egyedi oldalválasztás (Adja meg az oldalszámokat vesszővel elválasztva, pl. 1,5,6 vagy használjon függvényeket, pl. 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "PDF-fájl kiválasztása", "multiPdfPrompt": "PDF-fájlok kiválasztása (2+)", "multiPdfDropPrompt": "Válassza ki (vagy húzza ide) az összes szükséges PDF-fájlt", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "túl nagyok. A maximálisan megengedett méretek", "processTimeWarning": "Figyelmeztetés: A folyamat akár egy percig is eltarthat a fájlmérettől függően", "pageOrderPrompt": "Egyedi oldalsorrend (Adja meg az oldalszámokat vesszővel elválasztva vagy használjon függvényeket, pl. 2n+1):", - "pageSelectionPrompt": "Egyedi oldalválasztás (Adja meg az oldalszámokat vesszővel elválasztva, pl. 1,5,6 vagy használjon függvényeket, pl. 2n+1):", "goToPage": "Ugrás", "true": "Igen", "false": "Nem", "unknown": "Ismeretlen", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Mentés", "saveToBrowser": "Mentés böngészőbe", + "download": "Letöltés", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Visszavonás", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Bezárás", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "fájl kiválasztva", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Nincsenek kedvencek", "downloadComplete": "Letöltés befejezve", "bored": "Unatkozik várakozás közben?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "A PDF-dokumentum jelszóval védett, és vagy nem adott meg jelszót, vagy helytelen jelszót adott meg", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Hiba", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Sajnáljuk a kellemetlenséget!", "needHelp": "Segítségre van szüksége / Hibát talált?", "contactTip": "Ha továbbra is problémákba ütközik, ne habozzon segítséget kérni. Bejelenthet hibát GitHub oldalunkon vagy felkereshet minket Discordon:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Hiba bejelentése", "discordSubmit": "Discord - Támogatási poszt létrehozása" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Törlés", "username": "Felhasználónév", "password": "Jelszó", @@ -82,6 +169,7 @@ "green": "Zöld", "blue": "Kék", "custom": "Egyéni...", + "comingSoon": "Coming soon", "WorkInProgess": "Fejlesztés alatt álló funkció, hibák előfordulhatnak. Kérjük, jelezze a problémákat!", "poweredBy": "Üzemelteti:", "yes": "Igen", @@ -115,12 +203,14 @@ "page": "Oldal", "pages": "Oldal", "loading": "Betöltés...", + "review": "Review", "addToDoc": "Hozzáadás a dokumentumhoz", "reset": "Visszaállítás", "apply": "Alkalmaz", "noFileSelected": "Nincs fájl kiválasztva. Kérjük, töltsön fel egyet.", "legal": { "privacy": "Adatvédelmi irányelvek", + "iAgreeToThe": "I agree to all of the", "terms": "Felhasználási feltételek", "accessibility": "Akadálymentesítési nyilatkozat", "cookie": "Süti szabályzat", @@ -160,6 +250,7 @@ "title": "Szeretne hozzájárulni a Stirling PDF fejlesztéséhez?", "paragraph1": "A Stirling PDF opcionális analitikai adatgyűjtést kínál a termék fejlesztésének támogatásához. Nem gyűjtünk személyes információkat vagy fájltartalmakat.", "paragraph2": "Kérjük, fontolja meg az analitika engedélyezését, hogy segítse a Stirling-PDF növekedését és jobban megérthessük felhasználóink igényeit.", + "learnMore": "Learn more", "enable": "Analitika engedélyezése", "disable": "Analitika letiltása", "settings": "Az analitikai beállításokat a config/settings.yml fájlban módosíthatja" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Űrlapmezők mentése", "help": "Engedélyezése esetén menti a korábban használt értékeket a későbbi használathoz" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "Összes", "refresh": "Frissítés", - "includeHomepage": "Tartalmazza a honlapot ('/')", - "includeLoginPage": "Tartalmazza a bejelentkezési oldat ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Összes végpont", "totalVisits": "Összes megtekintés", "showing": "Mutatás", @@ -290,7 +431,9 @@ "top": "Legnépszerűbb", "numberOfVisits": "Megtekintések száma", "visitsTooltip": "Megtekintések: {0} ({1}% az összes megtekintésből)", - "retry": "Újrapróbálás" + "retry": "Újrapróbálás", + "includeHomepage": "Tartalmazza a honlapot ('/')", + "includeLoginPage": "Tartalmazza a bejelentkezési oldat ('/login')" }, "database": { "title": "Adatbázis importálás/exportálás", @@ -331,22 +474,310 @@ "alphabetical": "ABC sorrend", "globalPopularity": "Teljes népszerűség", "sortBy": "Rendezés:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF többfunkciós eszköz", "desc": "Egyesítés, forgatás, átrendezés és oldalak eltávolítása" }, "merge": { + "tags": "combine,join,unite", "title": "Egyesítés", "desc": "PDF-ek egyszerű egyesítése." }, "split": { + "tags": "divide,separate,break", "title": "Felosztás", "desc": "PDF-ek felosztása több dokumentumra" }, "rotate": { + "tags": "turn,flip,orient", "title": "Forgatás", "desc": "PDF-ek egyszerű forgatása." }, + "convert": { + "tags": "transform,change", + "title": "Konvertálás", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Rendszerezés", + "desc": "Oldalak eltávolítása/átrendezése tetszőleges sorrendben" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Kép hozzáadása", + "desc": "Kép hozzáadása a PDF megadott helyére" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Vízjel hozzáadása", + "desc": "Egyedi vízjel hozzáadása PDF dokumentumhoz" + }, + "removePassword": { + "tags": "unlock", + "title": "Jelszó eltávolítása", + "desc": "Jelszavas védelem eltávolítása a PDF dokumentumból" + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Tömörítés", + "desc": "PDF-ek tömörítése a fájlméret csökkentése érdekében" + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "PDF űrlapok feloldása", + "desc": "PDF dokumentumban lévő űrlapmezők írásvédettségének eltávolítása." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Metaadatok módosítása", + "desc": "PDF dokumentum metaadatainak módosítása/törlése/hozzáadása" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Szkennelt dokumentumok tisztítása", + "desc": "Szkennelt dokumentumok tisztítása és szövegfelismerés képekből, majd visszaadása szerkeszthető szövegként" + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Képek kinyerése", + "desc": "Minden kép kinyerése a PDF-ből és mentése ZIP fájlba" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Aláírás", + "desc": "Aláírás hozzáadása PDF-hez rajzolással, szöveggel vagy képpel" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Lapítás", + "desc": "Minden interaktív elem és űrlap eltávolítása a PDF-ből" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Tanúsítvánnyal aláírás", + "desc": "PDF aláírása tanúsítvánnyal/kulccsal (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Javítás", + "desc": "Sérült/hibás PDF javítása" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Üres oldalak eltávolítása", + "desc": "Üres oldalak felismerése és eltávolítása a dokumentumból" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Megjegyzések eltávolítása", + "desc": "Minden megjegyzés/annotáció eltávolítása a PDF-ből" + }, + "compare": { + "tags": "difference", + "title": "Összehasonlítás", + "desc": "Két PDF dokumentum összehasonlítása és különbségek megjelenítése" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Tanúsítványos aláírás eltávolítása", + "desc": "Tanúsítványos aláírás eltávolítása PDF-ből" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Többoldalas elrendezés", + "desc": "PDF dokumentum több oldalának egyesítése egyetlen oldalra" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Oldalméret/méretarány beállítása", + "desc": "Oldal és/vagy tartalom méretének/méretarányának módosítása" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Oldalszámozás hozzáadása", + "desc": "Oldalszámok hozzáadása a dokumentumhoz meghatározott helyen" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Színek/kontraszt beállítása", + "desc": "PDF kontraszt, telítettség és fényerő beállítása" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF vágása", + "desc": "PDF vágása a méret csökkentése érdekében (a szöveg megmarad!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Automatikus oldalfelosztás", + "desc": "Szkennelt PDF automatikus felosztása QR-kód alapú oldalelválasztóval" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "PDF összes információjának lekérése", + "desc": "Minden elérhető információ lekérése PDF-ekről" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "Egyoldalas nagy PDF", + "desc": "Minden PDF oldal egyesítése egyetlen nagy oldalba" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "JavaScript megjelenítése", + "desc": "PDF-be injektált JavaScript kód keresése és megjelenítése" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Kézi kitakarás", + "desc": "PDF kitakarása kiválasztott szöveg, rajzolt alakzatok és/vagy kiválasztott oldalak alapján" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Képek eltávolítása", + "desc": "Képek eltávolítása PDF-ből a fájlméret csökkentése érdekében" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "PDF felosztása fejezetek szerint", + "desc": "PDF felosztása több fájlra a fejezetstruktúra alapján" + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "PDF aláírás ellenőrzése", + "desc": "Digitális aláírások és tanúsítványok ellenőrzése PDF dokumentumokban" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Szerkesztés vagy hozzáadás a PDF tartalomjegyzékéhez", + "desc": "PDF dokumentumokban könyvjelzők és tartalomjegyzék hozzáadása vagy szerkesztése" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Oldalak kinyerése", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Eltávolítás", + "desc": "Felesleges oldalak törlése a PDF dokumentumból." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Automatikus felosztás méret/darabszám szerint", + "desc": "Egyetlen PDF felosztása több dokumentumra méret, oldalszám vagy dokumentumszám alapján" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Jelszó hozzáadása", + "desc": "PDF dokumentum jelszavas védelme" + }, + "changePermissions": { + "title": "Jogosultságok módosítása", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "PDF-ek egymásra helyezése egy másik PDF-en", + "title": "PDF-ek egymásra helyezése" + }, "imageToPDF": { "title": "Kép PDF-be", "desc": "Kép (PNG, JPEG, GIF) konvertálása PDF-fé." @@ -355,18 +786,6 @@ "title": "PDF képpé", "desc": "PDF konvertálása képpé (PNG, JPEG, GIF)." }, - "pdfOrganiser": { - "title": "Rendszerezés", - "desc": "Oldalak eltávolítása/átrendezése tetszőleges sorrendben" - }, - "addImage": { - "title": "Kép hozzáadása", - "desc": "Kép hozzáadása a PDF megadott helyére" - }, - "watermark": { - "title": "Vízjel hozzáadása", - "desc": "Egyedi vízjel hozzáadása PDF dokumentumhoz" - }, "permissions": { "title": "Jogosultságok módosítása", "desc": "PDF dokumentum jogosultságainak módosítása" @@ -375,38 +794,10 @@ "title": "Eltávolítás", "desc": "Felesleges oldalak törlése a PDF dokumentumból." }, - "addPassword": { - "title": "Jelszó hozzáadása", - "desc": "PDF dokumentum jelszavas védelme" - }, - "removePassword": { - "title": "Jelszó eltávolítása", - "desc": "Jelszavas védelem eltávolítása a PDF dokumentumból" - }, - "compress": { - "title": "Tömörítés", - "desc": "PDF-ek tömörítése a fájlméret csökkentése érdekében" - }, - "unlockPDFForms": { - "title": "PDF űrlapok feloldása", - "desc": "PDF dokumentumban lévő űrlapmezők írásvédettségének eltávolítása." - }, - "changeMetadata": { - "title": "Metaadatok módosítása", - "desc": "PDF dokumentum metaadatainak módosítása/törlése/hozzáadása" - }, "fileToPDF": { "title": "Fájl konvertálása PDF-be", "desc": "Szinte bármilyen fájl konvertálása PDF-be (DOCX, PNG, XLS, PPT, TXT és egyebek)" }, - "ocr": { - "title": "OCR / Szkennelt dokumentumok tisztítása", - "desc": "Szkennelt dokumentumok tisztítása és szövegfelismerés képekből, majd visszaadása szerkeszthető szövegként" - }, - "extractImages": { - "title": "Képek kinyerése", - "desc": "Minden kép kinyerése a PDF-ből és mentése ZIP fájlba" - }, "pdfToPDFA": { "title": "PDF konvertálása PDF/A formátumba", "desc": "PDF konvertálása PDF/A formátumba hosszú távú tároláshoz" @@ -435,70 +826,14 @@ "title": "Szkennelt képek felismerése/szétválasztása", "desc": "Több fotó szétválasztása egy képből/PDF-ből" }, - "sign": { - "title": "Aláírás", - "desc": "Aláírás hozzáadása PDF-hez rajzolással, szöveggel vagy képpel" - }, - "flatten": { - "title": "Lapítás", - "desc": "Minden interaktív elem és űrlap eltávolítása a PDF-ből" - }, - "repair": { - "title": "Javítás", - "desc": "Sérült/hibás PDF javítása" - }, - "removeBlanks": { - "title": "Üres oldalak eltávolítása", - "desc": "Üres oldalak felismerése és eltávolítása a dokumentumból" - }, - "removeAnnotations": { - "title": "Megjegyzések eltávolítása", - "desc": "Minden megjegyzés/annotáció eltávolítása a PDF-ből" - }, - "compare": { - "title": "Összehasonlítás", - "desc": "Két PDF dokumentum összehasonlítása és különbségek megjelenítése" - }, - "certSign": { - "title": "Tanúsítvánnyal aláírás", - "desc": "PDF aláírása tanúsítvánnyal/kulccsal (PEM/P12)" - }, - "removeCertSign": { - "title": "Tanúsítványos aláírás eltávolítása", - "desc": "Tanúsítványos aláírás eltávolítása PDF-ből" - }, - "pageLayout": { - "title": "Többoldalas elrendezés", - "desc": "PDF dokumentum több oldalának egyesítése egyetlen oldalra" - }, - "scalePages": { - "title": "Oldalméret/méretarány beállítása", - "desc": "Oldal és/vagy tartalom méretének/méretarányának módosítása" - }, "pipeline": { "title": "Pipeline", "desc": "Több művelet végrehajtása PDF-eken pipeline szkriptek definiálásával" }, - "addPageNumbers": { - "title": "Oldalszámozás hozzáadása", - "desc": "Oldalszámok hozzáadása a dokumentumhoz meghatározott helyen" - }, "auto-rename": { "title": "PDF automatikus átnevezése", "desc": "PDF fájl automatikus átnevezése a felismert fejléc alapján" }, - "adjustContrast": { - "title": "Színek/kontraszt beállítása", - "desc": "PDF kontraszt, telítettség és fényerő beállítása" - }, - "crop": { - "title": "PDF vágása", - "desc": "PDF vágása a méret csökkentése érdekében (a szöveg megmarad!)" - }, - "autoSplitPDF": { - "title": "Automatikus oldalfelosztás", - "desc": "Szkennelt PDF automatikus felosztása QR-kód alapú oldalelválasztóval" - }, "sanitizePDF": { "title": "Tisztítás", "desc": "Szkriptek és egyéb elemek eltávolítása PDF fájlokból" @@ -519,30 +854,14 @@ "title": "PDF konvertálása Markdown-ba", "desc": "Akármilyen PDF konvertálása Markdown-ba" }, - "getPdfInfo": { - "title": "PDF összes információjának lekérése", - "desc": "Minden elérhető információ lekérése PDF-ekről" - }, "pageExtracter": { "title": "Oldalak kinyerése", "desc": "Kiválasztott oldalak kinyerése PDF-ből" }, - "pdfToSinglePage": { - "title": "Egyoldalas nagy PDF", - "desc": "Minden PDF oldal egyesítése egyetlen nagy oldalba" - }, - "showJS": { - "title": "JavaScript megjelenítése", - "desc": "PDF-be injektált JavaScript kód keresése és megjelenítése" - }, "autoRedact": { "title": "Automatikus kitakarás", "desc": "Szöveg automatikus kitakarása (feketével) PDF-ben megadott szöveg alapján" }, - "redact": { - "title": "Kézi kitakarás", - "desc": "PDF kitakarása kiválasztott szöveg, rajzolt alakzatok és/vagy kiválasztott oldalak alapján" - }, "PDFToCSV": { "title": "PDF konvertálása CSV-be", "desc": "Táblázatok kinyerése PDF-ből és konvertálása CSV formátumba" @@ -551,10 +870,6 @@ "title": "Automatikus felosztás méret/darabszám szerint", "desc": "Egyetlen PDF felosztása több dokumentumra méret, oldalszám vagy dokumentumszám alapján" }, - "overlay-pdfs": { - "title": "PDF-ek egymásra helyezése", - "desc": "PDF-ek egymásra helyezése egy másik PDF-en" - }, "split-by-sections": { "title": "PDF felosztása szakaszokra", "desc": "PDF oldalainak felosztása kisebb vízszintes és függőleges szakaszokra" @@ -563,48 +878,18 @@ "title": "Pecsét hozzáadása PDF-hez", "desc": "Szöveges vagy képes pecsét hozzáadása megadott helyekre" }, - "removeImage": { - "title": "Képek eltávolítása", - "desc": "Képek eltávolítása PDF-ből a fájlméret csökkentése érdekében" - }, - "splitByChapters": { - "title": "PDF felosztása fejezetek szerint", - "desc": "PDF felosztása több fájlra a fejezetstruktúra alapján" - }, - "validateSignature": { - "title": "PDF aláírás ellenőrzése", - "desc": "Digitális aláírások és tanúsítványok ellenőrzése PDF dokumentumokban" - }, "replace-color": { "title": "Színek cseréje és invertálása", "desc": "PDF szöveg és háttérszíneinek cseréje és teljes színinvertálás a fájlméret csökkentése érdekében" }, - "convert": { - "title": "Konvertálás" - }, "attachments": { "title": "Csatolmányok hozzáadása a PDF-hez", "desc": "Csatolmányok (beágyazott fájlok) hozzáadása vagy eltávolítása a PDF-ből" }, - "editTableOfContents": { - "title": "Szerkesztés vagy hozzáadás a PDF tartalomjegyzékéhez", - "desc": "PDF dokumentumokban könyvjelzők és tartalomjegyzék hozzáadása vagy szerkesztése" - }, - "extractPages": { - "title": "Oldalak kinyerése" - }, - "removePages": { - "title": "Eltávolítás", - "desc": "Felesleges oldalak törlése a PDF dokumentumból." - }, "removeImagePdf": { "title": "Képek eltávolítása", "desc": "Képek eltávolítása PDF-ből a fájlméret csökkentése érdekében" }, - "autoSizeSplitPDF": { - "title": "Automatikus felosztás méret/darabszám szerint", - "desc": "Egyetlen PDF felosztása több dokumentumra méret, oldalszám vagy dokumentumszám alapján" - }, "adjust-contrast": { "title": "Színek/kontraszt beállítása", "desc": "PDF kontraszt, telítettség és fényerő beállítása" @@ -612,11 +897,12 @@ "replaceColorPdf": { "title": "Színek cseréje és invertálása", "desc": "PDF szöveg és háttérszíneinek cseréje és teljes színinvertálás a fájlméret csökkentése érdekében" - }, - "changePermissions": { - "title": "Jogosultságok módosítása" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "megtekintés,olvasás,jegyzetelés,szöveg,kép", "title": "PDF megtekintése/szerkesztése", @@ -650,17 +936,39 @@ "merge": { "tags": "egyesítés,Oldalműveletek,Backend,szerver oldali", "title": "Egyesítés", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Egyesítés", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Fájlnév", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Több PDF egyesítése (2+)", "sortByName": "Rendezés név szerint", "sortByDate": "Rendezés dátum szerint", - "removeCertSign": "Digitális aláírás eltávolítása az egyesített fájlban?", - "submit": "Egyesítés", - "sortBy": { - "filename": "Fájlnév" - } + "removeCertSign": "Digitális aláírás eltávolítása az egyesített fájlban?" }, "split": { - "tags": "Oldalműveletek,felosztás,Több oldal,vágás,szerver oldali", "title": "PDF felosztása", "header": "PDF felosztása", "desc": { @@ -676,25 +984,249 @@ "splitPages": "Adja meg a felosztási pontokat:", "submit": "Felosztás", "steps": { + "chooseMethod": "Choose Method", "settings": "Beállítások" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Fájlméret" + "name": "Fájlméret", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Fájlméret" + "label": "Fájlméret", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Oldalműveletek,felosztás,Több oldal,vágás,szerver oldali" }, "rotate": { - "tags": "szerver oldali", "title": "PDF forgatása", + "submit": "Forgatás", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "szerver oldali", "header": "PDF forgatása", - "selectAngle": "Válassza ki a forgatási szöget (90 fok többszörösei):", - "submit": "Forgatás" + "selectAngle": "Válassza ki a forgatási szöget (90 fok többszörösei):" + }, + "convert": { + "title": "Konvertálás", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Beállítások", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Szín", + "greyscale": "Szürkeárnyalatos", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Oldal kitöltése", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "A PDF digitális aláírást tartalmaz. Ez a következő lépésben eltávolításra kerül.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Szürkeárnyalatos", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konverzió,kép,jpg,fotó,fénykép" @@ -732,7 +1264,33 @@ "8": "Utolsó oldal eltávolítása", "9": "Első és utolsó oldal eltávolítása", "10": "Páros-páratlan egyesítés", - "11": "Minden oldal megkettőzése" + "11": "Minden oldal megkettőzése", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(pl. 1,3,2 vagy 4-8,2,10-12 vagy 2n-1)" }, @@ -744,9 +1302,198 @@ "upload": "Kép hozzáadása", "submit": "Kép hozzáadása" }, + "attachments": { + "tags": "beágyazás,csatolás,fájl,csatolmány,csatolmányok", + "title": "Mellékletek hozzáadása", + "header": "Mellékletek hozzáadása", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Csatolmányok hozzáadása a PDF-hez" + }, "watermark": { - "tags": "Szöveg,ismétlődő,címke,egyedi,szerzői jog,védjegy,kép,jpg,fotó,fénykép", "title": "Vízjel hozzáadása", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Vízjel hozzáadása", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Szöveg", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Betűméret", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Szöveg", + "2": "Kép" + }, + "tags": "Szöveg,ismétlődő,címke,egyedi,szerzői jog,védjegy,kép,jpg,fotó,fénykép", "header": "Vízjel hozzáadása", "customColor": "Egyedi szövegszín", "selectText": { @@ -760,17 +1507,6 @@ "8": "Vízjel típusa:", "9": "Vízjel képe:", "10": "PDF konvertálása PDF-képpé" - }, - "submit": "Vízjel hozzáadása", - "type": { - "1": "Szöveg", - "2": "Kép" - }, - "watermarkType": { - "text": "Szöveg" - }, - "settings": { - "fontSize": "Betűméret" } }, "permissions": { @@ -795,50 +1531,201 @@ "removePages": { "tags": "Oldalak eltávolítása,oldalak törlése", "title": "Eltávolítás", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Eltávolítás" }, - "addPassword": { - "tags": "biztonság,védelem", - "title": "Jelszó hozzáadása", - "header": "Jelszó hozzáadása (Titkosítás)", - "selectText": { - "1": "Válassza ki a titkosítandó PDF-et", - "2": "Felhasználói jelszó", - "3": "Titkosítási kulcs hossza", - "4": "A magasabb értékek erősebbek, de az alacsonyabb értékek jobb kompatibilitást biztosítanak.", - "5": "Beállítandó jogosultságok (Tulajdonosi jelszóval ajánlott használni)", - "6": "Dokumentum egyesítésének megakadályozása", - "7": "Tartalom kinyerésének megakadályozása", - "8": "Akadálymentesítési célú kinyerés megakadályozása", - "9": "Űrlapkitöltés megakadályozása", - "10": "Módosítás megakadályozása", - "11": "Megjegyzések módosításának megakadályozása", - "12": "Nyomtatás megakadályozása", - "13": "Különböző formátumú nyomtatás megakadályozása", - "14": "Tulajdonos jelszó", - "15": "Korlátozza, hogy mi végezhető el a dokumentum megnyitása után (Nem minden olvasó támogatja)", - "16": "Korlátozza a dokumentum megnyithatságát" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Titkosítás", "tooltip": { - "permissions": { - "title": "Jogosultságok módosítása" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "biztonság,feloldás,védelem,jelszó törlése", - "title": "Jelszó eltávolítása", - "header": "Jelszó eltávolítása (Visszafejtés)", - "selectText": { - "1": "Válassza ki a visszafejtendő PDF-et", - "2": "Jelszó" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Eltávolítás", - "desc": "Jelszavas védelem eltávolítása a PDF dokumentumból", - "password": { - "stepTitle": "Jelszó eltávolítása", - "label": "Jelenlegi jelszó" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -848,12 +1735,142 @@ "tags": "eltávolítás,törlés,űrlap,mező,írásvédett", "title": "Írásvédettség eltávolítása az űrlapmezőkről", "header": "PDF űrlapok feloldása", - "submit": "Eltávolítás" + "submit": "Eltávolítás", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Cím,szerző,dátum,létrehozás,idő,kiadó,készítő,statisztika", - "title": "Cím:", "header": "Metaadatok módosítása", + "submit": "Módosítás", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Cím,szerző,dátum,létrehozás,idő,kiadó,készítő,statisztika", "selectText": { "1": "Módosítsa a kívánt mezőket", "2": "Minden metaadat törlése", @@ -861,15 +1878,7 @@ "4": "Egyéb metaadatok:", "5": "Egyéni metaadat hozzáadása" }, - "author": "Szerző:", - "creationDate": "Létrehozás dátuma (yyyy/MM/dd HH:mm:ss):", - "creator": "Létrehozó:", - "keywords": "Kulcsszavak:", - "modDate": "Módosítás dátuma (yyyy/MM/dd HH:mm:ss):", - "producer": "Készítő:", - "subject": "Tárgy:", - "trapped": "Beleértve:", - "submit": "Módosítás" + "modDate": "Módosítás dátuma (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "átalakítás,formátum,dokumentum,kép,prezentáció,szöveg,konvertálás,iroda,dokumentumok,word,excel,powerpoint", @@ -883,6 +1892,7 @@ "ocr": { "tags": "felismerés,szöveg,kép,szkennelés,olvasás,azonosítás,észlelés,szerkeszthető", "title": "OCR / Szkennelés tisztítása", + "desc": "Szkennelt dokumentumok tisztítása és szövegfelismerés képekből, majd visszaadása szerkeszthető szövegként", "header": "Szkennelés tisztítása / OCR (Optikai karakterfelismerés)", "selectText": { "1": "Válassza ki a PDF-ben felismerendő nyelveket (a felsoroltak jelenleg felismerhetők):", @@ -901,23 +1911,89 @@ "help": "Kérjük, olvassa el ezt a dokumentációt más nyelvek használatáról és/vagy nem Docker környezetben való használatról", "credit": "Ez a szolgáltatás a qpdf és Tesseract OCR használatával működik.", "submit": "PDF feldolgozása OCR-rel", - "desc": "Szkennelt dokumentumok tisztítása és szövegfelismerés képekből, majd visszaadása szerkeszthető szövegként", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Beállítások", "ocrMode": { - "label": "OCR mód" + "label": "OCR mód", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Nyelvek" + "label": "Nyelvek", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR mód" + "title": "OCR mód", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Nyelvek" + "title": "Nyelvek", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -926,7 +2002,13 @@ "header": "Képek kinyerése", "selectText": "Válassza ki a kinyert képek konvertálási formátumát", "allowDuplicates": "Ismétlődő képek mentése", - "submit": "Kinyerés" + "submit": "Kinyerés", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "archívum,hosszú távú,szabvány,konvertálás,tárolás,megőrzés", @@ -998,17 +2080,53 @@ }, "info": "Python nincs telepítve. A futtatáshoz szükséges." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "hitelesítés,rövidítés,rajzolt aláírás,szöveges aláírás,képes aláírás", "title": "Aláírás", "header": "PDF-ek aláírása", "upload": "Kép feltöltése", - "draw": "Aláírás rajzolása", - "text": "Szöveg bevitele", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Törlés", "add": "Hozzáadás", "saved": "Mentett aláírások", "save": "Aláírás mentése", + "applySignatures": "Apply Signatures", "personalSigs": "Személyes aláírások", "sharedSigs": "Megosztott aláírások", "noSavedSigs": "Nincsenek mentett aláírások", @@ -1020,42 +2138,179 @@ "previous": "Előző oldal", "maintainRatio": "Képarány fenntartása váltása", "undo": "Visszavonás", - "redo": "Újra" + "redo": "Újra", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "hitelesítés,rövidítés,rajzolt aláírás,szöveges aláírás,képes aláírás" }, "flatten": { - "tags": "statikus,deaktiválás,nem interaktív,egyszerűsítés", "title": "Lapítás", "header": "PDF-ek lapítása", "flattenOnlyForms": "Csak űrlapok lapítása", "submit": "Lapítás", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Beállítások" }, "options": { - "flattenOnlyForms": "Csak űrlapok lapítása" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Csak űrlapok lapítása", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statikus,deaktiválás,nem interaktív,egyszerűsítés" }, "repair": { "tags": "javítás,helyreállítás,korrekció,visszaállítás", "title": "Javítás", "header": "PDF-ek javítása", - "submit": "Javítás" + "submit": "Javítás", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "tisztítás,egyszerűsítés,tartalommentes,rendszerezés", "title": "Üres oldalak eltávolítása", "header": "Üres oldalak eltávolítása", - "threshold": "Pixel fehérség küszöbértéke:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Üres oldalak eltávolítása", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "tisztítás,egyszerűsítés,tartalommentes,rendszerezés", "thresholdDesc": "Küszöbérték annak meghatározásához, hogy egy fehér pixel mennyire legyen fehér. 0 = fekete, 255 = tiszta fehér.", - "whitePercent": "Fehér százalék (%):", - "whitePercentDesc": "Az oldal hány százalékának kell 'fehér' pixelnek lennie az eltávolításhoz", - "submit": "Üres oldalak eltávolítása" + "whitePercentDesc": "Az oldal hány százalékának kell 'fehér' pixelnek lennie az eltávolításhoz" }, "removeAnnotations": { "tags": "megjegyzések,kiemelés,jegyzetek,jelölések,eltávolítás", "title": "Megjegyzések eltávolítása", "header": "Megjegyzések eltávolítása", - "submit": "Eltávolítás" + "submit": "Eltávolítás", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "különbség,kontraszt,változások,elemzés", @@ -1087,6 +2342,142 @@ "certSign": { "tags": "hitelesítés,PEM,P12,hivatalos,titkosítás", "title": "Tanúsítvánnyal aláírás", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Hely", + "logoTitle": "Logo", + "name": "Név", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Adja meg a kulcstár vagy privát kulcs jelszavát (ha van):", + "passwordOptional": "Leave empty if no password", + "reason": "Ok", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Logó megjelenítése", "header": "PDF aláírása tanúsítvánnyal (fejlesztés alatt)", "selectPDF": "Válasszon aláírandó PDF fájlt:", "jksNote": "Megjegyzés: Ha a tanúsítványtípusa nem szerepel a listában, konvertálja Java Keystore (.jks) formátumba a keytool parancssorral. Ezután válassza a .jks fájl opciót.", @@ -1094,13 +2485,7 @@ "selectCert": "Válassza ki a tanúsítvány fájlt (X.509 formátum, .pem vagy .der):", "selectP12": "Válassza ki a PKCS#12 kulcstár fájlt (.p12 vagy .pfx) (Opcionális, ha megadja, tartalmaznia kell a privát kulcsot és tanúsítványt):", "selectJKS": "Válassza ki a Java Keystore fájlt (.jks vagy .keystore):", - "certType": "Tanúsítvány típusa", - "password": "Adja meg a kulcstár vagy privát kulcs jelszavát (ha van):", "showSig": "Aláírás megjelenítése", - "reason": "Ok", - "location": "Hely", - "name": "Név", - "showLogo": "Logó megjelenítése", "submit": "PDF aláírása" }, "removeCertSign": { @@ -1108,7 +2493,18 @@ "title": "Tanúsítványos aláírás eltávolítása", "header": "Digitális tanúsítvány eltávolítása a PDF-ből", "selectPDF": "PDF fájl kiválasztása:", - "submit": "Aláírás eltávolítása" + "submit": "Aláírás eltávolítása", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "egyesítés,kompozit,egyoldalas nézet,rendszerezés", @@ -1116,16 +2512,157 @@ "header": "Többoldalas elrendezés", "pagesPerSheet": "Oldalak laponként:", "addBorder": "Keret hozzáadása", - "submit": "Küldés" + "submit": "Küldés", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "átméretezés,módosítás,dimenzió,igazítás", "title": "Oldalméret beállítása", "header": "Oldalméret beállítása", "pageSize": "A dokumentum oldalmérete.", "keepPageSize": "Eredeti méret", "scaleFactor": "Oldal nagyítási szintje (vágás).", - "submit": "Küldés" + "submit": "Küldés", + "tags": "átméretezés,módosítás,dimenzió,igazítás" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "számozás,címke,rendszerezés,index" @@ -1134,16 +2671,83 @@ "tags": "automatikus felismerés,fejléc alapú,rendszerezés,újracímkézés", "title": "Automatikus átnevezés", "header": "PDF automatikus átnevezése", - "submit": "Automatikus átnevezés" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Automatikus átnevezés", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "színkorrekció,hangolás,módosítás,javítás" }, "crop": { - "tags": "vágás,kicsinyítés,szerkesztés,forma", "title": "Vágás", "header": "PDF vágása", - "submit": "Küldés" + "submit": "Küldés", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "vágás,kicsinyítés,szerkesztés,forma" }, "autoSplitPDF": { "tags": "QR-alapú,szétválasztás,szkennelt szekció,rendszerezés", @@ -1226,24 +2830,124 @@ "downloadJS": "JavaScript letöltése", "submit": "Megjelenítés" }, - "autoRedact": { - "tags": "Kitakarás,Elrejtés,fekete kitakarás,fekete,jelölő,rejtett", - "title": "Automatikus kitakarás", - "header": "Automatikus kitakarás", - "colorLabel": "Szín", - "textsToRedactLabel": "Kitakarandó szövegek (soronként)", - "textsToRedactPlaceholder": "például \\nBizalmas \\nSzigorúan titkos", - "useRegexLabel": "Reguláris kifejezés használata", - "wholeWordSearchLabel": "Teljes szó keresése", - "customPaddingLabel": "Egyedi extra kitöltés", - "convertPDFToImageLabel": "PDF konvertálása PDF-képpé (a doboz mögötti szöveg eltávolításához)", - "submitButton": "Küldés" - }, "redact": { "tags": "Kitakarás,Elrejtés,fekete kitakarás,fekete,jelölő,rejtett,kézi", "title": "Kézi kitakarás", - "header": "Kézi kitakarás", "submit": "Kitakarás", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Haladó" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Hozzáadás", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Oldal", + "placeholder": "(pl. 1,2,8 vagy 4,7,12-16 vagy 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Exportálás", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Kézi kitakarás", "textBasedRedaction": "Szöveg alapú kitakarás", "pageBasedRedaction": "Oldal alapú kitakarás", "convertPDFToImageLabel": "PDF konvertálása képpé (a doboz mögötti szöveg eltávolításához)", @@ -1269,22 +2973,7 @@ "showLayers": "Rétegek megjelenítése (dupla kattintás az összes réteg alaphelyzetbe állításához)", "colourPicker": "Színválasztó", "findCurrentOutlineItem": "Keresés a jelenlegi vázlatban", - "applyChanges": "Változtatások mentése", - "auto": { - "settings": { - "advancedTitle": "Haladó" - }, - "wordsToRedact": { - "add": "Hozzáadás" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Oldal", - "placeholder": "(pl. 1,2,8 vagy 4,7,12-16 vagy 2n-1)" - }, - "export": "Exportálás" - } + "applyChanges": "Változtatások mentése" }, "tableExtraxt": { "tags": "CSV,Táblázat kinyerése,kinyerés,konvertálás" @@ -1295,11 +2984,15 @@ "overlay-pdfs": { "tags": "Átfedés", "header": "PDF-ek egymásra helyezése", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Válassza ki az alap PDF fájlt" }, "overlayFiles": { - "label": "Válassza ki a ráhelyezendő PDF fájlokat" + "label": "Válassza ki a ráhelyezendő PDF fájlokat", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Válassza ki az egymásra helyezés módját", @@ -1309,14 +3002,53 @@ }, "counts": { "label": "Ismétlések száma (rögzített ismétlődő módhoz)", - "placeholder": "Adja meg a vesszővel elválasztott számokat (pl. 2,3,1)" + "placeholder": "Adja meg a vesszővel elválasztott számokat (pl. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Válassza ki az egymásra helyezés pozícióját", "foreground": "Előtér", "background": "Háttér" }, - "submit": "Küldés" + "submit": "Küldés", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Szakaszos felosztás,Felosztás,Testreszabás", @@ -1337,6 +3069,7 @@ "tags": "Pecsét,Kép hozzáadása,középre igazítás,Vízjel,PDF,Beágyazás,Testreszabás", "header": "PDF pecsételése", "title": "PDF pecsételése", + "stampSetup": "Stamp Setup", "stampType": "Pecsét típusa", "stampText": "Pecsét szövege", "stampImage": "Pecsét képe", @@ -1349,7 +3082,19 @@ "overrideY": "Y koordináta felülírása", "customMargin": "Egyedi margó", "customColor": "Egyedi szövegszín", - "submit": "Küldés" + "submit": "Küldés", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Képek eltávolítása,Oldalműveletek,Backend,szerver oldali" @@ -1367,7 +3112,8 @@ "status": { "_value": "Állapot", "valid": "Érvényes", - "invalid": "Érvénytelen" + "invalid": "Érvénytelen", + "complete": "Validation complete" }, "signer": "Aláíró", "date": "Dátum", @@ -1394,40 +3140,122 @@ "version": "Verzió", "keyUsage": "Kulcshasználat", "selfSigned": "Önaláírt", - "bits": "bit" + "bits": "bit", + "details": "Certificate Details" }, "signature": { "info": "Aláírás információ", "_value": "Aláírás", "mathValid": "Az aláírás matematikailag érvényes, DE:" }, - "selectCustomCert": "Egyéni X.509 tanúsítványfájl (Opcionális)" - }, - "replace-color": { - "title": "Színcsere-Invertálás", - "header": "PDF színek cseréje-invertálása", - "selectText": { - "1": "Színcsere vagy -invertálás beállításai", - "2": "Alapértelmezett (Alapértelmezett kontrasztos színek)", - "3": "Egyéni (Egyéni színek)", - "4": "Teljes invertálás (Minden szín invertálása)", - "5": "Magas kontrasztú színbeállítások", - "6": "fehér szöveg fekete háttéren", - "7": "fekete szöveg fehér háttéren", - "8": "sárga szöveg fekete háttéren", - "9": "zöld szöveg fekete háttéren", - "10": "Szövegszín kiválasztása", - "11": "Háttérszín kiválasztása" + "selectCustomCert": "Egyéni X.509 tanúsítványfájl (Opcionális)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Csere" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Színcsere,Oldalműveletek,Backend,szerver oldali" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Bejelentkezés", "header": "Bejelentkezés", "signin": "Bejelentkezés", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Emlékezzen rám", "invalid": "Érvénytelen felhasználónév vagy jelszó.", "locked": "A fiókja zárolva van.", @@ -1446,12 +3274,83 @@ "alreadyLoggedIn": "Már be van jelentkezve", "alreadyLoggedIn2": "eszközön. Kérjük, jelentkezzen ki az eszközökről és próbálja újra.", "toManySessions": "Túl sok aktív munkamenet", - "logoutMessage": "Sikeresen kijelentkezett." + "logoutMessage": "Sikeresen kijelentkezett.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF egyoldalassá alakítása", "header": "PDF egyoldalassá alakítása", - "submit": "Konvertálás egyoldalassá" + "submit": "Konvertálás egyoldalassá", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Oldalak kinyerése", @@ -1475,18 +3374,59 @@ "adjustContrast": { "title": "Kontraszt beállítása", "header": "Kontraszt beállítása", + "basic": "Basic Adjustments", "contrast": "Kontraszt:", "brightness": "Fényerő:", "saturation": "Telítettség:", - "download": "Letöltés" + "download": "Letöltés", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Tömörítés", + "desc": "Compress PDFs to reduce their file size.", "header": "PDF tömörítése", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Fájlméret" + }, "credit": "Ez a szolgáltatás a qpdf használatával végzi a PDF tömörítését/optimalizálását.", "grayscale": { "label": "Szürkeárnyalatok alkalmazása tömörítéshez" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Tömörítési beállítások", @@ -1496,10 +3436,7 @@ "4": "Automatikus mód - Automatikusan állítja a minőséget a megadott PDF méret eléréséhez", "5": "Kívánt PDF méret (pl. 25MB, 10.8MB, 25KB)" }, - "submit": "Tömörítés", - "method": { - "filesize": "Fájlméret" - } + "submit": "Tömörítés" }, "decrypt": { "passwordPrompt": "Ez a fájl jelszóval védett. Kérjük, adja meg a jelszót:", @@ -1600,7 +3537,13 @@ "title": "Kép eltávolítása", "header": "Kép eltávolítása", "removeImage": "Kép eltávolítása", - "submit": "Kép eltávolítása" + "submit": "Kép eltávolítása", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "PDF felosztása fejezetek szerint", @@ -1634,6 +3577,12 @@ }, "note": "A kiadási jegyzetek csak angol nyelven érhetők el" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "Hogy használjuk a sütiket", @@ -1669,54 +3618,943 @@ "title": "Adatelemzések", "description": "Ezek a sütik segítenek megérteni, hogyan használják eszközeinket, így a közösségünk által leginkább értékelt funkciókra összpontosíthatunk. Nyugodt lehet-a Stirling PDF nem képes és soha nem is fog nyomon követni az Ön által használt dokumentumok tartalmát." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Letöltés", - "undo": "Visszavonás", - "convert": { - "title": "Konvertálás", - "settings": "Beállítások", - "color": "Szín", - "greyscale": "Szürkeárnyalatos", - "fillPage": "Oldal kitöltése", - "pdfaDigitalSignatureWarning": "A PDF digitális aláírást tartalmaz. Ez a következő lépésben eltávolításra kerül.", - "grayscale": "Szürkeárnyalatos" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "beágyazás,csatolás,fájl,csatolmány,csatolmányok", - "title": "Mellékletek hozzáadása", - "header": "Mellékletek hozzáadása", - "submit": "Csatolmányok hozzáadása a PDF-hez" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Összes kijelölése", - "deselectAll": "Kijelölés megszüntetése" + "deselectAll": "Kijelölés megszüntetése", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Aláírás" + "read": "Read", + "sign": "Aláírás", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Betöltés...", - "or": "vagy" + "or": "vagy", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Név", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Verzió", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Összes kijelölése", "deselectAll": "Kijelölés megszüntetése", "deleteSelected": "Kijelöltek törlése", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Letöltés", - "delete": "Törlés" + "delete": "Törlés", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDF tisztítása", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Beállítások" + "files": "Files", + "settings": "Beállítások", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Jelszó hozzáadása", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Titkosítás", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Jogosultságok módosítása", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "biztonság,védelem", + "header": "Jelszó hozzáadása (Titkosítás)", + "selectText": { + "1": "Válassza ki a titkosítandó PDF-et", + "2": "Felhasználói jelszó", + "3": "Titkosítási kulcs hossza", + "4": "A magasabb értékek erősebbek, de az alacsonyabb értékek jobb kompatibilitást biztosítanak.", + "5": "Beállítandó jogosultságok (Tulajdonosi jelszóval ajánlott használni)", + "6": "Dokumentum egyesítésének megakadályozása", + "7": "Tartalom kinyerésének megakadályozása", + "8": "Akadálymentesítési célú kinyerés megakadályozása", + "9": "Űrlapkitöltés megakadályozása", + "10": "Módosítás megakadályozása", + "11": "Megjegyzések módosításának megakadályozása", + "12": "Nyomtatás megakadályozása", + "13": "Különböző formátumú nyomtatás megakadályozása", + "14": "Tulajdonos jelszó", + "15": "Korlátozza, hogy mi végezhető el a dokumentum megnyitása után (Nem minden olvasó támogatja)", + "16": "Korlátozza a dokumentum megnyithatságát" } }, "changePermissions": { "title": "Jogosultságok módosítása", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Jogosultságok módosítása", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Dokumentum egyesítésének megakadályozása" @@ -1743,10 +4581,784 @@ "label": "Különböző formátumú nyomtatás megakadályozása" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Jogosultságok módosítása" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Jelszó eltávolítása", + "desc": "Jelszavas védelem eltávolítása a PDF dokumentumból", + "tags": "biztonság,feloldás,védelem,jelszó törlése", + "password": { + "stepTitle": "Jelszó eltávolítása", + "label": "Jelenlegi jelszó", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Eltávolítás", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Jelszó eltávolítása (Visszafejtés)", + "selectText": { + "1": "Válassza ki a visszafejtendő PDF-et", + "2": "Jelszó" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Színcsere vagy -invertálás beállításai", + "2": "Alapértelmezett (Alapértelmezett kontrasztos színek)", + "3": "Egyéni (Egyéni színek)", + "4": "Teljes invertálás (Minden szín invertálása)", + "5": "Magas kontrasztú színbeállítások", + "6": "fehér szöveg fekete háttéren", + "7": "fekete szöveg fehér háttéren", + "8": "sárga szöveg fekete háttéren", + "9": "zöld szöveg fekete háttéren", + "10": "Szövegszín kiválasztása", + "11": "Háttérszín kiválasztása", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Csere", + "title": "Színcsere-Invertálás", + "header": "PDF színek cseréje-invertálása" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Kitakarás,Elrejtés,fekete kitakarás,fekete,jelölő,rejtett", + "title": "Automatikus kitakarás", + "header": "Automatikus kitakarás", + "colorLabel": "Szín", + "textsToRedactLabel": "Kitakarandó szövegek (soronként)", + "textsToRedactPlaceholder": "például \\nBizalmas \\nSzigorúan titkos", + "useRegexLabel": "Reguláris kifejezés használata", + "wholeWordSearchLabel": "Teljes szó keresése", + "customPaddingLabel": "Egyedi extra kitöltés", + "convertPDFToImageLabel": "PDF konvertálása PDF-képpé (a doboz mögötti szöveg eltávolításához)", + "submitButton": "Küldés" + }, + "replaceColorPdf": { + "tags": "Színcsere,Oldalműveletek,Backend,szerver oldali" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/id-ID/translation.json b/frontend/public/locales/id-ID/translation.json index 00b097277..6f96a8ad3 100644 --- a/frontend/public/locales/id-ID/translation.json +++ b/frontend/public/locales/id-ID/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Teks Khusus", "numberPagesDesc": "Halaman mana yang akan diberi nomor, default 'semua', juga menerima 1-5 atau 2,5,9, dll.", "customNumberDesc": "Default untuk {n}, juga menerima 'Halaman {n} dari {total}', 'Teks-{n}', '{nama berkas}-{n}'", - "submit": "Tambahkan Nomor Halaman" + "submit": "Tambahkan Nomor Halaman", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Pemilihan Halaman Kustom (Masukkan daftar nomor halaman dipisahkan dengan koma 1,5,6 atau Fungsi seperti 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Pilih PDF", "multiPdfPrompt": "Pilih PDF (2+)", "multiPdfDropPrompt": "Pilih (atau seret & letakkan)) semua PDF yang Anda butuhkan", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Peringatan: Proses ini dapat memakan waktu hingga satu menit, tergantung pada ukuran berkas", "pageOrderPrompt": "Urutan Halaman Khusus (Masukkan daftar nomor halaman yang dipisahkan dengan koma atau Fungsi seperti 2n + 1) :", - "pageSelectionPrompt": "Pemilihan Halaman Kustom (Masukkan daftar nomor halaman dipisahkan dengan koma 1,5,6 atau Fungsi seperti 2n+1) :", "goToPage": "Ke", "true": "Benar", "false": "Salah", "unknown": "Tidak diketahui", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Simpan", "saveToBrowser": "Simpan ke Peramban", + "download": "Unduh", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Tutup", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "berkas dipilih", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Tidak ada favorit yang ditambahkan", "downloadComplete": "Unduhan Lengkap", "bored": "Bosan Menunggu?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "Dokumen PDF disandikan dan kata sandi tidak diberikan atau kata sandi salah", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Kesalahan", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Maaf atas masalah ini!", "needHelp": "Butuh bantuan / Menemukan masalah?", "contactTip": "Jika Anda masih mengalami kesulitan, jangan ragu untuk menghubungi kami untuk bantuan. Anda dapat mengirim tiket di halaman GitHub kami atau menghubungi kami melalui Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Kirim tiket", "discordSubmit": "Discord - Kirim pos dukungan" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Hapus", "username": "Nama pengguna", "password": "Kata sandi", @@ -82,6 +169,7 @@ "green": "Hijau", "blue": "Biru", "custom": "Kustom...", + "comingSoon": "Coming soon", "WorkInProgess": "Pekerjaan sedang diproses, Mungkin tidak berfungsi atau terdapat kutu, Silakan laporkan masalah apa pun!", "poweredBy": "Ditenagai oleh", "yes": "Ya", @@ -115,12 +203,14 @@ "page": "Halaman", "pages": "Halaman-halaman", "loading": "Mengambil data...", + "review": "Review", "addToDoc": "Tambahkan ke Dokumen", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Kebijakan Privasi", + "iAgreeToThe": "I agree to all of the", "terms": "Syarat dan Ketentuan", "accessibility": "Aksesibilitas", "cookie": "Kebijakan Kuki", @@ -160,6 +250,7 @@ "title": "Apakah Anda ingin membuat Stirling PDF lebih baik?", "paragraph1": "Stirling PDF memiliki analitik yang dapat diaktifkan untuk membantu kami meningkatkan produk. Kami tidak melacak informasi pribadi atau konten berkas.", "paragraph2": "Silakan pertimbangkan untuk mengaktifkan analitik agar Stirling PDF dapat berkembang dan untuk memungkinkan kami memahami pengguna kami dengan lebih baik.", + "learnMore": "Learn more", "enable": "Aktifkan analitik", "disable": "Nonaktifkan analitik", "settings": "Anda dapat mengubah pengaturan untuk analitik di berkas config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Simpan input formulir", "help": "Aktifkan untuk menyimpan input yang pernah digunakan untuk menjalankan di masa depan" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Impor/Ekspor Database", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Alat Multi PDF", "desc": "Menggabungkan, Memutar, Mengatur Ulang, dan Menghapus halaman" }, "merge": { + "tags": "combine,join,unite", "title": "Menggabungkan", "desc": "Gabungkan beberapa PDF dengan mudah menjadi satu." }, "split": { + "tags": "divide,separate,break", "title": "Membagi", "desc": "Membagi PDF menjadi beberapa dokumen" }, "rotate": { + "tags": "turn,flip,orient", "title": "Putar", "desc": "Memutar PDF Anda dengan mudah." }, + "convert": { + "tags": "transform,change", + "title": "Konversi", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Mengatur", + "desc": "Menghapus/Mengatur ulang halaman dalam urutan apa pun" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Tambahkan gambar", + "desc": "Menambahkan gambar ke lokasi yang ditentukan pada PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Tambahkan watermark", + "desc": "Menambahkan watermark khusus ke dokumen PDF Anda." + }, + "removePassword": { + "tags": "unlock", + "title": "Hapus Kata Sandi", + "desc": "Menghapus perlindungan kata sandi dari dokumen PDF Anda." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Kompres", + "desc": "Kompres PDF untuk mengurangi ukuran berkas." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Ubah Metadata", + "desc": "Mengubah/Menghapus/Menambahkan metadata dari dokumen PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "Pemindaian/Pembersihan OCR", + "desc": "Memindai dan mendeteksi teks dari gambar di dalam PDF dan menambahkannya kembali sebagai teks." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Ekstrak Gambar", + "desc": "Mengekstrak semua gambar dari PDF dan menyimpannya ke zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Tanda Tangan", + "desc": "Menambahkan tanda tangan ke PDF dengan gambar, teks, atau gambar" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Meratakan", + "desc": "Menghapus semua elemen dan formulir interaktif dari PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Tanda tangani dengan Sertifikat", + "desc": "Menandatangani PDF dengan Certificate/Key (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Perbaikan", + "desc": "Melakukan perbaikan PDF yang rusak/rusak" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Menghapus halaman kosong", + "desc": "Mendeteksi dan menghapus halaman kosong dari dokumen" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Menghapus Anotasi", + "desc": "Menghapus semua komentar/anotasi dari PDF" + }, + "compare": { + "tags": "difference", + "title": "Bandingkan", + "desc": "Membandingkan dan menunjukkan perbedaan antara 2 Dokumen PDF" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Hapus Tanda Tangan Sertifikat", + "desc": "Hapus tanda tangan sertifikat dari PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Tata Letak Multi-Halaman", + "desc": "Menggabungkan beberapa halaman dokumen PDF menjadi satu halaman" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Menyesuaikan ukuran/skala halaman", + "desc": "Mengubah ukuran/skala halaman dan/atau isinya." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Tambahkan Nomor Halaman", + "desc": "Menambahkan nomor Halaman di seluruh dokumen di lokasi yang ditetapkan" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Menyesuaikan Warna/Kontras", + "desc": "Sesuaikan Kontras, Saturasi, dan Kecerahan PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Pangkas PDF", + "desc": "Pangkas PDF untuk memperkecil ukurannya (mempertahankan teks!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Membagi Halaman Secara Otomatis", + "desc": "Membagi PDF yang dipindai secara otomatis dengan Kode QR pembagi halaman yang dipindai secara fisik" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Dapatkan Semua Info tentang PDF", + "desc": "Mengambil setiap dan semua informasi yang mungkin ada pada PDF" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF ke Satu Halaman Besar", + "desc": "Menggabungkan semua halaman PDF menjadi satu halaman besar" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Tampilkan Javascript", + "desc": "Mencari dan menampilkan JS apa pun yang disuntikkan ke dalam PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Hapus Gambar", + "desc": "Hapus gambar dari PDF untuk mengurangi ukuran file" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Pisahkan PDF berdasarkan Bab", + "desc": "Memisahkan PDF menjadi beberapa file berdasarkan struktur babnya." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Ekstrak Halaman", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Menghapus", + "desc": "Menghapus halaman yang tidak diinginkan dari dokumen PDF Anda." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Pemisahan Otomatis berdasarkan Ukuran/Hitungan", + "desc": "Membagi satu PDF menjadi beberapa dokumen berdasarkan ukuran, jumlah halaman, atau jumlah dokumen" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Tambahkan Kata Sandi", + "desc": "Enkripsi dokumen PDF Anda dengan kata sandi." + }, + "changePermissions": { + "title": "Ganti Perizinan", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Menumpuk PDF di atas PDF lain", + "title": "Tumpuk PDF" + }, "imageToPDF": { "title": "Gambar ke PDF", "desc": "Mengonversi gambar (PNG, JPEG, GIF) ke PDF." @@ -355,18 +786,6 @@ "title": "PDF ke Gambar", "desc": "Mengonversi PDF ke gambar. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Mengatur", - "desc": "Menghapus/Mengatur ulang halaman dalam urutan apa pun" - }, - "addImage": { - "title": "Tambahkan gambar", - "desc": "Menambahkan gambar ke lokasi yang ditentukan pada PDF" - }, - "watermark": { - "title": "Tambahkan watermark", - "desc": "Menambahkan watermark khusus ke dokumen PDF Anda." - }, "permissions": { "title": "Izin Perubahan", "desc": "Mengubah izin dokumen PDF Anda" @@ -375,38 +794,10 @@ "title": "Menghapus", "desc": "Menghapus halaman yang tidak diinginkan dari dokumen PDF Anda." }, - "addPassword": { - "title": "Tambahkan Kata Sandi", - "desc": "Enkripsi dokumen PDF Anda dengan kata sandi." - }, - "removePassword": { - "title": "Hapus Kata Sandi", - "desc": "Menghapus perlindungan kata sandi dari dokumen PDF Anda." - }, - "compress": { - "title": "Kompres", - "desc": "Kompres PDF untuk mengurangi ukuran berkas." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Ubah Metadata", - "desc": "Mengubah/Menghapus/Menambahkan metadata dari dokumen PDF" - }, "fileToPDF": { "title": "Mengonversi berkas ke PDF", "desc": "Mengonversi hampir semua berkas ke PDF (DOCX, PNG, XLS, PPT, TXT dan lain-lain)" }, - "ocr": { - "title": "Pemindaian/Pembersihan OCR", - "desc": "Memindai dan mendeteksi teks dari gambar di dalam PDF dan menambahkannya kembali sebagai teks." - }, - "extractImages": { - "title": "Ekstrak Gambar", - "desc": "Mengekstrak semua gambar dari PDF dan menyimpannya ke zip" - }, "pdfToPDFA": { "title": "PDF ke PDF/A", "desc": "Konversi PDF ke PDF/A untuk penyimpanan jangka panjang" @@ -435,70 +826,14 @@ "title": "Mendeteksi/Memisahkan foto yang dipindai", "desc": "Memisahkan beberapa foto dari dalam sebuah foto/PDF" }, - "sign": { - "title": "Tanda Tangan", - "desc": "Menambahkan tanda tangan ke PDF dengan gambar, teks, atau gambar" - }, - "flatten": { - "title": "Meratakan", - "desc": "Menghapus semua elemen dan formulir interaktif dari PDF" - }, - "repair": { - "title": "Perbaikan", - "desc": "Melakukan perbaikan PDF yang rusak/rusak" - }, - "removeBlanks": { - "title": "Menghapus halaman kosong", - "desc": "Mendeteksi dan menghapus halaman kosong dari dokumen" - }, - "removeAnnotations": { - "title": "Menghapus Anotasi", - "desc": "Menghapus semua komentar/anotasi dari PDF" - }, - "compare": { - "title": "Bandingkan", - "desc": "Membandingkan dan menunjukkan perbedaan antara 2 Dokumen PDF" - }, - "certSign": { - "title": "Tanda tangani dengan Sertifikat", - "desc": "Menandatangani PDF dengan Certificate/Key (PEM/P12)" - }, - "removeCertSign": { - "title": "Hapus Tanda Tangan Sertifikat", - "desc": "Hapus tanda tangan sertifikat dari PDF" - }, - "pageLayout": { - "title": "Tata Letak Multi-Halaman", - "desc": "Menggabungkan beberapa halaman dokumen PDF menjadi satu halaman" - }, - "scalePages": { - "title": "Menyesuaikan ukuran/skala halaman", - "desc": "Mengubah ukuran/skala halaman dan/atau isinya." - }, "pipeline": { "title": "Pipeline", "desc": "Menjalankan beberapa tindakan pada PDF dengan mendefinisikan skrip pipeline" }, - "addPageNumbers": { - "title": "Tambahkan Nomor Halaman", - "desc": "Menambahkan nomor Halaman di seluruh dokumen di lokasi yang ditetapkan" - }, "auto-rename": { "title": "Ubah Nama Berkas PDF Secara Otomatis", "desc": "Mengganti nama berkas PDF secara otomatis berdasarkan tajuk yang terdeteksi" }, - "adjustContrast": { - "title": "Menyesuaikan Warna/Kontras", - "desc": "Sesuaikan Kontras, Saturasi, dan Kecerahan PDF" - }, - "crop": { - "title": "Pangkas PDF", - "desc": "Pangkas PDF untuk memperkecil ukurannya (mempertahankan teks!)" - }, - "autoSplitPDF": { - "title": "Membagi Halaman Secara Otomatis", - "desc": "Membagi PDF yang dipindai secara otomatis dengan Kode QR pembagi halaman yang dipindai secara fisik" - }, "sanitizePDF": { "title": "Sanitasi", "desc": "Menghapus skrip dan elemen lain dari file PDF" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Dapatkan Semua Info tentang PDF", - "desc": "Mengambil setiap dan semua informasi yang mungkin ada pada PDF" - }, "pageExtracter": { "title": "Ekstrak halaman", "desc": "Mengekstrak halaman tertentu dari PDF" }, - "pdfToSinglePage": { - "title": "PDF ke Satu Halaman Besar", - "desc": "Menggabungkan semua halaman PDF menjadi satu halaman besar" - }, - "showJS": { - "title": "Tampilkan Javascript", - "desc": "Mencari dan menampilkan JS apa pun yang disuntikkan ke dalam PDF" - }, "autoRedact": { "title": "Redaksional Otomatis", "desc": "Menyunting Otomatis (Menghitamkan) teks dalam PDF berdasarkan teks masukan" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF ke CSV", "desc": "Mengekstrak Tabel dari PDF yang mengonversinya menjadi CSV" @@ -551,10 +870,6 @@ "title": "Pemisahan Otomatis berdasarkan Ukuran/Hitungan", "desc": "Membagi satu PDF menjadi beberapa dokumen berdasarkan ukuran, jumlah halaman, atau jumlah dokumen" }, - "overlay-pdfs": { - "title": "Tumpuk PDF", - "desc": "Menumpuk PDF di atas PDF lain" - }, "split-by-sections": { "title": "Membagi PDF berdasarkan Bagian", "desc": "Membagi setiap halaman PDF menjadi beberapa bagian horizontal dan vertikal yang lebih kecil" @@ -563,43 +878,17 @@ "title": "Tambahkan Tanda Tangan ke PDF", "desc": "Tambahkan teks atau gambar tanda tangan di lokasi yang ditentukan" }, - "removeImage": { - "title": "Hapus Gambar", - "desc": "Hapus gambar dari PDF untuk mengurangi ukuran file" - }, - "splitByChapters": { - "title": "Pisahkan PDF berdasarkan Bab", - "desc": "Memisahkan PDF menjadi beberapa file berdasarkan struktur babnya." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Ganti dan Inversi Warna", "desc": "Ganti warna untuk teks dan latar belakang dalam PDF dan inversi seluruh warna PDF untuk mengurangi ukuran file" }, - "convert": { - "title": "Konversi" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Ekstrak Halaman" - }, - "removePages": { - "title": "Menghapus", - "desc": "Menghapus halaman yang tidak diinginkan dari dokumen PDF Anda." - }, "removeImagePdf": { "title": "Hapus Gambar", "desc": "Hapus gambar dari PDF untuk mengurangi ukuran file" }, - "autoSizeSplitPDF": { - "title": "Pemisahan Otomatis berdasarkan Ukuran/Hitungan", - "desc": "Membagi satu PDF menjadi beberapa dokumen berdasarkan ukuran, jumlah halaman, atau jumlah dokumen" - }, "adjust-contrast": { "title": "Menyesuaikan Warna/Kontras", "desc": "Sesuaikan Kontras, Saturasi, dan Kecerahan PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Ganti dan Inversi Warna", "desc": "Ganti warna untuk teks dan latar belakang dalam PDF dan inversi seluruh warna PDF untuk mengurangi ukuran file" - }, - "changePermissions": { - "title": "Ganti Perizinan" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "melihat,membaca,membuat anotasi,teks,gambar", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "menggabungkan,Pengoperasian halaman,Back end,sisi server", "title": "Gabungkan", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Gabungkan", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Nama Berkas", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Gabungkan beberapa PDFs (2+)", "sortByName": "Sortir berdasarkan nama", "sortByDate": "Sortir berdasrkan tanggal", - "removeCertSign": "Hapus tanda tangan digital dalam file yang dicampur?", - "submit": "Gabungkan", - "sortBy": { - "filename": "Nama Berkas" - } + "removeCertSign": "Hapus tanda tangan digital dalam file yang dicampur?" }, "split": { - "tags": "Pengoperasian halaman,membagi,Multi Halaman,memotong,sisi server", "title": "Membagi PDF", "header": "Membagi PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Masukkan halaman yang akan dipisah:", "submit": "Pisahkan", "steps": { + "chooseMethod": "Choose Method", "settings": "Pengaturan" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Ukuran Berkas" + "name": "Ukuran Berkas", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Ukuran Berkas" + "label": "Ukuran Berkas", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Pengoperasian halaman,membagi,Multi Halaman,memotong,sisi server" }, "rotate": { - "tags": "sisi server", "title": "Rotasi PDF", + "submit": "Rotasi", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "sisi server", "header": "Rotasi PDF", - "selectAngle": "Pilih sudut rotasi (dalam kelipatan 90 derajat):", - "submit": "Rotasi" + "selectAngle": "Pilih sudut rotasi (dalam kelipatan 90 derajat):" + }, + "convert": { + "title": "Konversi", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Pengaturan", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Warna", + "greyscale": "Skala abu-abu", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Isi Halaman", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF ini mengandung tanda tangan digital. Ini akan dihapus pada langkah berikutnya.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Skala abu-abu", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konversi,img,jpg,gambar,foto" @@ -727,7 +1263,33 @@ "8": "Hapus Terakhir", "9": "Hapus Pertama dan Terakhir", "10": "Penggabungan Genap-Ganjil", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(misalnya 1,3,2 atau 4-8,2,10-12 atau 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Tambahkan Gambar", "submit": "Tambahkan Gambar" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Teks,berulang,label,sendiri,hak cipta,watermark,img,jpg,picture,photo", "title": "Tambahkan Watermark", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Tambahkan Watermark", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Teks", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Ukuran Fonta", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Teks", + "2": "Gambar" + }, + "tags": "Teks,berulang,label,sendiri,hak cipta,watermark,img,jpg,picture,photo", "header": "Tambahkan Watermark", "customColor": "Warna Teks Kustom", "selectText": { @@ -755,17 +1506,6 @@ "8": "Tipe Watermark:", "9": "Gambar Watermark:", "10": "Konversi PDF ke PDF-Image" - }, - "submit": "Tambahkan Watermark", - "type": { - "1": "Teks", - "2": "Gambar" - }, - "watermarkType": { - "text": "Teks" - }, - "settings": { - "fontSize": "Ukuran Fonta" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Menghapus halaman,menghapus halaman", "title": "Menghapus", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Menghapus" }, - "addPassword": { - "tags": "aman,Keamanan", - "title": "Tambahkan kata sandi", - "header": "Tambahkan kata sandi (Enkrip)", - "selectText": { - "1": "Pilih PDF untuk enkripsi", - "2": "Kata sandi Pengguna", - "3": "Panjang kunci enkripsi", - "4": "Nilai yang lebih tinggi lebih kuat, tetapi nilai yang lebih rendah memiliki kompatibilitas yang lebih baik.", - "5": "Perizinan untuk diubah (Disarankan untuk digunakan bersama dengan kata sandi Pemilik)", - "6": "Pencegahan untuk penyusunan dokumen", - "7": "Pencegahan untuk ekstraksi konten", - "8": "Pencegahan ekstraksi untuk aksesibilitas", - "9": "Pencegahan untuk mengisi formulir", - "10": "Pencegahan untuk pengubahan", - "11": "Pencegahan untuk perubahan anotasi", - "12": "Pencegahan untuk mencetak", - "13": "Pencegahan untuk mencetak format yang berbeda", - "14": "Kata sandi Pemilik", - "15": "Membatasi apa yang dapat dilakukan dengan dokumen setelah dibuka (Tidak didukung oleh semua pembaca)", - "16": "Membatasi pembukaan dokumen itu sendiri" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Enkripsi", "tooltip": { - "permissions": { - "title": "Ganti Perizinan" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "aman,Dekripsi,keamanan,buka kata sandi,hapus kata sandi", - "title": "Hapus kata sandi", - "header": "Hapus kata sandi (Dekrip)", - "selectText": { - "1": "Pilih PDF yang akan di Dekrip", - "2": "Kata Sandi" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Hapus", - "desc": "Menghapus perlindungan kata sandi dari dokumen PDF Anda.", - "password": { - "stepTitle": "Hapus Kata Sandi", - "label": "Kata Sandi Saat Ini" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Judul,penulis,tanggal,pembuatan,waktu,penerbit,produser,statistik", - "title": "Judul:", "header": "Ganti Metadata", + "submit": "Ganti", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Judul,penulis,tanggal,pembuatan,waktu,penerbit,produser,statistik", "selectText": { "1": "Silakan edit variabel yang ingin Anda ubah", "2": "Hapus semua metadata", @@ -856,15 +1877,7 @@ "4": "Metadata Lain-lain:", "5": "Tambahkan Metadata Khusus" }, - "author": "Penulis:", - "creationDate": "Tanggal Dibuat (yyyy/MM/dd HH:mm:ss):", - "creator": "Pencipta:", - "keywords": "Kata kunci:", - "modDate": "Tangal Diperbarui (yyyy/MM/dd HH:mm:ss):", - "producer": "Produser:", - "subject": "Subjek:", - "trapped": "Terperangkap:", - "submit": "Ganti" + "modDate": "Tangal Diperbarui (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformasi,format,dokumen,gambar,slide,text,konversi,office,docs,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "rekognisi,teks,gambar,pindai,baca,identifikasi,deteksi,dapat diedit", "title": "OCR / Pembersihan Pindaian", + "desc": "Memindai dan mendeteksi teks dari gambar di dalam PDF dan menambahkannya kembali sebagai teks.", "header": "Pemindaian Pembersihan / OCR (Pengenalan Karakter Optik)", "selectText": { "1": "Pilih bahasa yang akan dideteksi di dalam PDF (Bahasa yang terdaftar adalah bahasa yang saat ini terdeteksi):", @@ -896,23 +1910,89 @@ "help": "Silakan baca dokumentasi ini tentang cara menggunakan ini untuk bahasa lain dan/atau penggunaan yang tidak ada di docker", "credit": "Layanan ini menggunakan qpdf dan Tesseract untuk OCR.", "submit": "Memproses PDF dengan OCR", - "desc": "Memindai dan mendeteksi teks dari gambar di dalam PDF dan menambahkannya kembali sebagai teks.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Pengaturan", "ocrMode": { - "label": "Mode OCR" + "label": "Mode OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Bahasa" + "label": "Bahasa", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Mode OCR" + "title": "Mode OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Bahasa" + "title": "Bahasa", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Mengekstrak Gambar", "selectText": "Pilih format gambar yang akan dikonversi", "allowDuplicates": "Simpan Gambar Duplikat", - "submit": "Ekstrak" + "submit": "Ekstrak", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arsip, jangka panjang, standar, konversi, penyimpanan, pelestarian", @@ -993,17 +2079,53 @@ }, "info": "Python tidak terinstal. Ini diperlukan untuk menjalankan." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "mengesahkan, inisial, tanda tangan yang digambar, tanda tangan teks, tanda tangan gambar", "title": "Tanda", "header": "Tandatangani PDF", "upload": "Unggah Gambar", - "draw": "Gambar Tanda Tangan", - "text": "Masukan Teks", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Hapus", "add": "Tambah", "saved": "Tanda Tangan Disimpan", "save": "Simpan Tanda Tangan", + "applySignatures": "Apply Signatures", "personalSigs": "Tanda Tangan Pribadi", "sharedSigs": "Tanda Tangan Berbagi", "noSavedSigs": "Tidak ditemukan tanda tangan yang disimpan", @@ -1015,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "mengesahkan, inisial, tanda tangan yang digambar, tanda tangan teks, tanda tangan gambar" }, "flatten": { - "tags": "statis, nonaktif, non-interaktif, ramping", "title": "Ratakan", "header": "Ratakan PDF", "flattenOnlyForms": "Ratakan hanya formulir", "submit": "Ratakan", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Pengaturan" }, "options": { - "flattenOnlyForms": "Ratakan hanya formulir" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Ratakan hanya formulir", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statis, nonaktif, non-interaktif, ramping" }, "repair": { "tags": "perbaiki, pulihkan, koreksi, pulihkan", "title": "Perbaiki", "header": "Perbaiki PDF", - "submit": "Perbaiki" + "submit": "Perbaiki", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "membersihkan, merampingkan, non-konten, mengatur", "title": "Hapus yang Kosong", "header": "Hapus Halaman Kosong", - "threshold": "Ambang Batas Keputihan Piksel:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Hapus Kosong", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "membersihkan, merampingkan, non-konten, mengatur", "thresholdDesc": "Ambang batas untuk menentukan seberapa putih piksel putih yang harus diklasifikasikan sebagai 'Putih'. 0=Hitam, 255 putih murni.", - "whitePercent": "Persen Putih (%):", - "whitePercentDesc": "Persentase halaman yang harus berupa piksel 'putih' yang akan dihapus", - "submit": "Hapus Kosong" + "whitePercentDesc": "Persentase halaman yang harus berupa piksel 'putih' yang akan dihapus" }, "removeAnnotations": { "tags": "komentar, sorot, catatan, markup, hapus", "title": "Hapus Anotasi", "header": "Hapus Anotasi", - "submit": "Hapus" + "submit": "Hapus", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "membedakan, kontras, perubahan, analisis", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "mengotentikasi, PEM, P12, resmi, mengenkripsi", "title": "Penandatanganan Sertifikat", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Lokasi", + "logoTitle": "Logo", + "name": "Nama", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Masukkan Kata Sandi Kunci atau Kunci Pribadi Anda (Jika Ada):", + "passwordOptional": "Leave empty if no password", + "reason": "Alasan", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Tampilkan Logo", "header": "Menandatangani PDF dengan sertifikat Anda (Sedang dalam proses)", "selectPDF": "Pilih Berkas PDF untuk Penandatanganan:", "jksNote": "Catatan: Jika tipe sertifikat Anda tidak terdaftar di bawah, silakan konversi ke file Java Keystore (.jks) menggunakan alat baris perintah keytool. Kemudian, pilih opsi file .jks di bawah.", @@ -1089,13 +2484,7 @@ "selectCert": "Pilih Berkas Sertifikat Anda (format X.509, bisa .pem atau .der):", "selectP12": "Pilih Berkas Keystore PKCS #12 Anda (.p12 atau .pfx) (Opsional, Jika disediakan, berkas tersebut harus berisi kunci pribadi dan sertifikat Anda):", "selectJKS": "Pilih Berkas Java Keystore File (.jks atau .keystore):", - "certType": "Jenis Sertifikat", - "password": "Masukkan Kata Sandi Kunci atau Kunci Pribadi Anda (Jika Ada):", "showSig": "Tampilkan Tanda Tangan", - "reason": "Alasan", - "location": "Lokasi", - "name": "Nama", - "showLogo": "Tampilkan Logo", "submit": "Tanda tangani PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Hapus Tanda Tangan Sertifikat", "header": "Hapus sertifikat digital dari PDF", "selectPDF": "Pilih file PDF:", - "submit": "Hapus Tanda Tangan" + "submit": "Hapus Tanda Tangan", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "menggabungkan, komposit, tampilan tunggal, mengatur", @@ -1111,16 +2511,157 @@ "header": "Tata Letak Multi Halaman", "pagesPerSheet": "Halaman per lembar:", "addBorder": "Menambahkan Batas", - "submit": "Kirim" + "submit": "Kirim", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "mengubah ukuran, memodifikasi, dimensi, mengadaptasi", "title": "Sesuaikan skala halaman", "header": "Sesuaikan skala halaman", "pageSize": "Ukuran halaman dokumen.", "keepPageSize": "Ukuran Asli", "scaleFactor": "Tingkat zoom (potong) halaman.", - "submit": "Kirim" + "submit": "Kirim", + "tags": "mengubah ukuran, memodifikasi, dimensi, mengadaptasi" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "beri halaman, beri label, atur, indeks" @@ -1129,16 +2670,83 @@ "tags": "deteksi otomatis, berbasis tajuk, atur, beri label ulang", "title": "Ganti Nama Otomatis", "header": "Ganti Nama PDF Otomatis", - "submit": "Ganti Nama Otomatis" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Ganti Nama Otomatis", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "koreksi warna, menyetel, memodifikasi, meningkatkan" }, "crop": { - "tags": "memangkas, mengecilkan, mengedit, membentuk", "title": "Pangkas", "header": "Pangkas PDF", - "submit": "Kirim" + "submit": "Kirim", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "memangkas, mengecilkan, mengedit, membentuk" }, "autoSplitPDF": { "tags": "Berbasis QR, pisahkan, pindai segmen, atur", @@ -1221,24 +2829,124 @@ "downloadJS": "Unduh Javascript", "submit": "Tampilkan" }, - "autoRedact": { - "tags": "Hapus, Sembunyikan, padamkan, hitam, hitam, penanda, tersembunyi", - "title": "Redaksional Otomatis", - "header": "Redaksional Otomatis", - "colorLabel": "Warna", - "textsToRedactLabel": "Teks untuk Disunting (dipisahkan baris)", - "textsToRedactPlaceholder": "misalnya \\nRahasia \\nRahasia Tertinggi", - "useRegexLabel": "Gunakan Regex", - "wholeWordSearchLabel": "Pencarian Seluruh Kata", - "customPaddingLabel": "Padding Ekstra Kustom", - "convertPDFToImageLabel": "Konversi PDF ke PDF-Gambar (Digunakan untuk menghapus teks di belakang kotak)", - "submitButton": "Kirim" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Langkah Lanjut" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Tambah", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Halaman-halaman", + "placeholder": "(misalnya 1,2,8 atau 4,7,12-16 atau 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1264,21 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Langkah Lanjut" - }, - "wordsToRedact": { - "add": "Tambah" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Halaman-halaman", - "placeholder": "(misalnya 1,2,8 atau 4,7,12-16 atau 2n-1)" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV, Ekstraksi Tabel, ekstrak, konversi" @@ -1289,11 +2983,15 @@ "overlay-pdfs": { "tags": "Overlays", "header": "Hamparan berkas PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Pilih basis berkas PDF" }, "overlayFiles": { - "label": "Pilih hamparan berkas PDF" + "label": "Pilih hamparan berkas PDF", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Pilih Mode Hamparan", @@ -1303,14 +3001,53 @@ }, "counts": { "label": "Jumlah Overlay (Untuk hamparan fixed repeat)", - "placeholder": "Masukkan hitungan yang dipisahkan oleh koma (e.g., 2,3,1)" + "placeholder": "Masukkan hitungan yang dipisahkan oleh koma (e.g., 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Pilih posisi hamparan", "foreground": "Latar depan", "background": "Latar belakang" }, - "submit": "Kirim" + "submit": "Kirim", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Membagi Bagian, Membagi, Menyesuaikan", @@ -1331,6 +3068,7 @@ "tags": "Tanda tangan, tambahkan gambar, posisikan gambar di tengah, air tinta, PDF, embedding, customisasi", "header": "Stampel PDF", "title": "Stampel PDF", + "stampSetup": "Stamp Setup", "stampType": "Jenis Stampel", "stampText": "Teks Stampel", "stampImage": "Gambar Stampel", @@ -1343,7 +3081,19 @@ "overrideY": "Timpa Koordinat Y", "customMargin": "Margin Kustom", "customColor": "Warna Teks Kustom", - "submit": "Kirim" + "submit": "Kirim", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Hapus Gambar,Operasi Halaman,Backend,server side" @@ -1361,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1388,40 +3139,122 @@ "version": "Versi", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Ganti-Inversi-Warna", - "header": "Ganti-Inversi Warna PDF", - "selectText": { - "1": "Opsi Ganti atau Inversi warna", - "2": "Default(Warna kontras tinggi default)", - "3": "Kustom(Warna yang disesuaikan)", - "4": "Full-Inversi(Inversi semua warna)", - "5": "Opsi warna kontras tinggi", - "6": "teks putih di latar belakang hitam", - "7": "teks hitam di latar belakang putih", - "8": "teks kuning di latar belakang hitam", - "9": "teks hijau di latar belakang hitam", - "10": "Pilih warna teks", - "11": "Pilih warna latar belakang" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Ganti" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Ganti Warna,Operasi Halaman,Backend,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Masuk", "header": "Masuk", "signin": "Masuk", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Ingat saya", "invalid": "Nama pengguna atau kata sandi tidak valid.", "locked": "Akun Anda telah dikunci.", @@ -1440,12 +3273,83 @@ "alreadyLoggedIn": "Anda sudah login ke", "alreadyLoggedIn2": "perangkat. Silakan keluar dari perangkat dan coba lagi.", "toManySessions": "Anda memiliki terlalu banyak sesi aktif", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF Ke Halaman Tunggal", "header": "PDF Ke Halaman Tunggal", - "submit": "Konversi ke Halaman Tunggal" + "submit": "Konversi ke Halaman Tunggal", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Ekstrak Halaman", @@ -1469,18 +3373,59 @@ "adjustContrast": { "title": "Sesuaikan Kontras", "header": "Sesuaikan Kontras", + "basic": "Basic Adjustments", "contrast": "Kontras:", "brightness": "Kecerahan:", "saturation": "Saturasi:", - "download": "Unduh" + "download": "Unduh", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Kompres", + "desc": "Compress PDFs to reduce their file size.", "header": "Kompres PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Ukuran Berkas" + }, "credit": "Layanan ini menggunakan qpdf untuk Kompresi/Optimalisasi PDF.", "grayscale": { "label": "Terapkan Skala Abu-Abu untuk Kompresi" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1490,10 +3435,7 @@ "4": "Mode Otomatis - Menyesuaikan kualitas secara otomatis untuk mendapatkan PDF dengan ukuran yang tepat", "5": "Ukuran PDF yang diharapkan (mis. 25MB, 10,8MB, 25KB)" }, - "submit": "Kompres", - "method": { - "filesize": "Ukuran Berkas" - } + "submit": "Kompres" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1594,7 +3536,13 @@ "title": "Hapus gambar", "header": "Hapus gambar", "removeImage": "Hapus gambar", - "submit": "Hapus gambar" + "submit": "Hapus gambar", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Pecah PDF berdasarkan Bab", @@ -1628,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1663,45 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Unduh", - "convert": { - "title": "Konversi", - "settings": "Pengaturan", - "color": "Warna", - "greyscale": "Skala abu-abu", - "fillPage": "Isi Halaman", - "pdfaDigitalSignatureWarning": "PDF ini mengandung tanda tangan digital. Ini akan dihapus pada langkah berikutnya.", - "grayscale": "Skala abu-abu" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Tanda Tangan" + "read": "Read", + "sign": "Tanda Tangan", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { - "loading": "Mengambil data..." + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Mengambil data...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Nama", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Versi", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Unduh", - "delete": "Hapus" + "delete": "Hapus", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Bersihkan PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Pengaturan" + "files": "Files", + "settings": "Pengaturan", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Tambahkan kata sandi", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Enkripsi", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Ganti Perizinan", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "aman,Keamanan", + "header": "Tambahkan kata sandi (Enkrip)", + "selectText": { + "1": "Pilih PDF untuk enkripsi", + "2": "Kata sandi Pengguna", + "3": "Panjang kunci enkripsi", + "4": "Nilai yang lebih tinggi lebih kuat, tetapi nilai yang lebih rendah memiliki kompatibilitas yang lebih baik.", + "5": "Perizinan untuk diubah (Disarankan untuk digunakan bersama dengan kata sandi Pemilik)", + "6": "Pencegahan untuk penyusunan dokumen", + "7": "Pencegahan untuk ekstraksi konten", + "8": "Pencegahan ekstraksi untuk aksesibilitas", + "9": "Pencegahan untuk mengisi formulir", + "10": "Pencegahan untuk pengubahan", + "11": "Pencegahan untuk perubahan anotasi", + "12": "Pencegahan untuk mencetak", + "13": "Pencegahan untuk mencetak format yang berbeda", + "14": "Kata sandi Pemilik", + "15": "Membatasi apa yang dapat dilakukan dengan dokumen setelah dibuka (Tidak didukung oleh semua pembaca)", + "16": "Membatasi pembukaan dokumen itu sendiri" } }, "changePermissions": { "title": "Ganti Perizinan", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Ganti Perizinan", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Pencegahan untuk penyusunan dokumen" @@ -1728,10 +4580,784 @@ "label": "Pencegahan untuk mencetak format yang berbeda" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Ganti Perizinan" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Hapus kata sandi", + "desc": "Menghapus perlindungan kata sandi dari dokumen PDF Anda.", + "tags": "aman,Dekripsi,keamanan,buka kata sandi,hapus kata sandi", + "password": { + "stepTitle": "Hapus Kata Sandi", + "label": "Kata Sandi Saat Ini", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Hapus", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Hapus kata sandi (Dekrip)", + "selectText": { + "1": "Pilih PDF yang akan di Dekrip", + "2": "Kata Sandi" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Opsi Ganti atau Inversi warna", + "2": "Default(Warna kontras tinggi default)", + "3": "Kustom(Warna yang disesuaikan)", + "4": "Full-Inversi(Inversi semua warna)", + "5": "Opsi warna kontras tinggi", + "6": "teks putih di latar belakang hitam", + "7": "teks hitam di latar belakang putih", + "8": "teks kuning di latar belakang hitam", + "9": "teks hijau di latar belakang hitam", + "10": "Pilih warna teks", + "11": "Pilih warna latar belakang", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Ganti", + "title": "Ganti-Inversi-Warna", + "header": "Ganti-Inversi Warna PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Hapus, Sembunyikan, padamkan, hitam, hitam, penanda, tersembunyi", + "title": "Redaksional Otomatis", + "header": "Redaksional Otomatis", + "colorLabel": "Warna", + "textsToRedactLabel": "Teks untuk Disunting (dipisahkan baris)", + "textsToRedactPlaceholder": "misalnya \\nRahasia \\nRahasia Tertinggi", + "useRegexLabel": "Gunakan Regex", + "wholeWordSearchLabel": "Pencarian Seluruh Kata", + "customPaddingLabel": "Padding Ekstra Kustom", + "convertPDFToImageLabel": "Konversi PDF ke PDF-Gambar (Digunakan untuk menghapus teks di belakang kotak)", + "submitButton": "Kirim" + }, + "replaceColorPdf": { + "tags": "Ganti Warna,Operasi Halaman,Backend,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/it-IT/translation.json b/frontend/public/locales/it-IT/translation.json index 03aef76f2..66e3af028 100644 --- a/frontend/public/locales/it-IT/translation.json +++ b/frontend/public/locales/it-IT/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "Hai modifiche non salvate al tuo PDF. Cosa vuoi fare?", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Modifiche non salvate", + "keepWorking": "Continua a lavorare", + "discardChanges": "Scarta modifiche", + "applyAndContinue": "Applica e continua", + "exportAndContinue": "Esporta e continua", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Testo personalizzato", "numberPagesDesc": "Quali pagine numerare, impostazione predefinita \"tutte\", accetta anche 1-5 o 2,5,9 ecc", "customNumberDesc": "Il valore predefinito è {n}, accetta anche 'Pagina {n} di {total}', 'Testo-{n}', '{filename}-{n}", - "submit": "Aggiungi numeri di pagina" + "submit": "Aggiungi numeri di pagina", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Selezione pagina personalizzata (inserisci un elenco separato da virgole di numeri di pagina 1,5,6 o funzioni come 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Scegli PDF", "multiPdfPrompt": "Scegli 2 o più PDF", "multiPdfDropPrompt": "Scegli (o trascina e rilascia) uno o più PDF", @@ -30,7 +84,6 @@ "uploadLimitExceededPlural": "sono troppo grandi. La dimensione massima consentita è", "processTimeWarning": "Nota: Questo processo potrebbe richiedere fino a un minuto in base alla dimensione dei file", "pageOrderPrompt": "Ordine delle pagine (inserisci una lista di numeri separati da virgola):", - "pageSelectionPrompt": "Selezione pagina personalizzata (inserisci un elenco separato da virgole di numeri di pagina 1,5,6 o funzioni come 2n+1) :", "goToPage": "Vai", "true": "Vero", "false": "Falso", @@ -41,11 +94,18 @@ "save": "Salva", "saveToBrowser": "Salva nel browser", "download": "Salva", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", "undoOperationTooltip": "Clicca per annullare l’ultima operazione e ripristinare i file originali", "undo": "Annulla", "moreOptions": "Altre opzioni", "editYourNewFiles": "Modifica il/i nuovo/i file", "close": "Chiudi", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "Selezionato: {{filename}}", "chooseFile": "Scegli file", "filesSelected": "file selezionati", @@ -55,7 +115,9 @@ "uploadFiles": "Carica file", "addFiles": "Aggiungi file", "selectFromWorkbench": "Seleziona file dal banco di lavoro oppure ", - "selectMultipleFromWorkbench": "Seleziona almeno {{count}} file dal banco di lavoro oppure " + "selectMultipleFromWorkbench": "Seleziona almeno {{count}} file dal banco di lavoro oppure ", + "created": "Created", + "size": "File Size" }, "noFavourites": "Nessun preferito", "downloadComplete": "Download completo", @@ -74,7 +136,10 @@ }, "error": { "pdfPassword": "Il documento PDF è protetto da password e la password non è stata fornita oppure non era corretta", + "encryptedPdfMustRemovePassword": "Questo PDF è crittografato o protetto da password. Si prega di sbloccarlo prima di convertire in PDF/A.", + "incorrectPasswordProvided": "La password del PDF è errata o non è stata fornita.", "_value": "Errore", + "dismissAllErrors": "Chiudi tutti gli errori", "sorry": "Ci scusiamo per il problema!", "needHelp": "Hai bisogno di aiuto / trovato un problema?", "contactTip": "Se i problemi persistono, non esitare a contattarci per chiedere aiuto. Puoi aprire un ticket sulla nostra pagina GitHub o contattarci tramite Discord:", @@ -87,10 +152,7 @@ "showStack": "Mostra traccia dello stack", "copyStack": "Copia traccia dello stack", "githubSubmit": "GitHub: apri un ticket", - "discordSubmit": "Discord: invia post di supporto", - "dismissAllErrors": "Chiudi tutti gli errori", - "encryptedPdfMustRemovePassword": "Questo PDF è crittografato o protetto da password. Si prega di sbloccarlo prima di convertire in PDF/A.", - "incorrectPasswordProvided": "La password del PDF è errata o non è stata fornita." + "discordSubmit": "Discord: invia post di supporto" }, "warning": { "tooltipTitle": "Avviso" @@ -188,6 +250,7 @@ "title": "Vuoi migliorare Stirling PDF?", "paragraph1": "Stirling PDF ha opt-in analytics per aiutarci a migliorare il prodotto. Non tracciamo alcuna informazione personale o contenuto di file.", "paragraph2": "Si prega di prendere in considerazione l'attivazione dell'analytics per aiutare Stirling-PDF a crescere e consentirci di comprendere meglio i nostri utenti.", + "learnMore": "Learn more", "enable": "Abilita analytics", "disable": "Disabilita analytics", "settings": "È possibile modificare le impostazioni per analitycs nel file config/settings.yml" @@ -231,6 +294,54 @@ "cacheInputs": { "name": "Salva gli input del modulo", "help": "Abilitare per memorizzare gli input utilizzati in precedenza per esecuzioni future" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -302,8 +413,10 @@ "top20": "I migliori 20", "all": "Tutto", "refresh": "Aggiorna", - "includeHomepage": "Includi homepage ('/')", - "includeLoginPage": "Includi pagina di login ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Endpoint totali", "totalVisits": "Visite totali", "showing": "Mostrare", @@ -318,7 +431,9 @@ "top": "Migliore", "numberOfVisits": "Numero di visite", "visitsTooltip": "Visite: {0} ({1}% del totale)", - "retry": "Riprovare" + "retry": "Riprovare", + "includeHomepage": "Includi homepage ('/')", + "includeLoginPage": "Includi pagina di login ('/login')" }, "database": { "title": "Importazione/Esportazione database", @@ -359,278 +474,284 @@ "alphabetical": "Alfabetico", "globalPopularity": "Popolarità", "sortBy": "Ordinamento:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multipli,strumenti", "title": "Multifunzione PDF", - "desc": "Unisci, Ruota, Riordina, e Rimuovi pagine", - "tags": "multipli,strumenti" + "desc": "Unisci, Ruota, Riordina, e Rimuovi pagine" }, "merge": { + "tags": "combina,unisci,unifica", "title": "Unisci", - "desc": "Unisci facilmente più PDF in uno.", - "tags": "combina,unisci,unifica" + "desc": "Unisci facilmente più PDF in uno." }, "split": { + "tags": "dividi,separa,spezza", "title": "Dividi", - "desc": "Dividi un singolo PDF in più documenti.", - "tags": "dividi,separa,spezza" + "desc": "Dividi un singolo PDF in più documenti." }, "rotate": { + "tags": "ruota,capovolgi,orienta", "title": "Ruota", - "desc": "Ruota un PDF.", - "tags": "ruota,capovolgi,orienta" + "desc": "Ruota un PDF." }, "convert": { + "tags": "trasforma,cambia", "title": "Converti", - "desc": "Converti file tra diversi formati", - "tags": "trasforma,cambia" + "desc": "Converti file tra diversi formati" }, "pdfOrganiser": { + "tags": "organizza,riordina,riorganizza", "title": "Organizza", - "desc": "Rimuovi/Riordina le pagine in qualsiasi ordine.", - "tags": "organizza,riordina,riorganizza" + "desc": "Rimuovi/Riordina le pagine in qualsiasi ordine." }, "addImage": { + "tags": "inserisci,incorpora,posiziona", "title": "Aggiungi Immagine", - "desc": "Aggiungi un'immagine in un punto specifico del PDF (Lavori in corso)", - "tags": "inserisci,incorpora,posiziona" + "desc": "Aggiungi un'immagine in un punto specifico del PDF (Lavori in corso)" }, "addAttachments": { + "tags": "incorpora,allega,includi", "title": "Aggiungi allegati", - "desc": "Aggiungi o rimuovi file incorporati (allegati) da/verso un PDF", - "tags": "incorpora,allega,includi" + "desc": "Aggiungi o rimuovi file incorporati (allegati) da/verso un PDF" }, "watermark": { + "tags": "timbro,marca,sovrapponi", "title": "Aggiungi Filigrana", - "desc": "Aggiungi una filigrana al tuo PDF.", - "tags": "timbro,marca,sovrapponi" + "desc": "Aggiungi una filigrana al tuo PDF." }, "removePassword": { + "tags": "sblocca", "title": "Rimuovi Password", - "desc": "Rimuovi la password dal tuo PDF.", - "tags": "sblocca" + "desc": "Rimuovi la password dal tuo PDF." }, "compress": { + "tags": "riduci,comprimi,ottimizza", "title": "Comprimi", - "desc": "Comprimi PDF per ridurne le dimensioni.", - "tags": "riduci,comprimi,ottimizza" + "desc": "Comprimi PDF per ridurne le dimensioni." }, "unlockPDFForms": { + "tags": "sblocca,abilita,modifica", "title": "Sblocca moduli PDF", - "desc": "Rimuovi la proprietà di sola lettura dei campi del modulo in un documento PDF.", - "tags": "sblocca,abilita,modifica" + "desc": "Rimuovi la proprietà di sola lettura dei campi del modulo in un documento PDF." }, "changeMetadata": { + "tags": "modifica,cambia,aggiorna", "title": "Modifica Proprietà", - "desc": "Modifica/Aggiungi/Rimuovi le proprietà di un documento PDF.", - "tags": "modifica,cambia,aggiorna" + "desc": "Modifica/Aggiungi/Rimuovi le proprietà di un documento PDF." }, "ocr": { + "tags": "estrai,scansiona", "title": "OCR / Pulisci scansioni", - "desc": "Pulisci scansioni ed estrai testo da immagini, convertendo le immagini in testo puro.", - "tags": "estrai,scansiona" + "desc": "Pulisci scansioni ed estrai testo da immagini, convertendo le immagini in testo puro." }, "extractImages": { + "tags": "estrai,salva,esporta", "title": "Estrai immagini", - "desc": "Estrai tutte le immagini da un PDF e salvale come zip.", - "tags": "estrai,salva,esporta" + "desc": "Estrai tutte le immagini da un PDF e salvale come zip." }, "scannerImageSplit": { + "tags": "rileva,dividi,foto", "title": "Rileva/Dividi foto scansionate", - "desc": "Divide più foto all’interno di una foto/PDF", - "tags": "rileva,dividi,foto" + "desc": "Divide più foto all’interno di una foto/PDF" }, "sign": { + "tags": "firma,autografo", "title": "Firma", - "desc": "Aggiungi una firma al PDF da disegno, testo o immagine.", - "tags": "firma,autografo" + "desc": "Aggiungi una firma al PDF da disegno, testo o immagine." }, "flatten": { + "tags": "semplifica,rimuovi,interattivo", "title": "Appiattisci", - "desc": "Rimuovi tutti gli elementi interattivi e moduli da un PDF.", - "tags": "semplifica,rimuovi,interattivo" + "desc": "Rimuovi tutti gli elementi interattivi e moduli da un PDF." }, "certSign": { + "tags": "autentica,PEM,P12,ufficiale,cripta,firma,certificato,PKCS12,JKS,server,manuale,auto", "title": "Firma con certificato", - "desc": "Firma un PDF con un certificato/chiave (PEM/P12)", - "tags": "autentica,PEM,P12,ufficiale,cripta,firma,certificato,PKCS12,JKS,server,manuale,auto" + "desc": "Firma un PDF con un certificato/chiave (PEM/P12)" }, "repair": { + "tags": "ripara,ripristina", "title": "Ripara", - "desc": "Prova a riparare un PDF corrotto.", - "tags": "ripara,ripristina" + "desc": "Prova a riparare un PDF corrotto." }, "removeBlanks": { + "tags": "elimina,pulisci,vuote", "title": "Rimuovi pagine vuote", - "desc": "Trova e rimuovi pagine vuote da un PDF.", - "tags": "elimina,pulisci,vuote" + "desc": "Trova e rimuovi pagine vuote da un PDF." }, "removeAnnotations": { + "tags": "elimina,pulisci,rimuovi", "title": "Rimuovi annotazioni", - "desc": "Rimuove tutti i commenti/annotazioni da un PDF", - "tags": "elimina,pulisci,rimuovi" + "desc": "Rimuove tutti i commenti/annotazioni da un PDF" }, "compare": { + "tags": "differenza", "title": "Compara", - "desc": "Vedi e compara le differenze tra due PDF.", - "tags": "differenza" + "desc": "Vedi e compara le differenze tra due PDF." }, "removeCertSign": { + "tags": "rimuovi,elimina,sblocca", "title": "Rimuovere firma dal certificato", - "desc": "Rimuovi la firma del certificato dal PDF", - "tags": "rimuovi,elimina,sblocca" + "desc": "Rimuovi la firma del certificato dal PDF" }, "pageLayout": { + "tags": "layout,disponi,combina", "title": "Layout multipagina", - "desc": "Unisci più pagine di un documento PDF in un'unica pagina", - "tags": "layout,disponi,combina" + "desc": "Unisci più pagine di un documento PDF in un'unica pagina" }, "bookletImposition": { + "tags": "opuscolo,stampa,rilegatura", "title": "Imposizione a libretto", - "desc": "Crea libretti con corretto ordinamento pagine e layout multipagina per stampa e rilegatura", - "tags": "opuscolo,stampa,rilegatura" + "desc": "Crea libretti con corretto ordinamento pagine e layout multipagina per stampa e rilegatura" }, "scalePages": { + "tags": "ridimensiona,adatta,scala", "title": "Regola le dimensioni/scala della pagina", - "desc": "Modificare le dimensioni/scala della pagina e/o dei suoi contenuti.", - "tags": "ridimensiona,adatta,scala" + "desc": "Modificare le dimensioni/scala della pagina e/o dei suoi contenuti." }, "addPageNumbers": { + "tags": "numero,paginazione,conteggio", "title": "Aggiungi numeri di pagina", - "desc": "Aggiungi numeri di pagina in tutto un documento in una posizione prestabilita", - "tags": "numero,paginazione,conteggio" + "desc": "Aggiungi numeri di pagina in tutto un documento in una posizione prestabilita" }, "autoRename": { + "tags": "auto-rilevamento,basato su intestazione,organizza,rinomina", "title": "Rinomina automatica file PDF", - "desc": "Rinomina automaticamente un file PDF in base all’intestazione rilevata", - "tags": "auto-rilevamento,basato su intestazione,organizza,rinomina" + "desc": "Rinomina automaticamente un file PDF in base all’intestazione rilevata" }, "adjustContrast": { + "tags": "contrasto,luminosità,saturazione", "title": "Regola colori/contrasto", - "desc": "Regola contrasto, saturazione e luminosità di un PDF", - "tags": "contrasto,luminosità,saturazione" + "desc": "Regola contrasto, saturazione e luminosità di un PDF" }, "crop": { + "tags": "ritaglia,taglia,ridimensiona", "title": "Ritaglia PDF", - "desc": "Ritaglia un PDF per ridurne le dimensioni (mantiene il testo!)", - "tags": "ritaglia,taglia,ridimensiona" + "desc": "Ritaglia un PDF per ridurne le dimensioni (mantiene il testo!)" }, "autoSplitPDF": { + "tags": "auto,dividi,QR", "title": "Pagine divise automaticamente", - "desc": "Dividi automaticamente il PDF scansionato con il codice QR dello divisore di pagina fisico scansionato", - "tags": "auto,dividi,QR" + "desc": "Dividi automaticamente il PDF scansionato con il codice QR dello divisore di pagina fisico scansionato" }, "sanitize": { + "tags": "pulisci,elimina,rimuovi", "title": "Sanitizza", - "desc": "Rimuovi elementi potenzialmente dannosi dai PDF", - "tags": "pulisci,elimina,rimuovi" + "desc": "Rimuovi elementi potenzialmente dannosi dai PDF" }, "getPdfInfo": { + "tags": "info,metadati,dettagli", "title": "Ottieni TUTTE le informazioni in PDF", - "desc": "Raccogli tutte le informazioni possibili sui PDF", - "tags": "info,metadati,dettagli" + "desc": "Raccogli tutte le informazioni possibili sui PDF" }, "pdfToSinglePage": { + "tags": "combina,unisci,singola", "title": "PDF in un'unica pagina di grandi dimensioni", - "desc": "Unisce tutte le pagine PDF in un'unica grande pagina", - "tags": "combina,unisci,singola" + "desc": "Unisce tutte le pagine PDF in un'unica grande pagina" }, "showJS": { + "tags": "javascript,codice,script", "title": "Mostra Javascript", - "desc": "Cerca e visualizza qualsiasi JS inserito in un PDF", - "tags": "javascript,codice,script" + "desc": "Cerca e visualizza qualsiasi JS inserito in un PDF" }, "redact": { + "tags": "censura,oscura,nascondi", "title": "Redazione manuale", - "desc": "Redige un PDF in base al testo selezionato, alle forme disegnate e/o alle pagina selezionata(e)", - "tags": "censura,oscura,nascondi" - }, - "overlayPdfs": { - "title": "Sovrapponi PDF", - "desc": "Sovrapponi PDF sopra un altro PDF", - "tags": "sovrapponi,combina,impila" + "desc": "Redige un PDF in base al testo selezionato, alle forme disegnate e/o alle pagina selezionata(e)" }, "splitBySections": { + "tags": "dividi,sezioni,separa", "title": "Dividi PDF per sezioni", - "desc": "Divide ogni pagina di un PDF in sezioni orizzontali e verticali più piccole", - "tags": "dividi,sezioni,separa" + "desc": "Divide ogni pagina di un PDF in sezioni orizzontali e verticali più piccole" }, "addStamp": { + "tags": "timbro,marca,sigillo", "title": "Aggiungi timbro al PDF", - "desc": "Aggiungi timbri di testo o immagine in posizioni specifiche", - "tags": "timbro,marca,sigillo" + "desc": "Aggiungi timbri di testo o immagine in posizioni specifiche" }, "removeImage": { + "tags": "rimuovi,elimina,pulisci", "title": "Rimuovi immagine", - "desc": "Rimuovi le immagini dal PDF per ridurre la dimensione del file", - "tags": "rimuovi,elimina,pulisci" + "desc": "Rimuovi le immagini dal PDF per ridurre la dimensione del file" }, "splitByChapters": { + "tags": "dividi,capitoli,struttura", "title": "Dividi PDF per capitoli", - "desc": "Dividi un PDF in più file in base alla struttura dei capitoli.", - "tags": "dividi,capitoli,struttura" + "desc": "Dividi un PDF in più file in base alla struttura dei capitoli." }, "validateSignature": { + "tags": "convalida,verifica,certificato", "title": "Convalida la firma PDF", - "desc": "Verificare le firme digitali e i certificati nei documenti PDF", - "tags": "convalida,verifica,certificato" + "desc": "Verificare le firme digitali e i certificati nei documenti PDF" }, "swagger": { + "tags": "API,documentazione,test", "title": "Documentazione API", - "desc": "Visualizza documentazione API e testa gli endpoint", - "tags": "API,documentazione,test" + "desc": "Visualizza documentazione API e testa gli endpoint" }, - "fakeScan": { - "title": "Finta scansione", - "desc": "Crea un PDF che sembri scansionato" + "scannerEffect": { + "tags": "scansiona,simula,crea", + "title": "Effetto scanner", + "desc": "Crea un PDF che sembra essere stato scansionato" }, "editTableOfContents": { + "tags": "segnalibri,contenuti,modifica", "title": "Modifica indice", - "desc": "Aggiungi o modifica segnalibri e sommario nei documenti PDF", - "tags": "segnalibri,contenuti,modifica" + "desc": "Aggiungi o modifica segnalibri e sommario nei documenti PDF" }, "manageCertificates": { + "tags": "certificati,importa,esporta", "title": "Gestisci certificati", - "desc": "Importa, esporta o elimina i file certificato usati per firmare i PDF.", - "tags": "certificati,importa,esporta" + "desc": "Importa, esporta o elimina i file certificato usati per firmare i PDF." }, "read": { + "tags": "visualizza,apri,mostra", "title": "Leggi", - "desc": "Visualizza e annota PDF. Evidenzia testo, disegna o inserisci commenti per revisione e collaborazione.", - "tags": "visualizza,apri,mostra" + "desc": "Visualizza e annota PDF. Evidenzia testo, disegna o inserisci commenti per revisione e collaborazione." }, "reorganizePages": { + "tags": "riordina,riorganizza,organizza", "title": "Riorganizza pagine", - "desc": "Riorganizza, duplica o elimina pagine PDF con controllo visivo drag‑and‑drop.", - "tags": "riordina,riorganizza,organizza" + "desc": "Riorganizza, duplica o elimina pagine PDF con controllo visivo drag‑and‑drop." }, "extractPages": { + "tags": "estrai,seleziona,copia", "title": "Estrai pagine", - "desc": "Estrai pagine specifiche da un PDF", - "tags": "estrai,seleziona,copia" + "desc": "Estrai pagine specifiche da un PDF" }, "removePages": { + "tags": "elimina,estrai,escludi", "title": "Rimuovi", - "desc": "Elimina alcune pagine dal PDF.", - "tags": "elimina,estrai,escludi" + "desc": "Elimina alcune pagine dal PDF." }, "autoSizeSplitPDF": { + "tags": "auto,dividi,dimensione", "title": "Divisione automatica per dimensione/numero", - "desc": "Dividi un singolo PDF in più documenti in base alle dimensioni, al numero di pagine o al numero di documenti", - "tags": "auto,dividi,dimensione" + "desc": "Dividi un singolo PDF in più documenti in base alle dimensioni, al numero di pagine o al numero di documenti" }, - "replaceColorPdf": { - "title": "Sostituisci e inverti il colore", - "desc": "Sostituisci il colore del testo e dello sfondo nel PDF e inverti il colore completo del PDF per ridurre le dimensioni del file" + "replaceColor": { + "title": "Sostituisci e inverti colore", + "desc": "Sostituisci o inverti i colori nei documenti PDF" }, "devApi": { + "tags": "API,sviluppo,documentazione", "title": "API", - "desc": "Link alla documentazione API", - "tags": "API,sviluppo,documentazione" + "desc": "Link alla documentazione API" }, "devFolderScanning": { + "tags": "automazione,cartella,scansione", "title": "Scansione cartelle automatizzata", - "desc": "Link alla guida per scansione cartelle automatizzata", - "tags": "automazione,cartella,scansione" + "desc": "Link alla guida per scansione cartelle automatizzata" }, "devSsoGuide": { "title": "Guida SSO", @@ -649,18 +770,26 @@ "desc": "Modifica restrizioni e permessi del documento" }, "automate": { + "tags": "flusso di lavoro,sequenza,automazione", "title": "Automatizza", - "desc": "Crea flussi multi‑step concatenando azioni PDF. Ideale per attività ricorrenti.", - "tags": "flusso di lavoro,sequenza,automazione" + "desc": "Crea flussi multi‑step concatenando azioni PDF. Ideale per attività ricorrenti." }, - "replaceColor": { - "desc": "Sostituisci o inverti i colori nei documenti PDF", - "title": "Sostituisci e inverti colore" + "overlay-pdfs": { + "desc": "Overlay one PDF on top of another", + "title": "Overlay PDFs" }, - "scannerEffect": { - "desc": "Crea un PDF che sembra essere stato scansionato", - "tags": "scansiona,simula,crea", - "title": "Effetto scanner" + "overlayPdfs": { + "title": "Sovrapponi PDF", + "desc": "Sovrapponi PDF sopra un altro PDF", + "tags": "sovrapponi,combina,impila" + }, + "fakeScan": { + "title": "Finta scansione", + "desc": "Crea un PDF che sembri scansionato" + }, + "replaceColorPdf": { + "title": "Sostituisci e inverti il colore", + "desc": "Sostituisci il colore del testo e dello sfondo nel PDF e inverti il colore completo del PDF per ridurre le dimensioni del file" } }, "landing": { @@ -700,13 +829,19 @@ "merge": { "tags": "unione,operazioni sulla pagina,back-end,lato server", "title": "Unisci", - "removeDigitalSignature.tooltip": { - "title": "Rimuovi firma digitale", - "description": "Le firme digitali verranno invalidate durante l’unione dei file. Seleziona per rimuoverle dal PDF finale." + "removeDigitalSignature": { + "label": "Rimuovere la firma digitale nel file unito?", + "tooltip": { + "title": "Rimuovi firma digitale", + "description": "Le firme digitali verranno invalidate durante l’unione dei file. Seleziona per rimuoverle dal PDF finale." + } }, - "generateTableOfContents.tooltip": { - "title": "Genera indice", - "description": "Crea automaticamente un indice cliccabile nel PDF unito basato sui nomi dei file originali e sui numeri di pagina." + "generateTableOfContents": { + "label": "Generare l'indice nel file unito?", + "tooltip": { + "title": "Genera indice", + "description": "Crea automaticamente un indice cliccabile nel PDF unito basato sui nomi dei file originali e sui numeri di pagina." + } }, "submit": "Unisci", "sortBy": { @@ -720,12 +855,9 @@ }, "error": { "failed": "Si è verificato un errore durante l’unione dei PDF." - }, - "generateTableOfContents": "Generare l'indice nel file unito?", - "removeDigitalSignature": "Rimuovere la firma digitale nel file unito?" + } }, "split": { - "tags": "Operazioni sulla pagina,divisione,multi pagina,taglio,lato server", "title": "Dividi PDF", "header": "Dividi PDF", "desc": { @@ -847,13 +979,51 @@ "bullet1": "Livello segnalibro: livello su cui dividere (1=primo livello)", "bullet2": "Includi metadati: preserva le proprietà del documento", "bullet3": "Consenti duplicati: gestisce nomi segnalibro ripetuti" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" } - } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operazioni sulla pagina,divisione,multi pagina,taglio,lato server" }, "rotate": { - "tags": "lato server", "title": "Ruota PDF", "submit": "Ruota", + "selectRotation": "Select Rotation Angle (Clockwise)", "error": { "failed": "Si è verificato un errore durante la rotazione del PDF." }, @@ -873,7 +1043,8 @@ "title": "Controlli", "text": "Usa i pulsanti di rotazione per regolare l’orientamento. Il pulsante sinistro ruota in senso antiorario, quello destro in senso orario. Ogni clic ruota di 90 gradi." } - } + }, + "tags": "lato server" }, "convert": { "title": "Converti", @@ -941,7 +1112,8 @@ "imagesExt": "Immagini (JPG, PNG, ecc.)", "markdown": "Markdown", "textRtf": "Testo/RTF", - "grayscale": "Scala di grigi" + "grayscale": "Scala di grigi", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversione,img,jpg,immagine,foto" @@ -979,22 +1151,35 @@ "8": "Rimuovi ultima", "9": "Rimuovi la prima e l'ultima", "10": "Unione pari-dispari", - "11": "Duplica tutte le pagine" + "11": "Duplica tutte le pagine", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, - "placeholder": "(ad es. 1,3,2 o 4-8,2,10-12 o 2n-1)", "desc": { - "BOOKLET_SORT": "Disporre le pagine per la stampa a opuscolo (ultima, prima, seconda, penultima, …).", "CUSTOM": "Utilizzare una sequenza personalizzata di numeri di pagina o espressioni per definire un nuovo ordine.", - "DUPLEX_SORT": "Alternare fronte e retro come se uno scanner duplex avesse scansionato tutti i fronti, poi tutti i retri (1, n, 2, n-1, …).", - "DUPLICATE": "Duplicare ogni pagina secondo il conteggio dell'ordine personalizzato (ad es., 4 duplica ogni pagina 4×).", - "ODD_EVEN_MERGE": "Unire due PDF alternando le pagine: dispari dal primo, pari dal secondo.", - "ODD_EVEN_SPLIT": "Dividere il documento in due output: tutte le pagine dispari e tutte le pagine pari.", - "REMOVE_FIRST": "Rimuovere la prima pagina dal documento.", - "REMOVE_FIRST_AND_LAST": "Rimuovere sia la prima che l'ultima pagina dal documento.", - "REMOVE_LAST": "Rimuovere l'ultima pagina dal documento.", "REVERSE_ORDER": "Capovolgere il documento in modo che l'ultima pagina diventi la prima e così via.", - "SIDE_STITCH_BOOKLET_SORT": "Disporre le pagine per la stampa a opuscolo con cucitura laterale (ottimizzato per la rilegatura sul lato)." - } + "DUPLEX_SORT": "Alternare fronte e retro come se uno scanner duplex avesse scansionato tutti i fronti, poi tutti i retri (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Disporre le pagine per la stampa a opuscolo (ultima, prima, seconda, penultima, …).", + "SIDE_STITCH_BOOKLET_SORT": "Disporre le pagine per la stampa a opuscolo con cucitura laterale (ottimizzato per la rilegatura sul lato).", + "ODD_EVEN_SPLIT": "Dividere il documento in due output: tutte le pagine dispari e tutte le pagine pari.", + "ODD_EVEN_MERGE": "Unire due PDF alternando le pagine: dispari dal primo, pari dal secondo.", + "DUPLICATE": "Duplicare ogni pagina secondo il conteggio dell'ordine personalizzato (ad es., 4 duplica ogni pagina 4×).", + "REMOVE_FIRST": "Rimuovere la prima pagina dal documento.", + "REMOVE_LAST": "Rimuovere l'ultima pagina dal documento.", + "REMOVE_FIRST_AND_LAST": "Rimuovere sia la prima che l'ultima pagina dal documento." + }, + "placeholder": "(ad es. 1,3,2 o 4-8,2,10-12 o 2n-1)" }, "addImage": { "tags": "img,jpg,immagine,foto", @@ -1045,7 +1230,9 @@ "opacity": "Opacità (%)", "spacing": { "horizontal": "Spaziatura orizzontale", - "vertical": "Spaziatura verticale" + "vertical": "Spaziatura verticale", + "height": "Height Spacing", + "width": "Width Spacing" }, "convertToImage": "Appiattisci pagine PDF in immagini" }, @@ -1188,6 +1375,10 @@ "bullet4": "Ideale per contenuti sensibili o protetti da copyright" } } + }, + "type": { + "1": "Text", + "2": "Image" } }, "permissions": { @@ -1261,6 +1452,26 @@ }, "submit": "Rimuovi" }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, "pageSelection": { "tooltip": { "header": { @@ -1301,10 +1512,43 @@ }, "examples": { "title": "Esempi" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", "header": { "title": "Guida Selezione Pagine" }, @@ -1377,7 +1621,6 @@ } }, "changeMetadata": { - "tags": "Titolo,autore,data,creazione,ora,editore,produttore,statistiche", "header": "Cambia Proprietà", "submit": "Cambia proprietà", "filenamePrefix": "metadati", @@ -1498,7 +1741,8 @@ "bullet3": "Unknown: Stato di trapping non specificato" } } - } + }, + "tags": "Titolo,autore,data,creazione,ora,editore,produttore,statistiche" }, "fileToPDF": { "tags": "trasformazione,formato,documento,immagine,diapositiva,testo,conversione,ufficio,documenti,parola,excel,powerpoint", @@ -1611,6 +1855,9 @@ "text": "Post‑elabora il PDF finale rimuovendo artefatti OCR e ottimizzando il layer di testo per migliore leggibilità e dimensioni minori." } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1620,11 +1867,11 @@ "selectText": "Seleziona il formato in cui salvare le immagini estratte", "allowDuplicates": "Salva le immagini duplicate", "submit": "Estrai", - "error": { - "failed": "Si è verificato un errore durante l'estrazione delle immagini dal PDF." - }, "settings": { "title": "Impostazioni" + }, + "error": { + "failed": "Si è verificato un errore durante l'estrazione delle immagini dal PDF." } }, "pdfToPDFA": { @@ -1697,14 +1944,43 @@ }, "info": "Python non è installato. È necessario per l'esecuzione." }, + "scannerImageSplit": { + "title": "Immagini estratte", + "submit": "Estrai scansioni di immagini", + "error": { + "failed": "Si è verificato un errore durante l'estrazione delle scansioni di immagini." + }, + "tooltip": { + "title": "Divisore di foto", + "whatThisDoes": "Cosa fa", + "whatThisDoesDesc": "Trova ed estrae automaticamente ogni foto da una pagina scansionata o da un'immagine composita - senza ritaglio manuale.", + "whenToUse": "Quando usare", + "useCase1": "Scansiona intere pagine di album in una volta", + "useCase2": "Dividi i lotti flatbed in file separati", + "useCase3": "Suddividi collage in singole foto", + "useCase4": "Estrai foto dai documenti", + "quickFixes": "Correzioni rapide", + "problem1": "Foto non rilevate → aumentare la tolleranza a 30-50", + "problem2": "Troppe rilevazioni errate → aumentare l'area minima a 15.000-20.000", + "problem3": "I ritagli sono troppo stretti → aumentare la dimensione del bordo a 5-10", + "problem4": "Foto inclinate non raddrizzate → abbassare la soglia angolare a ~5°", + "problem5": "Caselle di polvere/rumore → aumentare l'area minima del contorno a 1000-2000", + "setupTips": "Suggerimenti di configurazione", + "tip1": "Usa uno sfondo semplice e chiaro", + "tip2": "Lascia un piccolo spazio (≈1 cm) tra le foto", + "tip3": "Scansiona a 300-600 DPI", + "tip4": "Pulisci il vetro dello scanner", + "headsUp": "Attenzione", + "headsUpDesc": "Foto sovrapposte o sfondi molto simili nel colore alle foto possono ridurre la precisione - prova uno sfondo più chiaro o più scuro e lascia più spazio." + } + }, "sign": { - "tags": "autorizza,iniziali,firma-tracciata,firma-testo,firma-immagine", "title": "Firma", "header": "Firma PDF", "upload": "Carica immagine", "draw": { - "clear": "Cancella", - "title": "Disegna la tua firma" + "title": "Disegna la tua firma", + "clear": "Cancella" }, "text": { "name": "Nome firmatario", @@ -1714,6 +1990,7 @@ "add": "Aggiungi", "saved": "Firme salvate", "save": "Firma salvata", + "applySignatures": "Applica firme", "personalSigs": "Firme personali", "sharedSigs": "Firme condivise", "noSavedSigs": "Nessuna firma salvata trovata", @@ -1726,37 +2003,44 @@ "maintainRatio": "Attiva il mantenimento delle proporzioni", "undo": "Annulla", "redo": "Rifare", - "activate": "Attiva posizionamento firma", - "applySignatures": "Applica firme", - "deactivate": "Interrompi posizionamento firme", - "error": { - "failed": "Si è verificato un errore durante la firma del PDF." - }, - "image": { - "hint": "Carica un'immagine PNG o JPG della tua firma", - "label": "Carica immagine firma", - "placeholder": "Seleziona file immagine" - }, - "instructions": { - "title": "Come aggiungere la firma" - }, - "results": { - "title": "Risultati firma" - }, + "submit": "Firma documento", "steps": { "configure": "Configura firma" }, - "submit": "Firma documento", "type": { - "canvas": "Canvas", + "title": "Tipo di firma", "draw": "Disegna", + "canvas": "Canvas", "image": "Immagine", - "text": "Testo", - "title": "Tipo di firma" - } + "text": "Testo" + }, + "image": { + "label": "Carica immagine firma", + "placeholder": "Seleziona file immagine", + "hint": "Carica un'immagine PNG o JPG della tua firma" + }, + "instructions": { + "title": "Come aggiungere la firma", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Attiva posizionamento firma", + "deactivate": "Interrompi posizionamento firme", + "results": { + "title": "Risultati firma" + }, + "error": { + "failed": "Si è verificato un errore durante la firma del PDF." + }, + "tags": "autorizza,iniziali,firma-tracciata,firma-testo,firma-immagine" }, "flatten": { - "tags": "statico,disattivato,non interattivo,ottimizzato", "title": "Appiattire", "header": "Appiattisci PDF", "flattenOnlyForms": "Appiattisci solo i moduli", @@ -1771,9 +2055,11 @@ "options": { "stepTitle": "Opzioni di flattening", "title": "Opzioni di flattening", - "flattenOnlyForms.desc": "Appiattisci solo i campi modulo, lasciando intatti gli altri elementi interattivi", - "note": "Il flattening rimuove gli elementi interattivi dal PDF, rendendoli non modificabili.", - "flattenOnlyForms": "Appiattisci solo i moduli" + "flattenOnlyForms": { + "label": "Appiattisci solo i moduli", + "desc": "Appiattisci solo i campi modulo, lasciando intatti gli altri elementi interattivi" + }, + "note": "Il flattening rimuove gli elementi interattivi dal PDF, rendendoli non modificabili." }, "results": { "title": "Risultati Flatten" @@ -1801,7 +2087,8 @@ "bullet3": "Commenti e note restano visibili", "bullet4": "I segnalibri aiutano ancora la navigazione" } - } + }, + "tags": "statico,disattivato,non interattivo,ottimizzato" }, "repair": { "tags": "aggiustare,ripristinare,correggere,recuperare", @@ -1821,7 +2108,6 @@ } }, "removeBlanks": { - "tags": "pulire,semplificare,non contenere contenuti,organizzare", "title": "Rimuovi spazi vuoti", "header": "Rimuovi pagine vuote", "settings": { @@ -1863,22 +2149,29 @@ "bullet3": "Può essere disabilitato per ridurre la dimensione del file di output" } }, - "submit": "Rimuovi" + "submit": "Rimuovi", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "pulire,semplificare,non contenere contenuti,organizzare" }, "removeAnnotations": { "tags": "commenti,evidenziazioni,note,markup,rimozione", "title": "Rimuovi Annotazioni", "header": "Rimuovi Annotazioni", "submit": "Rimuovi", - "error": { - "failed": "Si è verificato un errore durante la rimozione delle annotazioni dal PDF." - }, - "info": { - "description": "Questo strumento rimuoverà tutte le annotazioni (commenti, evidenziazioni, note, ecc.) dai tuoi documenti PDF.", - "title": "Informazioni su Rimuovi annotazioni" - }, "settings": { "title": "Impostazioni" + }, + "info": { + "title": "Informazioni su Rimuovi annotazioni", + "description": "Questo strumento rimuoverà tutte le annotazioni (commenti, evidenziazioni, note, ecc.) dai tuoi documenti PDF." + }, + "error": { + "failed": "Si è verificato un errore durante la rimozione delle annotazioni dal PDF." } }, "compare": { @@ -1965,7 +2258,12 @@ "bullet3": "Scegli in quale pagina posizionare la firma", "bullet4": "Logo opzionale includibile" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, "sign": { "submit": "Firma PDF", @@ -2026,7 +2324,22 @@ "text": "Converti il tuo file in un keystore Java (.jks) con keytool, poi scegli JKS." } } - } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Certificate Password", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo" }, "removeCertSign": { "tags": "autenticare,PEM,P12,ufficiale,decifrare", @@ -2052,7 +2365,17 @@ "header": "Layout multipagina", "pagesPerSheet": "Pagine per foglio:", "addBorder": "Aggiungi bordi", - "submit": "Invia" + "submit": "Invia", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "libretto,imposizione,stampa,rilegatura,piegatura,signatura", @@ -2228,7 +2551,6 @@ "tags": "correzione del colore,messa a punto,modifica,miglioramento" }, "crop": { - "tags": "tagliare,ridurre,modificare,modellare", "title": "Ritaglia", "header": "Ritaglia PDF", "submit": "Invia", @@ -2239,10 +2561,22 @@ "reset": "Reimposta all’intero PDF", "coordinates": { "title": "Posizione e dimensioni", - "x": "Posizione X", - "y": "Posizione Y", - "width": "Larghezza", - "height": "Altezza" + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } }, "error": { "invalidArea": "L’area di ritaglio supera i limiti del PDF", @@ -2260,7 +2594,12 @@ }, "results": { "title": "Risultati ritaglio" - } + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "tagliare,ridurre,modificare,modellare" }, "autoSplitPDF": { "tags": "Basato su QR,separato,scansiona segmenti,organizza", @@ -2470,11 +2809,15 @@ "overlay-pdfs": { "tags": "Sovrapponi", "header": "Invia file PDF in sovrapposizione", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Seleziona File PDF di base" }, "overlayFiles": { - "label": "Seleziona sovrapposizione file PDF" + "label": "Seleziona sovrapposizione file PDF", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Seleziona la modalità di sovrapposizione", @@ -2484,14 +2827,53 @@ }, "counts": { "label": "Numeri sovrapposti (per la modalità di ripetizione fissa)", - "placeholder": "Inserisci i numeri separati da virgole (ad esempio, 2,3,1)" + "placeholder": "Inserisci i numeri separati da virgole (ad esempio, 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Seleziona posizione di sovrapposizione", "foreground": "Primo piano", "background": "Sfondo" }, - "submit": "Sovrapponi" + "submit": "Sovrapponi", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Dividi sezione,dividi,personalizza", @@ -2526,7 +2908,18 @@ "customMargin": "Margine personalizzato", "customColor": "Colore testo personalizzato", "submit": "Invia", - "noStampSelected": "Nessun timbro selezionato. Torna al Passo 1." + "noStampSelected": "Nessun timbro selezionato. Torna al Passo 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Rimuovi immagine,operazioni sulla pagina,back-end,lato server" @@ -2544,7 +2937,8 @@ "status": { "_value": "Stato", "valid": "Valida", - "invalid": "Invalida" + "invalid": "Invalida", + "complete": "Validation complete" }, "signer": "Firmatario", "date": "Data", @@ -2571,35 +2965,115 @@ "version": "Versione", "keyUsage": "Utilizzo della chiave", "selfSigned": "Autofirmato", - "bits": "bit" + "bits": "bit", + "details": "Certificate Details" }, "signature": { "info": "Informazioni sulla firma", "_value": "Firma", "mathValid": "La firma è matematicamente valida MA:" }, - "selectCustomCert": "File di certificato personalizzato X.509 (opzionale)" - }, - "replace-color": { - "title": "Sostituisci-Inverti-Colore", - "header": "Sostituisci-Inverti colore PDF", - "selectText": { - "1": "Sostituisci o inverti le opzioni del colore", - "2": "Predefinito (colori ad alto contrasto predefiniti)", - "3": "Personalizzato (colori personalizzati)", - "4": "Inversione completa (inverte tutti i colori)", - "5": "Opzioni di colore ad alto contrasto", - "6": "testo bianco su sfondo nero", - "7": "Testo nero su sfondo bianco", - "8": "Testo giallo su sfondo nero", - "9": "Testo verde su sfondo nero", - "10": "Scegli il colore del testo", - "11": "Scegli il colore di sfondo" + "selectCustomCert": "File di certificato personalizzato X.509 (opzionale)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Sostituisci" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Sostituisci colore, Operazioni di pagina, Back-end, lato server" + "replaceColor": { + "tags": "Sostituisci colore,Operazioni pagina,Back end,lato server", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Accedi", @@ -2632,6 +3106,11 @@ "enterEmail": "Inserisci la tua email", "enterPassword": "Inserisci la tua password", "loggingIn": "Accesso in corso...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", "signingIn": "Accesso in corso...", "login": "Accedi", "or": "Oppure", @@ -2649,7 +3128,10 @@ "magicLinkSent": "Magic link inviato a {{email}}! Controlla la posta e clicca il link per accedere.", "passwordResetSent": "Link di reimpostazione password inviato a {{email}}! Segui le istruzioni nell’email.", "failedToSignIn": "Accesso con {{provider}} non riuscito: {{message}}", - "unexpectedError": "Errore imprevisto: {{message}}" + "unexpectedError": "Errore imprevisto: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." }, "signup": { "title": "Crea un account", @@ -2672,7 +3154,12 @@ "invalidEmail": "Inserisci un indirizzo email valido", "checkEmailConfirmation": "Controlla la tua email per il link di conferma per completare la registrazione.", "accountCreatedSuccessfully": "Account creato con successo! Ora puoi accedere.", - "unexpectedError": "Errore imprevisto: {{message}}" + "unexpectedError": "Errore imprevisto: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF a pagina singola", @@ -2712,10 +3199,23 @@ "adjustContrast": { "title": "Regola il contrasto", "header": "Regola il contrasto", + "basic": "Basic Adjustments", "contrast": "Contrasto:", "brightness": "Luminosità:", "saturation": "Saturazione:", - "download": "Salva" + "download": "Salva", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Comprimi", @@ -2862,7 +3362,13 @@ "title": "Rimuovere immagine", "header": "Rimuovi immagine", "removeImage": "Rimuovi immagine", - "submit": "Rimuovi immagine" + "submit": "Rimuovi immagine", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Dividere PDF per capitoli", @@ -2937,6 +3443,10 @@ "title": "Analitiche", "description": "Questi cookie ci aiutano a capire come vengono utilizzati i nostri strumenti, così possiamo concentrarci sullo sviluppo delle funzionalità che la nostra community apprezza di più. Non preoccuparti: Stirling PDF non può e non traccerà mai il contenuto dei documenti con cui lavori." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, "removeMetadata": { @@ -2998,11 +3508,18 @@ "panMode": "Modalità mano", "rotateLeft": "Ruota a sinistra", "rotateRight": "Ruota a destra", - "toggleSidebar": "Mostra/Nascondi barra laterale" + "toggleSidebar": "Mostra/Nascondi barra laterale", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" }, "search": { "title": "Cerca nel PDF", - "placeholder": "Inserisci termine di ricerca..." + "placeholder": "Inserisci termine di ricerca...", + "noResults": "No results found", + "searching": "Searching..." }, "guestBanner": { "title": "Stai usando Stirling PDF come ospite!", @@ -3040,9 +3557,597 @@ "automate": "Automatizza", "files": "File", "activity": "Attività", + "help": "Help", + "account": "Account", "config": "Config", + "adminSettings": "Admin Settings", "allTools": "Tutti gli strumenti" }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, "fileUpload": { "selectFile": "Seleziona un file", "selectFiles": "Seleziona file", @@ -3067,6 +4172,9 @@ "addFiles": "Aggiungi file", "dragFilesInOrClick": "Trascina i file o clicca \"Aggiungi file\" per sfogliare" }, + "fileEditor": { + "addFiles": "Add Files" + }, "fileManager": { "title": "Carica file PDF", "subtitle": "Aggiungi file al tuo archivio per un accesso facile tra gli strumenti", @@ -3095,6 +4203,7 @@ "lastModified": "Ultima modifica", "toolChain": "Strumenti applicati", "restore": "Ripristina", + "unzip": "Unzip", "searchFiles": "Cerca file...", "recent": "Recenti", "localFiles": "File locali", @@ -3102,7 +4211,6 @@ "googleDriveShort": "Drive", "myFiles": "I miei file", "noRecentFiles": "Nessun file recente trovato", - "dropFilesHint": "Rilascia qui per caricare", "googleDriveNotAvailable": "Integrazione Google Drive non disponibile", "openFiles": "Apri file", "openFile": "Apri file", @@ -3120,7 +4228,18 @@ "selectedCount": "{{count}} selezionati", "download": "Salva", "delete": "Elimina", - "unsupported": "Non supportato" + "unsupported": "Non supportato", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "Rilascia qui per caricare" }, "storage": { "temporaryNotice": "I file sono archiviati temporaneamente nel tuo browser e potrebbero essere eliminati automaticamente", @@ -3136,8 +4255,10 @@ "desc": "Rimuovi elementi potenzialmente dannosi dai PDF.", "submit": "Pulire PDF", "completed": "Sanitizzazione completata con successo", - "error.generic": "Sanitizzazione non riuscita", - "error.failed": "Si è verificato un errore durante la sanitizzazione del PDF.", + "error": { + "generic": "Sanitizzazione non riuscita", + "failed": "Si è verificato un errore durante la sanitizzazione del PDF." + }, "filenamePrefix": "sanitizzato", "sanitizationResults": "Risultati sanitizzazione", "steps": { @@ -3151,18 +4272,30 @@ "options": { "title": "Opzioni di sanitizzazione", "note": "Seleziona gli elementi che vuoi rimuovere dal PDF. È necessario selezionarne almeno uno.", - "removeJavaScript.desc": "Rimuovi azioni e script JavaScript dal PDF", - "removeEmbeddedFiles.desc": "Rimuovi eventuali file incorporati nel PDF", - "removeXMPMetadata.desc": "Rimuovi i metadati XMP dal PDF", - "removeMetadata.desc": "Rimuovi le informazioni (titolo, autore, ecc.)", - "removeLinks.desc": "Rimuovi link esterni e azioni di avvio dal PDF", - "removeFonts.desc": "Rimuovi i font incorporati dal PDF", - "removeEmbeddedFiles": "Rimuovi file incorporati", - "removeFonts": "Rimuovi caratteri", - "removeJavaScript": "Rimuovi JavaScript", - "removeLinks": "Rimuovi collegamenti", - "removeMetadata": "Rimuovi metadati documento", - "removeXMPMetadata": "Rimuovi metadati XMP" + "removeJavaScript": { + "label": "Rimuovi JavaScript", + "desc": "Rimuovi azioni e script JavaScript dal PDF" + }, + "removeEmbeddedFiles": { + "label": "Rimuovi file incorporati", + "desc": "Rimuovi eventuali file incorporati nel PDF" + }, + "removeXMPMetadata": { + "label": "Rimuovi metadati XMP", + "desc": "Rimuovi i metadati XMP dal PDF" + }, + "removeMetadata": { + "label": "Rimuovi metadati documento", + "desc": "Rimuovi le informazioni (titolo, autore, ecc.)" + }, + "removeLinks": { + "label": "Rimuovi collegamenti", + "desc": "Rimuovi link esterni e azioni di avvio dal PDF" + }, + "removeFonts": { + "label": "Rimuovi caratteri", + "desc": "Rimuovi i font incorporati dal PDF" + } } }, "addPassword": { @@ -3383,9 +4516,14 @@ "remaining": "rimanenti", "used": "usati", "available": "disponibili", - "cancel": "Annulla" + "cancel": "Annulla", + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { "title": "Impostazioni account", @@ -3431,57 +4569,584 @@ "generateError": "Non siamo riusciti a generare la tua chiave API." } }, - "termsAndConditions": "Termini e condizioni", - "logOut": "Esci", "AddAttachmentsRequest": { - "addMoreFiles": "Aggiungi altri file...", "attachments": "Seleziona allegati", "info": "Seleziona i file da allegare al tuo PDF. Questi file saranno incorporati e accessibili tramite il pannello allegati del PDF.", + "selectFiles": "Seleziona file da allegare", "placeholder": "Scegli file...", + "addMoreFiles": "Aggiungi altri file...", + "selectedFiles": "File selezionati", + "submit": "Aggiungi allegati", "results": { "title": "Risultati allegati" }, - "selectFiles": "Seleziona file da allegare", - "selectedFiles": "File selezionati", - "submit": "Aggiungi allegati" - }, - "applyAndContinue": "Applica e continua", - "discardChanges": "Scarta modifiche", - "exportAndContinue": "Esporta e continua", - "keepWorking": "Continua a lavorare", - "replaceColor": { - "tags": "Sostituisci colore,Operazioni pagina,Back end,lato server" - }, - "scannerImageSplit": { "error": { - "failed": "Si è verificato un errore durante l'estrazione delle scansioni di immagini." - }, - "submit": "Estrai scansioni di immagini", - "title": "Immagini estratte", - "tooltip": { - "headsUp": "Attenzione", - "headsUpDesc": "Foto sovrapposte o sfondi molto simili nel colore alle foto possono ridurre la precisione - prova uno sfondo più chiaro o più scuro e lascia più spazio.", - "problem1": "Foto non rilevate → aumentare la tolleranza a 30-50", - "problem2": "Troppe rilevazioni errate → aumentare l'area minima a 15.000-20.000", - "problem3": "I ritagli sono troppo stretti → aumentare la dimensione del bordo a 5-10", - "problem4": "Foto inclinate non raddrizzate → abbassare la soglia angolare a ~5°", - "problem5": "Caselle di polvere/rumore → aumentare l'area minima del contorno a 1000-2000", - "quickFixes": "Correzioni rapide", - "setupTips": "Suggerimenti di configurazione", - "tip1": "Usa uno sfondo semplice e chiaro", - "tip2": "Lascia un piccolo spazio (≈1 cm) tra le foto", - "tip3": "Scansiona a 300-600 DPI", - "tip4": "Pulisci il vetro dello scanner", - "title": "Divisore di foto", - "useCase1": "Scansiona intere pagine di album in una volta", - "useCase2": "Dividi i lotti flatbed in file separati", - "useCase3": "Suddividi collage in singole foto", - "useCase4": "Estrai foto dai documenti", - "whatThisDoes": "Cosa fa", - "whatThisDoesDesc": "Trova ed estrae automaticamente ogni foto da una pagina scansionata o da un'immagine composita - senza ritaglio manuale.", - "whenToUse": "Quando usare" + "failed": "Add attachments operation failed" } }, - "unsavedChanges": "Hai modifiche non salvate al tuo PDF. Cosa vuoi fare?", - "unsavedChangesTitle": "Modifiche non salvate" -} \ No newline at end of file + "termsAndConditions": "Termini e condizioni", + "logOut": "Esci", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Sostituisci o inverti le opzioni del colore", + "2": "Predefinito (colori ad alto contrasto predefiniti)", + "3": "Personalizzato (colori personalizzati)", + "4": "Inversione completa (inverte tutti i colori)", + "5": "Opzioni di colore ad alto contrasto", + "6": "testo bianco su sfondo nero", + "7": "Testo nero su sfondo bianco", + "8": "Testo giallo su sfondo nero", + "9": "Testo verde su sfondo nero", + "10": "Scegli il colore del testo", + "11": "Scegli il colore di sfondo", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Sostituisci", + "title": "Sostituisci-Inverti-Colore", + "header": "Sostituisci-Inverti colore PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "replaceColorPdf": { + "tags": "Sostituisci colore, Operazioni di pagina, Back-end, lato server" + } +} diff --git a/frontend/public/locales/ja-JP/translation.json b/frontend/public/locales/ja-JP/translation.json index c68b843ba..022c762d9 100644 --- a/frontend/public/locales/ja-JP/translation.json +++ b/frontend/public/locales/ja-JP/translation.json @@ -1,4 +1,36 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", "keepWorking": "作業を続ける", "discardChanges": "変更を破棄", "applyAndContinue": "適用して続行", @@ -22,8 +54,26 @@ "customTextDesc": "カスタムテキスト", "numberPagesDesc": "番号をつけるページ、デフォルトは'all'、 1-5 や 2,5,9 など", "customNumberDesc": "デフォルトは{n}、'{n} / {total} ページ'、'テキスト-{n}'、'{filename}-{n}など'", - "submit": "ページ番号の追加" + "submit": "ページ番号の追加", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "カスタムページ選択(ページ番号1、5、6または2n + 1などの関数のコンマ区切りリストを入力します):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "PDFを選択", "multiPdfPrompt": "PDFを選択 (2つ以上)", "multiPdfDropPrompt": "PDFを選択 (又はドラッグ&ドロップ)", @@ -34,7 +84,6 @@ "uploadLimitExceededPlural": "のサイズが大きすぎます。許可された最大サイズは", "processTimeWarning": "警告:この処理はファイルサイズによって1分程度かかることがあります", "pageOrderPrompt": "ページ順序 (ページ番号をカンマ区切り又は2n+1のような関数で入力):", - "pageSelectionPrompt": "カスタムページ選択(ページ番号1、5、6または2n + 1などの関数のコンマ区切りリストを入力します):", "goToPage": "移動", "true": "真", "false": "偽", @@ -45,10 +94,18 @@ "save": "保存", "saveToBrowser": "ブラウザへ保存", "download": "ダウンロード", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", "undo": "元に戻す", "moreOptions": "その他のオプション", "editYourNewFiles": "新しいファイルを編集", "close": "閉じる", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "選択中:{{filename}}", "chooseFile": "ファイルを選択", "filesSelected": "選択されたファイル", @@ -58,7 +115,9 @@ "uploadFiles": "ファイルをアップロード", "addFiles": "ファイルを追加", "selectFromWorkbench": "ワークベンチからファイルを選択または ", - "selectMultipleFromWorkbench": "ワークベンチから少なくとも {{count}} 件選択または " + "selectMultipleFromWorkbench": "ワークベンチから少なくとも {{count}} 件選択または ", + "created": "Created", + "size": "File Size" }, "noFavourites": "お気に入りはありません", "downloadComplete": "ダウンロード完了", @@ -95,6 +154,9 @@ "githubSubmit": "GitHub - チケットを提出", "discordSubmit": "Discord - サポート投稿を提出" }, + "warning": { + "tooltipTitle": "Warning" + }, "edit": "編集", "delete": "削除", "username": "ユーザー名", @@ -141,6 +203,7 @@ "page": "ページ", "pages": "ページ", "loading": "読込中...", + "review": "Review", "addToDoc": "ドキュメントに追加", "reset": "リセット", "apply": "適用", @@ -187,6 +250,7 @@ "title": "Stirling PDFをもっと良くしたいですか?", "paragraph1": "Stirling PDFでは、製品の改善に役立つ分析機能をオプトインしています。個人情報やファイルの内容を追跡することはありません。", "paragraph2": "Stirling-PDFの成長を支援しユーザーをより深く理解できるように分析を有効にすることを検討してください。", + "learnMore": "Learn more", "enable": "分析を有効にする", "disable": "分析を無効にする", "settings": "config/settings.ymlファイルでアナリティクスの設定を変更できます。" @@ -230,6 +294,54 @@ "cacheInputs": { "name": "フォームの入力を保存する", "help": "以前使用した入力を保存し、次回から使用できるようにする。" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -301,8 +413,10 @@ "top20": "トップ20", "all": "すべて", "refresh": "更新", - "includeHomepage": "ホームページを含める ('/')", - "includeLoginPage": "ログインページを含める ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "エンドポイント合計", "totalVisits": "総訪問数", "showing": "表示", @@ -317,7 +431,9 @@ "top": "トップ", "numberOfVisits": "訪問回数", "visitsTooltip": "訪問数: {0} (合計の{1}%)", - "retry": "再試行" + "retry": "再試行", + "includeHomepage": "ホームページを含める ('/')", + "includeLoginPage": "ログインページを含める ('/login')" }, "database": { "title": "データベースのインポート/エクスポート", @@ -358,6 +474,16 @@ "alphabetical": "アルファベット順", "globalPopularity": "グローバル人気", "sortBy": "ソート順:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { "tags": "multiple,tools", "title": "PDFマルチツール", @@ -543,11 +669,6 @@ "title": "手動墨消し", "desc": "選択したテキスト、描画した図形、選択したページに基づいてPDFを墨消します。" }, - "overlayPdfs": { - "tags": "overlay,combine,stack", - "title": "PDF をオーバーレイ", - "desc": "PDF を別の PDF に重ね合わせます" - }, "splitBySections": { "tags": "split,sections,divide", "title": "セクションで PDF を分割", @@ -652,6 +773,15 @@ "tags": "workflow,sequence,automation", "title": "自動化", "desc": "PDF アクションを連結して複数ステップのワークフローを構築。繰り返し作業に最適です。" + }, + "overlay-pdfs": { + "desc": "Overlay one PDF on top of another", + "title": "Overlay PDFs" + }, + "overlayPdfs": { + "tags": "overlay,combine,stack", + "title": "PDF をオーバーレイ", + "desc": "PDF を別の PDF に重ね合わせます" } }, "landing": { @@ -691,13 +821,19 @@ "merge": { "tags": "merge,Page operations,Back end,server side", "title": "結合", - "removeDigitalSignature.tooltip": { - "title": "デジタル署名を削除", - "description": "ファイルを結合するとデジタル署名は無効になります。最終的な結合 PDF から署名を削除するにはチェックを入れてください。" + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "デジタル署名を削除", + "description": "ファイルを結合するとデジタル署名は無効になります。最終的な結合 PDF から署名を削除するにはチェックを入れてください。" + } }, - "generateTableOfContents.tooltip": { - "title": "目次を生成", - "description": "元のファイル名とページ番号に基づいて、結合後の PDF にクリック可能な目次を自動作成します。" + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "目次を生成", + "description": "元のファイル名とページ番号に基づいて、結合後の PDF にクリック可能な目次を自動作成します。" + } }, "submit": "結合", "sortBy": { @@ -729,22 +865,176 @@ "splitPages": "分割するページ番号を入力:", "submit": "分割", "steps": { + "chooseMethod": "Choose Method", "settings": "設定" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "ファイルサイズ" + "name": "ファイルサイズ", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "ファイルサイズ" + "label": "ファイルサイズ", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method" }, "rotate": { "title": "PDFの回転", - "submit": "回転" + "submit": "回転", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + } }, "convert": { "title": "変換", @@ -812,7 +1102,8 @@ "imagesExt": "画像(JPG、PNG など)", "markdown": "Markdown", "textRtf": "テキスト/RTF", - "grayscale": "グレースケール" + "grayscale": "グレースケール", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversion,img,jpg,picture,photo,psd,photoshop" @@ -850,7 +1141,33 @@ "8": "最後を削除", "9": "最初と最後を削除", "10": "奇数-偶数の結合", - "11": "すべてのページを複製" + "11": "すべてのページを複製", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(例:1,3,2または4-8,2,10-12または2n-1)" }, @@ -873,12 +1190,185 @@ }, "watermark": { "title": "透かしの追加", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", "submit": "透かしを追加", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, "watermarkType": { - "text": "テキスト" + "text": "テキスト", + "image": "Image" }, "settings": { - "fontSize": "フォントサイズ" + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "フォントサイズ", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Text", + "2": "Image" } }, "permissions": { @@ -903,9 +1393,152 @@ "removePages": { "tags": "Remove pages,delete pages", "title": "削除", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "削除" }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" + } + } + }, "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", "header": { "title": "ページ選択ガイド" }, @@ -964,7 +1597,18 @@ "tags": "remove,delete,form,field,readonly", "title": "フォームフィールドから読み取り専用を削除", "header": "PDFフォームのロックを解除", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { "header": "メタデータの変更", @@ -1044,6 +1688,15 @@ "header": { "title": "PDF メタデータの概要" }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, "dates": { "title": "日付フィールド", "text": "文書の作成日時と最終更新日時です。", @@ -1191,6 +1844,9 @@ "text": "OCR のアーティファクトを除去し、テキストレイヤーを最適化して可読性の向上とファイルサイズの縮小を図ります。" } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1277,16 +1933,53 @@ }, "info": "Pythonがインストールされていません。実行する必要があります。" }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { "title": "署名", "header": "PDFに署名", "upload": "画像をアップロード", - "draw": "署名を書く", - "text": "テキスト入力", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "クリア", "add": "追加", "saved": "保存された署名", "save": "署名を保存", + "applySignatures": "Apply Signatures", "personalSigs": "個人署名", "sharedSigs": "共有署名", "noSavedSigs": "保存された署名が見つかりません", @@ -1298,7 +1991,42 @@ "previous": "前のページ", "maintainRatio": "アスペクト比を維持を切替え", "undo": "元に戻す", - "redo": "やり直す" + "redo": "やり直す", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + } }, "flatten": { "title": "平坦化", @@ -1315,7 +2043,10 @@ "options": { "stepTitle": "フラット化オプション", "title": "フラット化オプション", - "flattenOnlyForms.desc": "フォームフィールドのみをフラット化し、その他のインタラクティブ要素は維持します", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "フォームフィールドのみをフラット化し、その他のインタラクティブ要素は維持します" + }, "note": "フラット化すると PDF からインタラクティブ要素が削除され、編集できなくなります。" }, "results": { @@ -1350,20 +2081,84 @@ "tags": "fix,restore,correction,recover", "title": "修復", "header": "PDFを修復", - "submit": "修復" + "submit": "修復", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { "title": "空白の削除", "header": "空白ページの削除", - "threshold": "しきい値 :", - "whitePercent": "白比率", - "submit": "空白ページの削除" + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "空白ページの削除", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + } }, "removeAnnotations": { "tags": "comments,highlight,notes,markup,remove", "title": "注釈の削除", "header": "注釈の削除", - "submit": "削除" + "submit": "削除", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "差分,対比,変更,分析", @@ -1449,7 +2244,12 @@ "bullet3": "署名を配置するページを選択可能", "bullet4": "任意でロゴを含められます" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, "sign": { "submit": "PDF に署名", @@ -1510,14 +2310,40 @@ "text": "keytool でファイルを Java キーストア(.jks)に変換し、JKS を選択してください。" } } - } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Certificate Password", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo" }, "removeCertSign": { "tags": "authenticate,PEM,P12,official,decrypt", "title": "証明書署名の削除", "header": "PDFから電子証明書を削除する", "selectPDF": "PDFファイルの選択:", - "submit": "署名の削除" + "submit": "署名の削除", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "merge,composite,single-view,organize", @@ -1525,7 +2351,17 @@ "header": "マルチページレイアウト", "pagesPerSheet": "1枚あたりのページ数:", "addBorder": "境界線を追加", - "submit": "送信" + "submit": "送信", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "小冊子,面付け,印刷,製本,折り,折丁", @@ -1711,10 +2547,22 @@ "reset": "PDF 全体にリセット", "coordinates": { "title": "位置とサイズ", - "x": "X 位置", - "y": "Y 位置", - "width": "幅", - "height": "高さ" + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } }, "error": { "invalidArea": "切り抜き範囲が PDF の境界を超えています", @@ -1732,6 +2580,10 @@ }, "results": { "title": "切り抜き結果" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." } }, "autoSplitPDF": { @@ -1819,20 +2671,118 @@ "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "手動墨消し", "submit": "編集", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, "auto": { + "header": "Auto Redact", "settings": { + "title": "Redaction Settings", "advancedTitle": "アドバンスド" }, + "colorLabel": "Box Colour", "wordsToRedact": { - "add": "追加" + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "追加", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } } }, "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", "pageRedactionNumbers": { "title": "ページ", "placeholder": "(例:1,2,8、4,7,12-16、2n-1)" }, - "export": "エクスポート" + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "エクスポート", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" } }, "tableExtraxt": { @@ -1844,11 +2794,15 @@ "overlay-pdfs": { "tags": "Overlay", "header": "PDFのオーバーレイ", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "ベースのPDFを選択" }, "overlayFiles": { - "label": "重ねるPDFを選択" + "label": "重ねるPDFを選択", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "オーバーレイモードの選択", @@ -1858,14 +2812,53 @@ }, "counts": { "label": "オーバーレイ回数 (固定リピートモード用)", - "placeholder": "カンマ区切りでカウントを入力 (例:2,3,1)" + "placeholder": "カンマ区切りでカウントを入力 (例:2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "重ね位置の選択", "foreground": "前面", "background": "背面" }, - "submit": "重ねる" + "submit": "重ねる", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Section Split, Divide, Customize,Customise", @@ -1900,7 +2893,18 @@ "customMargin": "余白のカスタム", "customColor": "文字色のカスタム", "submit": "送信", - "noStampSelected": "スタンプが選択されていません。ステップ1に戻ってください。" + "noStampSelected": "スタンプが選択されていません。ステップ1に戻ってください。", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Remove Image,Page operations,Back end,server side" @@ -1918,7 +2922,8 @@ "status": { "_value": "状態", "valid": "有効", - "invalid": "無効" + "invalid": "無効", + "complete": "Validation complete" }, "signer": "署名者", "date": "日付", @@ -1945,14 +2950,115 @@ "version": "バージョン", "keyUsage": "キーの使用法", "selfSigned": "自己署名", - "bits": "ビット" + "bits": "ビット", + "details": "Certificate Details" }, "signature": { "info": "署名情報", "_value": "署名", "mathValid": "署名は数学的には有効ですが:" }, - "selectCustomCert": "カスタム証明書ファイル X.509 (オプション)" + "selectCustomCert": "カスタム証明書ファイル X.509 (オプション)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" + }, + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" + }, + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "サインイン", @@ -1985,6 +3091,11 @@ "enterEmail": "メールアドレスを入力", "enterPassword": "パスワードを入力", "loggingIn": "サインイン中...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", "signingIn": "サインイン中...", "login": "ログイン", "or": "または", @@ -2002,12 +3113,54 @@ "magicLinkSent": "マジックリンクを {{email}} に送信しました! メールを確認してリンクをクリックし、サインインしてください。", "passwordResetSent": "パスワード再設定リンクを {{email}} に送信しました! メールの指示に従ってください。", "failedToSignIn": "{{provider}} でのサインインに失敗しました:{{message}}", - "unexpectedError": "予期しないエラー:{{message}}" + "unexpectedError": "予期しないエラー:{{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDFを単一ページに変換", "header": "PDFを単一ページに変換", - "submit": "単一ページに変換" + "submit": "単一ページに変換", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "ページの抽出", @@ -2031,10 +3184,23 @@ "adjustContrast": { "title": "コントラストの調整", "header": "コントラストの調整", + "basic": "Basic Adjustments", "contrast": "コントラスト:", "brightness": "明度:", "saturation": "彩度:", - "download": "ダウンロード" + "download": "ダウンロード", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "圧縮", @@ -2181,7 +3347,13 @@ "title": "画像の削除", "header": "画像の削除", "removeImage": "画像の削除", - "submit": "画像を削除" + "submit": "画像を削除", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "PDFをチャプターごとに分割", @@ -2215,6 +3387,12 @@ }, "note": "リリースノートは英語でのみで提供されています" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "クッキーの使用方法", @@ -2250,8 +3428,26 @@ "title": "分析", "description": "これらのCookieはツールがどのように使用されているかを把握するのに役立ちます。これによりコミュニティが最も重視する機能の開発に集中することができます。ご安心ください。Stirling PDFはお客様が操作するドキュメントの内容を追跡することは決してありません。" } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, + "removeMetadata": { + "submit": "Remove Metadata" + }, + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, "pageEditor": { "title": "ページエディタ", "save": "変更を保存", @@ -2271,9 +3467,44 @@ "fitToWidth": "幅に合わせる", "actualSize": "原寸" }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "すべて選択", - "deselectAll": "選択を解除" + "deselectAll": "選択を解除", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." }, "guestBanner": { "title": "ゲストとして Stirling PDF を利用中です!", @@ -2281,8 +3512,626 @@ "dismiss": "バナーを閉じる", "signUp": "無料で登録" }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } + }, "quickAccess": { - "sign": "署名" + "read": "Read", + "sign": "署名", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { "selectFile": "ファイルを選択", @@ -2308,6 +4157,9 @@ "addFiles": "ファイルを追加", "dragFilesInOrClick": "ファイルをドラッグするか「ファイルを追加」をクリックして参照" }, + "fileEditor": { + "addFiles": "Add Files" + }, "fileManager": { "title": "PDF ファイルをアップロード", "subtitle": "ツール間で簡単にアクセスできるよう、ファイルをストレージに追加", @@ -2336,6 +4188,7 @@ "lastModified": "最終更新", "toolChain": "適用ツール", "restore": "復元", + "unzip": "Unzip", "searchFiles": "ファイルを検索...", "recent": "最近使用", "localFiles": "ローカルファイル", @@ -2343,7 +4196,6 @@ "googleDriveShort": "ドライブ", "myFiles": "マイファイル", "noRecentFiles": "最近のファイルは見つかりませんでした", - "dropFilesHint": "ここにドロップしてアップロード", "googleDriveNotAvailable": "Google ドライブ連携は利用できません", "openFiles": "複数ファイルを開く", "openFile": "ファイルを開く", @@ -2361,12 +4213,74 @@ "selectedCount": "{{count}} 件選択", "download": "ダウンロード", "delete": "削除", - "unsupported": "未対応" + "unsupported": "未対応", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "ここにドロップしてアップロード" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDFをサニタイズ", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "設定" + "files": "Files", + "settings": "設定", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } } }, "addPassword": { @@ -2479,9 +4393,21 @@ "tags": "secure,Decrypt,security,unpassword,delete password", "password": { "stepTitle": "パスワードの削除", - "label": "現在のパスワード" + "label": "現在のパスワード", + "placeholder": "Enter current password", + "completed": "Password configured" }, - "submit": "削除" + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "削除", + "results": { + "title": "Decrypted PDFs" + } }, "automate": { "title": "自動化", @@ -2575,9 +4501,14 @@ "remaining": "残り", "used": "使用済み", "available": "利用可能", - "cancel": "キャンセル" + "cancel": "キャンセル", + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { "title": "アカウント設定", @@ -2633,7 +4564,570 @@ "submit": "添付を追加", "results": { "title": "添付結果" + }, + "error": { + "failed": "Add attachments operation failed" } }, - "logOut": "ログアウト" -} \ No newline at end of file + "termsAndConditions": "Terms & Conditions", + "logOut": "ログアウト", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or invert colour options", + "2": "Default (preset high contrast colours)", + "3": "Custom (choose your own colours)", + "4": "Full invert (invert all colours)", + "5": "High contrast color options", + "6": "White text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + } +} diff --git a/frontend/public/locales/ko-KR/translation.json b/frontend/public/locales/ko-KR/translation.json index b2acda78b..1e5f7ad36 100644 --- a/frontend/public/locales/ko-KR/translation.json +++ b/frontend/public/locales/ko-KR/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "사용자 지정 텍스트", "numberPagesDesc": "번호를 매길 페이지, 기본값 'all', 1-5 또는 2,5,9 등도 가능", "customNumberDesc": "기본값은 {n}, '페이지 {n} / {total}', '텍스트-{n}', '{filename}-{n}' 등도 가능", - "submit": "페이지 번호 추가" + "submit": "페이지 번호 추가", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "사용자 지정 페이지 선택 (페이지 번호 1,5,6 또는 2n+1과 같은 함수를 쉼표로 구분하여 목록 입력):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "PDF 선택", "multiPdfPrompt": "PDF 선택 (2개 이상)", "multiPdfDropPrompt": "필요한 모든 PDF를 선택(또는 끌어다 놓기)하세요", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "경고: 이 과정은 파일 크기에 따라 최대 1분이 소요될 수 있습니다", "pageOrderPrompt": "사용자 지정 페이지 순서 (쉼표로 구분된 페이지 번호 목록 또는 2n+1과 같은 함수 입력):", - "pageSelectionPrompt": "사용자 지정 페이지 선택 (페이지 번호 1,5,6 또는 2n+1과 같은 함수를 쉼표로 구분하여 목록 입력):", "goToPage": "이동", "true": "참", "false": "거짓", "unknown": "알 수 없음", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "저장", "saveToBrowser": "브라우저에 저장", + "download": "다운로드", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "닫기", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "개의 파일이 선택됨", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "즐겨찾기가 추가되지 않았습니다", "downloadComplete": "다운로드 완료", "bored": "기다리는 것이 지루하신가요?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF 문서가 비밀번호로 보호되어 있으며, 비밀번호가 제공되지 않았거나 올바르지 않습니다", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "오류", + "dismissAllErrors": "Dismiss All Errors", "sorry": "문제가 발생해 죄송합니다!", "needHelp": "도움이 필요하신가요 / 문제를 발견하셨나요?", "contactTip": "여전히 문제가 있다면 주저하지 마시고 도움을 요청하세요. GitHub 페이지에서 티켓을 제출하거나 Discord를 통해 연락하실 수 있습니다:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - 티켓 제출", "discordSubmit": "Discord - 지원 게시물 작성" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "삭제", "username": "사용자 이름", "password": "비밀번호", @@ -82,6 +169,7 @@ "green": "초록", "blue": "파랑", "custom": "사용자 지정...", + "comingSoon": "Coming soon", "WorkInProgess": "작업 진행 중, 작동하지 않거나 버그가 있을 수 있습니다. 문제가 있으면 신고해 주세요!", "poweredBy": "제공", "yes": "예", @@ -115,12 +203,14 @@ "page": "페이지", "pages": "페이지", "loading": "로딩 중...", + "review": "Review", "addToDoc": "문서에 추가", "reset": "초기화", "apply": "적용", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "개인정보 처리방침", + "iAgreeToThe": "I agree to all of the", "terms": "이용약관", "accessibility": "접근성", "cookie": "쿠키 정책", @@ -160,6 +250,7 @@ "title": "Stirling PDF를 더 좋게 만들고 싶으신가요?", "paragraph1": "Stirling PDF는 제품 개선을 위한 선택적 분석 기능이 있습니다. 개인정보나 파일 내용은 추적하지 않습니다.", "paragraph2": "Stirling-PDF의 성장을 돕고 사용자를 더 잘 이해할 수 있도록 분석 기능 활성화를 고려해주세요.", + "learnMore": "Learn more", "enable": "분석 활성화", "disable": "분석 비활성화", "settings": "config/settings.yml 파일에서 분석 설정을 변경할 수 있습니다" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "입력 양식 저장", "help": "다음 실행을 위해 이전에 사용한 입력을 저장하도록 활성화" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "데이터베이스 가져오기/내보내기", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF 멀티 도구", "desc": "병합, 회전, 재배치, 분할 및 페이지 제거" }, "merge": { + "tags": "combine,join,unite", "title": "병합", "desc": "여러 PDF를 하나로 쉽게 병합합니다." }, "split": { + "tags": "divide,separate,break", "title": "분할", "desc": "PDF를 여러 문서로 분할" }, "rotate": { + "tags": "turn,flip,orient", "title": "회전", "desc": "PDF를 쉽게 회전합니다." }, + "convert": { + "tags": "transform,change", + "title": "변환", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "정리", + "desc": "원하는 순서로 페이지 제거/재배치" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "이미지 추가", + "desc": "PDF의 지정된 위치에 이미지 추가" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "워터마크 추가", + "desc": "PDF 문서에 사용자 지정 워터마크를 추가합니다." + }, + "removePassword": { + "tags": "unlock", + "title": "비밀번호 제거", + "desc": "PDF 문서에서 비밀번호 보호를 제거합니다." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "압축", + "desc": "PDF를 압축하여 파일 크기를 줄입니다." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "메타데이터 변경", + "desc": "PDF 문서에서 메타데이터 변경/제거/추가" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / 스캔 정리", + "desc": "스캔을 정리하고 PDF 내 이미지에서 텍스트를 감지하여 다시 텍스트로 추가합니다." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "이미지 추출", + "desc": "PDF에서 모든 이미지를 추출하여 zip으로 저장" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "서명", + "desc": "그리기, 텍스트 또는 이미지로 PDF에 서명 추가" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "평면화", + "desc": "PDF에서 모든 대화형 요소와 양식 제거" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "인증서로 서명", + "desc": "인증서/키(PEM/P12)로 PDF에 서명" + }, + "repair": { + "tags": "fix,restore", + "title": "복구", + "desc": "손상/깨진 PDF를 복구 시도" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "빈 페이지 제거", + "desc": "문서에서 빈 페이지를 감지하고 제거합니다" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "주석 제거", + "desc": "PDF에서 모든 주석/메모를 제거합니다" + }, + "compare": { + "tags": "difference", + "title": "비교", + "desc": "2개의 PDF 문서를 비교하고 차이점을 보여줍니다" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "인증서 서명 제거", + "desc": "PDF에서 인증서 서명 제거" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "다중 페이지 레이아웃", + "desc": "PDF 문서의 여러 페이지를 하나의 페이지로 병합" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "페이지 크기/배율 조정", + "desc": "페이지 및 내용의 크기/배율을 변경합니다." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "페이지 번호 추가", + "desc": "문서 전체에 지정된 위치에 페이지 번호 추가" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "색상/대비 조정", + "desc": "PDF의 대비, 채도 및 밝기 조정" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF 자르기", + "desc": "PDF를 잘라서 크기 줄이기(텍스트 유지!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "자동 페이지 분할", + "desc": "물리적 스캔 페이지 분할기 QR 코드가 있는 스캔된 PDF 자동 분할" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "PDF 모든 정보 가져오기", + "desc": "PDF에서 가능한 모든 정보 가져오기" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "단일 큰 페이지", + "desc": "모든 PDF 페이지를 하나의 큰 단일 페이지로 병합" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "JavaScript 보기", + "desc": "PDF에 삽입된 JavaScript 검색 및 표시" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "수동 검열", + "desc": "선택한 텍스트, 그린 도형 및/또는 선택한 페이지를 기반으로 PDF 검열" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "이미지 제거", + "desc": "파일 크기를 줄이기 위해 PDF에서 이미지 제거" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "챕터별 PDF 분할", + "desc": "PDF를 챕터 구조에 따라 여러 파일로 분할합니다." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "PDF 서명 검증", + "desc": "PDF 문서의 디지털 서명과 인증서 검증" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "페이지 추출", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "제거", + "desc": "PDF 문서에서 원하지 않는 페이지를 삭제합니다." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "크기/개수별 자동 분할", + "desc": "단일 PDF를 크기, 페이지 수 또는 문서 수를 기준으로 여러 문서로 분할" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "비밀번호 추가", + "desc": "PDF 문서를 비밀번호로 암호화합니다." + }, + "changePermissions": { + "title": "권한 변경", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "PDF를 다른 PDF 위에 오버레이", + "title": "PDF 오버레이" + }, "imageToPDF": { "title": "이미지를 PDF로", "desc": "이미지(PNG, JPEG, GIF)를 PDF로 변환합니다." @@ -355,18 +786,6 @@ "title": "PDF를 이미지로", "desc": "PDF를 이미지로 변환합니다. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "정리", - "desc": "원하는 순서로 페이지 제거/재배치" - }, - "addImage": { - "title": "이미지 추가", - "desc": "PDF의 지정된 위치에 이미지 추가" - }, - "watermark": { - "title": "워터마크 추가", - "desc": "PDF 문서에 사용자 지정 워터마크를 추가합니다." - }, "permissions": { "title": "권한 변경", "desc": "PDF 문서의 권한을 변경합니다" @@ -375,38 +794,10 @@ "title": "제거", "desc": "PDF 문서에서 원하지 않는 페이지를 삭제합니다." }, - "addPassword": { - "title": "비밀번호 추가", - "desc": "PDF 문서를 비밀번호로 암호화합니다." - }, - "removePassword": { - "title": "비밀번호 제거", - "desc": "PDF 문서에서 비밀번호 보호를 제거합니다." - }, - "compress": { - "title": "압축", - "desc": "PDF를 압축하여 파일 크기를 줄입니다." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "메타데이터 변경", - "desc": "PDF 문서에서 메타데이터 변경/제거/추가" - }, "fileToPDF": { "title": "파일을 PDF로 변환", "desc": "거의 모든 파일을 PDF로 변환합니다(DOCX, PNG, XLS, PPT, TXT 등)" }, - "ocr": { - "title": "OCR / 스캔 정리", - "desc": "스캔을 정리하고 PDF 내 이미지에서 텍스트를 감지하여 다시 텍스트로 추가합니다." - }, - "extractImages": { - "title": "이미지 추출", - "desc": "PDF에서 모든 이미지를 추출하여 zip으로 저장" - }, "pdfToPDFA": { "title": "PDF를 PDF/A로", "desc": "장기 보관을 위해 PDF를 PDF/A로 변환" @@ -435,70 +826,14 @@ "title": "스캔한 사진 감지/분할", "desc": "사진/PDF 내의 여러 사진을 분할합니다" }, - "sign": { - "title": "서명", - "desc": "그리기, 텍스트 또는 이미지로 PDF에 서명 추가" - }, - "flatten": { - "title": "평면화", - "desc": "PDF에서 모든 대화형 요소와 양식 제거" - }, - "repair": { - "title": "복구", - "desc": "손상/깨진 PDF를 복구 시도" - }, - "removeBlanks": { - "title": "빈 페이지 제거", - "desc": "문서에서 빈 페이지를 감지하고 제거합니다" - }, - "removeAnnotations": { - "title": "주석 제거", - "desc": "PDF에서 모든 주석/메모를 제거합니다" - }, - "compare": { - "title": "비교", - "desc": "2개의 PDF 문서를 비교하고 차이점을 보여줍니다" - }, - "certSign": { - "title": "인증서로 서명", - "desc": "인증서/키(PEM/P12)로 PDF에 서명" - }, - "removeCertSign": { - "title": "인증서 서명 제거", - "desc": "PDF에서 인증서 서명 제거" - }, - "pageLayout": { - "title": "다중 페이지 레이아웃", - "desc": "PDF 문서의 여러 페이지를 하나의 페이지로 병합" - }, - "scalePages": { - "title": "페이지 크기/배율 조정", - "desc": "페이지 및 내용의 크기/배율을 변경합니다." - }, "pipeline": { "title": "파이프라인", "desc": "파이프라인 스크립트를 정의하여 PDF에서 여러 작업 실행" }, - "addPageNumbers": { - "title": "페이지 번호 추가", - "desc": "문서 전체에 지정된 위치에 페이지 번호 추가" - }, "auto-rename": { "title": "PDF 파일 자동 이름 변경", "desc": "감지된 헤더를 기반으로 PDF 파일 이름 자동 변경" }, - "adjustContrast": { - "title": "색상/대비 조정", - "desc": "PDF의 대비, 채도 및 밝기 조정" - }, - "crop": { - "title": "PDF 자르기", - "desc": "PDF를 잘라서 크기 줄이기(텍스트 유지!)" - }, - "autoSplitPDF": { - "title": "자동 페이지 분할", - "desc": "물리적 스캔 페이지 분할기 QR 코드가 있는 스캔된 PDF 자동 분할" - }, "sanitizePDF": { "title": "정리", "desc": "PDF 파일에서 스크립트 및 기타 요소 제거" @@ -519,30 +854,14 @@ "title": "PDF를 Markdown으로", "desc": "PDF를 Markdown으로 변환" }, - "getPdfInfo": { - "title": "PDF 모든 정보 가져오기", - "desc": "PDF에서 가능한 모든 정보 가져오기" - }, "pageExtracter": { "title": "페이지 추출", "desc": "PDF에서 선택한 페이지 추출" }, - "pdfToSinglePage": { - "title": "단일 큰 페이지", - "desc": "모든 PDF 페이지를 하나의 큰 단일 페이지로 병합" - }, - "showJS": { - "title": "JavaScript 보기", - "desc": "PDF에 삽입된 JavaScript 검색 및 표시" - }, "autoRedact": { "title": "자동 검열", "desc": "입력 텍스트를 기반으로 PDF의 텍스트 자동 검열(가림)" }, - "redact": { - "title": "수동 검열", - "desc": "선택한 텍스트, 그린 도형 및/또는 선택한 페이지를 기반으로 PDF 검열" - }, "PDFToCSV": { "title": "PDF를 CSV로", "desc": "PDF에서 표를 추출하여 CSV로 변환" @@ -551,10 +870,6 @@ "title": "크기/개수별 자동 분할", "desc": "단일 PDF를 크기, 페이지 수 또는 문서 수를 기준으로 여러 문서로 분할" }, - "overlay-pdfs": { - "title": "PDF 오버레이", - "desc": "PDF를 다른 PDF 위에 오버레이" - }, "split-by-sections": { "title": "섹션별 PDF 분할", "desc": "PDF의 각 페이지를 더 작은 가로 및 세로 섹션으로 분할" @@ -563,43 +878,17 @@ "title": "PDF에 스탬프 추가", "desc": "지정된 위치에 텍스트 또는 이미지 스탬프 추가" }, - "removeImage": { - "title": "이미지 제거", - "desc": "파일 크기를 줄이기 위해 PDF에서 이미지 제거" - }, - "splitByChapters": { - "title": "챕터별 PDF 분할", - "desc": "PDF를 챕터 구조에 따라 여러 파일로 분할합니다." - }, - "validateSignature": { - "title": "PDF 서명 검증", - "desc": "PDF 문서의 디지털 서명과 인증서 검증" - }, "replace-color": { "title": "색상 교체 및 반전", "desc": "PDF에서 텍스트와 배경의 색상을 교체하고 파일 크기를 줄이기 위해 전체 PDF 색상을 반전" }, - "convert": { - "title": "변환" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "페이지 추출" - }, - "removePages": { - "title": "제거", - "desc": "PDF 문서에서 원하지 않는 페이지를 삭제합니다." - }, "removeImagePdf": { "title": "이미지 제거", "desc": "파일 크기를 줄이기 위해 PDF에서 이미지 제거" }, - "autoSizeSplitPDF": { - "title": "크기/개수별 자동 분할", - "desc": "단일 PDF를 크기, 페이지 수 또는 문서 수를 기준으로 여러 문서로 분할" - }, "adjust-contrast": { "title": "색상/대비 조정", "desc": "PDF의 대비, 채도 및 밝기 조정" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "색상 교체 및 반전", "desc": "PDF에서 텍스트와 배경의 색상을 교체하고 파일 크기를 줄이기 위해 전체 PDF 색상을 반전" - }, - "changePermissions": { - "title": "권한 변경" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "보기,읽기,주석,텍스트,이미지", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "병합,페이지 작업,백엔드,서버 사이드", "title": "병합", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "병합", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "파일 이름", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "여러 PDF 병합 (2개 이상)", "sortByName": "이름으로 정렬", "sortByDate": "날짜로 정렬", - "removeCertSign": "병합된 파일에서 디지털 서명을 제거하시겠습니까?", - "submit": "병합", - "sortBy": { - "filename": "파일 이름" - } + "removeCertSign": "병합된 파일에서 디지털 서명을 제거하시겠습니까?" }, "split": { - "tags": "페이지 작업,나누기,멀티 페이지,자르기,서버 사이드", "title": "PDF 분할", "header": "PDF 분할", "desc": { @@ -671,25 +983,249 @@ "splitPages": "분할할 페이지 입력:", "submit": "분할", "steps": { + "chooseMethod": "Choose Method", "settings": "설정" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "파일 크기" + "name": "파일 크기", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "파일 크기" + "label": "파일 크기", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "페이지 작업,나누기,멀티 페이지,자르기,서버 사이드" }, "rotate": { - "tags": "서버 사이드", "title": "PDF 회전", + "submit": "회전", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "서버 사이드", "header": "PDF 회전", - "selectAngle": "회전 각도 선택 (90도 단위):", - "submit": "회전" + "selectAngle": "회전 각도 선택 (90도 단위):" + }, + "convert": { + "title": "변환", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "설정", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "색상", + "greyscale": "그레이스케일", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "페이지 채우기", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF에 디지털 서명이 포함되어 있습니다. 다음 단계에서 제거됩니다.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "그레이스케일", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "변환,이미지,jpg,사진" @@ -727,7 +1263,33 @@ "8": "마지막 페이지 제거", "9": "첫 페이지와 마지막 페이지 제거", "10": "홀수-짝수 병합", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(예: 1,3,2 또는 4-8,2,10-12 또는 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "이미지 추가", "submit": "이미지 추가" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "텍스트,반복,레이블,소유,저작권,상표,이미지,jpg,사진", "title": "워터마크 추가", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "워터마크 추가", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "텍스트", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "글꼴 크기", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "텍스트", + "2": "이미지" + }, + "tags": "텍스트,반복,레이블,소유,저작권,상표,이미지,jpg,사진", "header": "워터마크 추가", "customColor": "사용자 지정 텍스트 색상", "selectText": { @@ -755,17 +1506,6 @@ "8": "워터마크 유형:", "9": "워터마크 이미지:", "10": "PDF를 PDF-이미지로 변환" - }, - "submit": "워터마크 추가", - "type": { - "1": "텍스트", - "2": "이미지" - }, - "watermarkType": { - "text": "텍스트" - }, - "settings": { - "fontSize": "글꼴 크기" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "페이지 제거,페이지 삭제", "title": "제거", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "제거" }, - "addPassword": { - "tags": "보안,보안", - "title": "비밀번호 추가", - "header": "비밀번호 추가 (암호화)", - "selectText": { - "1": "암호화할 PDF 선택", - "2": "사용자 비밀번호", - "3": "암호화 키 길이", - "4": "높은 값이 더 강력하지만 낮은 값이 더 나은 호환성을 제공합니다.", - "5": "설정할 권한 (소유자 비밀번호와 함께 사용 권장)", - "6": "문서 조립 방지", - "7": "콘텐츠 추출 방지", - "8": "접근성을 위한 추출 방지", - "9": "양식 작성 방지", - "10": "수정 방지", - "11": "주석 수정 방지", - "12": "인쇄 방지", - "13": "다른 형식으로 인쇄 방지", - "14": "소유자 비밀번호", - "15": "문서가 열린 후 수행할 수 있는 작업 제한 (모든 리더에서 지원되지 않음)", - "16": "문서 자체 열기 제한" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "암호화", "tooltip": { - "permissions": { - "title": "권한 변경" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "보안,암호 해제,보안,비밀번호 해제,비밀번호 삭제", - "title": "비밀번호 제거", - "header": "비밀번호 제거 (복호화)", - "selectText": { - "1": "복호화할 PDF 선택", - "2": "비밀번호" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "제거", - "desc": "PDF 문서에서 비밀번호 보호를 제거합니다.", - "password": { - "stepTitle": "비밀번호 제거", - "label": "현재 비밀번호" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "제목,저자,날짜,생성,시간,출판사,제작자,통계", - "title": "제목:", "header": "메타데이터 변경", + "submit": "변경", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "제목,저자,날짜,생성,시간,출판사,제작자,통계", "selectText": { "1": "변경하려는 변수를 편집하세요", "2": "모든 메타데이터 삭제", @@ -856,15 +1877,7 @@ "4": "기타 메타데이터:", "5": "사용자 지정 메타데이터 항목 추가" }, - "author": "저자:", - "creationDate": "생성 날짜 (yyyy/MM/dd HH:mm:ss):", - "creator": "작성자:", - "keywords": "키워드:", - "modDate": "수정 날짜 (yyyy/MM/dd HH:mm:ss):", - "producer": "제작자:", - "subject": "제목:", - "trapped": "트랩:", - "submit": "변경" + "modDate": "수정 날짜 (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "변환,형식,문서,사진,슬라이드,텍스트,변환,오피스,문서,워드,엑셀,파워포인트", @@ -878,6 +1891,7 @@ "ocr": { "tags": "인식,텍스트,이미지,스캔,읽기,식별,감지,편집 가능", "title": "OCR / 스캔 정리", + "desc": "스캔을 정리하고 PDF 내 이미지에서 텍스트를 감지하여 다시 텍스트로 추가합니다.", "header": "스캔 정리 / OCR (광학 문자 인식)", "selectText": { "1": "PDF에서 감지할 언어 선택 (현재 감지된 언어가 나열됨):", @@ -896,23 +1910,89 @@ "help": "다른 언어 사용 방법 및/또는 Docker에서 사용하지 않는 방법에 대한 문서를 읽어보세요", "credit": "이 서비스는 OCR을 위해 qpdf와 Tesseract를 사용합니다.", "submit": "OCR로 PDF 처리", - "desc": "스캔을 정리하고 PDF 내 이미지에서 텍스트를 감지하여 다시 텍스트로 추가합니다.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "설정", "ocrMode": { - "label": "OCR 모드" + "label": "OCR 모드", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "언어" + "label": "언어", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR 모드" + "title": "OCR 모드", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "언어" + "title": "언어", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "이미지 추출", "selectText": "추출된 이미지를 변환할 이미지 형식 선택", "allowDuplicates": "중복 이미지 저장", - "submit": "추출" + "submit": "추출", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "아카이브,장기,표준,변환,저장,보존", @@ -993,17 +2079,53 @@ }, "info": "Python이 설치되어 있지 않습니다. 실행하는 데 필요합니다." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "승인,이니셜,그린-서명,텍스트-서명,이미지-서명", "title": "서명", "header": "PDF 서명", "upload": "이미지 업로드", - "draw": "서명 그리기", - "text": "텍스트 입력", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "지우기", "add": "추가", "saved": "저장된 서명", "save": "서명 저장", + "applySignatures": "Apply Signatures", "personalSigs": "개인 서명", "sharedSigs": "공유 서명", "noSavedSigs": "저장된 서명이 없습니다", @@ -1015,42 +2137,179 @@ "previous": "이전 페이지", "maintainRatio": "종횡비 유지 토글", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "승인,이니셜,그린-서명,텍스트-서명,이미지-서명" }, "flatten": { - "tags": "정적,비활성화,비대화형,간소화", "title": "평면화", "header": "PDF 평면화", "flattenOnlyForms": "양식만 평면화", "submit": "평면화", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "설정" }, "options": { - "flattenOnlyForms": "양식만 평면화" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "양식만 평면화", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "정적,비활성화,비대화형,간소화" }, "repair": { "tags": "수정,복원,교정,복구", "title": "복구", "header": "PDF 복구", - "submit": "복구" + "submit": "복구", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "정리,간소화,비콘텐츠,정리", "title": "빈 페이지 제거", "header": "빈 페이지 제거", - "threshold": "픽셀 흰색도 임계값:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "빈 페이지 제거", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "정리,간소화,비콘텐츠,정리", "thresholdDesc": "흰색 픽셀이 얼마나 흰색이어야 '흰색'으로 분류될지 결정하는 임계값. 0 = 검정, 255 순수 흰색.", - "whitePercent": "흰색 비율 (%):", - "whitePercentDesc": "제거되기 위해 필요한 '흰색' 픽셀의 페이지 비율", - "submit": "빈 페이지 제거" + "whitePercentDesc": "제거되기 위해 필요한 '흰색' 픽셀의 페이지 비율" }, "removeAnnotations": { "tags": "댓글,하이라이트,노트,마크업,제거", "title": "주석 제거", "header": "주석 제거", - "submit": "제거" + "submit": "제거", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "차이,대조,변경,분석", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "인증,PEM,P12,공식,암호화", "title": "인증서 서명", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "위치", + "logoTitle": "Logo", + "name": "이름", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "키스토어 또는 개인 키 비밀번호 입력 (있는 경우):", + "passwordOptional": "Leave empty if no password", + "reason": "사유", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "로고 표시", "header": "인증서로 PDF 서명 (개발 중)", "selectPDF": "서명할 PDF 파일 선택:", "jksNote": "참고: 인증서 유형이 아래에 나열되지 않은 경우 keytool 명령줄 도구를 사용하여 Java 키스토어(.jks) 파일로 변환한 다음 아래의 .jks 파일 옵션을 선택하세요.", @@ -1089,13 +2484,7 @@ "selectCert": "인증서 파일 선택 (X.509 형식, .pem 또는 .der):", "selectP12": "PKCS#12 키스토어 파일 선택 (.p12 또는 .pfx) (선택 사항, 제공하는 경우 개인 키와 인증서 포함):", "selectJKS": "Java 키스토어 파일 선택 (.jks 또는 .keystore):", - "certType": "인증서 유형", - "password": "키스토어 또는 개인 키 비밀번호 입력 (있는 경우):", "showSig": "서명 표시", - "reason": "사유", - "location": "위치", - "name": "이름", - "showLogo": "로고 표시", "submit": "PDF 서명" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "인증서 서명 제거", "header": "PDF에서 디지털 서명 제거", "selectPDF": "PDF 파일 선택:", - "submit": "서명 제거" + "submit": "서명 제거", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "병합,합성,단일-보기,정리", @@ -1111,16 +2511,157 @@ "header": "다중 페이지 레이아웃", "pagesPerSheet": "시트당 페이지 수:", "addBorder": "테두리 추가", - "submit": "제출" + "submit": "제출", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "크기조정,수정,치수,조정", "title": "페이지 크기 조정", "header": "페이지 크기 조정", "pageSize": "문서 페이지의 크기입니다.", "keepPageSize": "원본 크기", "scaleFactor": "페이지의 확대/축소 레벨(잘라내기).", - "submit": "제출" + "submit": "제출", + "tags": "크기조정,수정,치수,조정" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "페이지매김,레이블,정리,색인" @@ -1129,16 +2670,83 @@ "tags": "자동-감지,헤더-기반,정리,재레이블링", "title": "자동 이름 변경", "header": "PDF 자동 이름 변경", - "submit": "자동 이름 변경" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "자동 이름 변경", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "색상-보정,조정,수정,향상" }, "crop": { - "tags": "트림,축소,편집,모양", "title": "자르기", "header": "PDF 자르기", - "submit": "제출" + "submit": "제출", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "트림,축소,편집,모양" }, "autoSplitPDF": { "tags": "QR-기반,분리,스캔-세그먼트,정리", @@ -1221,24 +2829,124 @@ "downloadJS": "JavaScript 다운로드", "submit": "보기" }, - "autoRedact": { - "tags": "검열,숨김,검게-가림,검은색,마커,숨김", - "title": "자동 검열", - "header": "자동 검열", - "colorLabel": "색상", - "textsToRedactLabel": "검열할 텍스트 (줄 단위로 구분)", - "textsToRedactPlaceholder": "예: \\n기밀 \\n최고 기밀", - "useRegexLabel": "정규식 사용", - "wholeWordSearchLabel": "전체 단어 검색", - "customPaddingLabel": "사용자 지정 여백", - "convertPDFToImageLabel": "PDF를 PDF-Image로 변환 (박스 뒤의 텍스트 제거에 사용)", - "submitButton": "제출" - }, "redact": { "tags": "검열,숨김,검게-가림,검은색,마커,숨김,수동", "title": "수동 검열", - "header": "수동 검열", "submit": "검열", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "고급" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "추가", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "페이지", + "placeholder": "(예: 1,2,8 또는 4,7,12-16 또는 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "내보내기", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "수동 검열", "textBasedRedaction": "텍스트 기반 검열", "pageBasedRedaction": "페이지 기반 검열", "convertPDFToImageLabel": "PDF를 PDF-이미지로 변환 (박스 뒤의 텍스트 제거에 사용)", @@ -1264,22 +2972,7 @@ "showLayers": "레이어 보기 (더블클릭하여 모든 레이어를 기본 상태로 재설정)", "colourPicker": "색상 선택기", "findCurrentOutlineItem": "현재 개요 항목 찾기", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "고급" - }, - "wordsToRedact": { - "add": "추가" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "페이지", - "placeholder": "(예: 1,2,8 또는 4,7,12-16 또는 2n-1)" - }, - "export": "내보내기" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,테이블-추출,추출,변환" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "오버레이", "header": "PDF 파일 오버레이", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "기본 PDF 파일 선택" }, "overlayFiles": { - "label": "오버레이 PDF 파일 선택" + "label": "오버레이 PDF 파일 선택", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "오버레이 모드 선택", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "오버레이 횟수 (고정 반복 모드용)", - "placeholder": "쉼표로 구분된 횟수 입력 (예: 2,3,1)" + "placeholder": "쉼표로 구분된 횟수 입력 (예: 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "오버레이 위치 선택", "foreground": "전경", "background": "배경" }, - "submit": "제출" + "submit": "제출", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "섹션 분할,나누기,사용자 지정", @@ -1332,6 +3068,7 @@ "tags": "스탬프,이미지 추가,중앙 이미지,워터마크,PDF,삽입,사용자 지정", "header": "PDF 스탬프", "title": "PDF 스탬프", + "stampSetup": "Stamp Setup", "stampType": "스탬프 유형", "stampText": "스탬프 텍스트", "stampImage": "스탬프 이미지", @@ -1344,7 +3081,19 @@ "overrideY": "Y 좌표 재정의", "customMargin": "사용자 지정 여백", "customColor": "사용자 지정 텍스트 색상", - "submit": "제출" + "submit": "제출", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "이미지 제거,페이지 작업,백엔드,서버 사이드" @@ -1362,7 +3111,8 @@ "status": { "_value": "상태", "valid": "유효함", - "invalid": "유효하지 않음" + "invalid": "유효하지 않음", + "complete": "Validation complete" }, "signer": "서명자", "date": "날짜", @@ -1389,40 +3139,122 @@ "version": "버전", "keyUsage": "키 용도", "selfSigned": "자체 서명", - "bits": "비트" + "bits": "비트", + "details": "Certificate Details" }, "signature": { "info": "서명 정보", "_value": "서명", "mathValid": "서명이 수학적으로는 유효하지만:" }, - "selectCustomCert": "사용자 지정 인증서 파일 X.509 (선택사항)" - }, - "replace-color": { - "title": "색상 교체-반전", - "header": "PDF 색상 교체-반전", - "selectText": { - "1": "색상 교체 또는 반전 옵션", - "2": "기본값(기본 고대비 색상)", - "3": "사용자 지정(사용자 지정 색상)", - "4": "전체 반전(모든 색상 반전)", - "5": "고대비 색상 옵션", - "6": "검정 배경에 흰색 텍스트", - "7": "흰색 배경에 검정 텍스트", - "8": "검정 배경에 노란색 텍스트", - "9": "검정 배경에 초록색 텍스트", - "10": "텍스트 색상 선택", - "11": "배경 색상 선택" + "selectCustomCert": "사용자 지정 인증서 파일 X.509 (선택사항)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "교체" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "색상 교체,페이지 작업,백엔드,서버 사이드" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "로그인", "header": "로그인", "signin": "로그인", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "로그인 유지", "invalid": "사용자 이름 또는 비밀번호가 잘못되었습니다.", "locked": "계정이 잠겼습니다.", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "이미 다음에 로그인되어 있습니다", "alreadyLoggedIn2": "개의 기기. 해당 기기에서 로그아웃한 후 다시 시도하세요.", "toManySessions": "활성 세션이 너무 많습니다", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "단일 페이지로 변환", "header": "단일 페이지로 변환", - "submit": "단일 페이지로 변환" + "submit": "단일 페이지로 변환", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "페이지 추출", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "대비 조정", "header": "대비 조정", + "basic": "Basic Adjustments", "contrast": "대비:", "brightness": "밝기:", "saturation": "채도:", - "download": "다운로드" + "download": "다운로드", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "압축", + "desc": "Compress PDFs to reduce their file size.", "header": "PDF 압축", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "파일 크기" + }, "credit": "이 서비스는 PDF 압축/최적화를 위해 qpdf를 사용합니다.", "grayscale": { "label": "압축을 위해 그레이스케일 적용" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1491,10 +3435,7 @@ "4": "자동 모드 - PDF를 정확한 크기로 만들기 위해 품질 자동 조정", "5": "예상 PDF 크기 (예: 25MB, 10.8MB, 25KB)" }, - "submit": "압축", - "method": { - "filesize": "파일 크기" - } + "submit": "압축" }, "decrypt": { "passwordPrompt": "이 파일은 비밀번호로 보호되어 있습니다. 비밀번호를 입력하세요:", @@ -1595,7 +3536,13 @@ "title": "이미지 제거", "header": "이미지 제거", "removeImage": "이미지 제거", - "submit": "이미지 제거" + "submit": "이미지 제거", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "챕터별 PDF 분할", @@ -1629,6 +3576,12 @@ }, "note": "릴리스 노트는 영어로만 제공됩니다" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "다운로드", - "convert": { - "title": "변환", - "settings": "설정", - "color": "색상", - "greyscale": "그레이스케일", - "fillPage": "페이지 채우기", - "pdfaDigitalSignatureWarning": "PDF에 디지털 서명이 포함되어 있습니다. 다음 단계에서 제거됩니다.", - "grayscale": "그레이스케일" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "모두 선택", - "deselectAll": "모두 선택 해제" + "deselectAll": "모두 선택 해제", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "서명" + "read": "Read", + "sign": "서명", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "로딩 중...", - "or": "또는" + "or": "또는", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "이름", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "버전", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "모두 선택", "deselectAll": "모두 선택 해제", "deleteSelected": "선택 항목 삭제", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "다운로드", - "delete": "삭제" + "delete": "삭제", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDF 정리", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "설정" + "files": "Files", + "settings": "설정", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "비밀번호 추가", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "암호화", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "권한 변경", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "보안,보안", + "header": "비밀번호 추가 (암호화)", + "selectText": { + "1": "암호화할 PDF 선택", + "2": "사용자 비밀번호", + "3": "암호화 키 길이", + "4": "높은 값이 더 강력하지만 낮은 값이 더 나은 호환성을 제공합니다.", + "5": "설정할 권한 (소유자 비밀번호와 함께 사용 권장)", + "6": "문서 조립 방지", + "7": "콘텐츠 추출 방지", + "8": "접근성을 위한 추출 방지", + "9": "양식 작성 방지", + "10": "수정 방지", + "11": "주석 수정 방지", + "12": "인쇄 방지", + "13": "다른 형식으로 인쇄 방지", + "14": "소유자 비밀번호", + "15": "문서가 열린 후 수행할 수 있는 작업 제한 (모든 리더에서 지원되지 않음)", + "16": "문서 자체 열기 제한" } }, "changePermissions": { "title": "권한 변경", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "권한 변경", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "문서 조립 방지" @@ -1737,10 +4580,784 @@ "label": "다른 형식으로 인쇄 방지" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "권한 변경" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "비밀번호 제거", + "desc": "PDF 문서에서 비밀번호 보호를 제거합니다.", + "tags": "보안,암호 해제,보안,비밀번호 해제,비밀번호 삭제", + "password": { + "stepTitle": "비밀번호 제거", + "label": "현재 비밀번호", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "제거", + "results": { + "title": "Decrypted PDFs" + }, + "header": "비밀번호 제거 (복호화)", + "selectText": { + "1": "복호화할 PDF 선택", + "2": "비밀번호" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "색상 교체 또는 반전 옵션", + "2": "기본값(기본 고대비 색상)", + "3": "사용자 지정(사용자 지정 색상)", + "4": "전체 반전(모든 색상 반전)", + "5": "고대비 색상 옵션", + "6": "검정 배경에 흰색 텍스트", + "7": "흰색 배경에 검정 텍스트", + "8": "검정 배경에 노란색 텍스트", + "9": "검정 배경에 초록색 텍스트", + "10": "텍스트 색상 선택", + "11": "배경 색상 선택", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "교체", + "title": "색상 교체-반전", + "header": "PDF 색상 교체-반전" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "검열,숨김,검게-가림,검은색,마커,숨김", + "title": "자동 검열", + "header": "자동 검열", + "colorLabel": "색상", + "textsToRedactLabel": "검열할 텍스트 (줄 단위로 구분)", + "textsToRedactPlaceholder": "예: \\n기밀 \\n최고 기밀", + "useRegexLabel": "정규식 사용", + "wholeWordSearchLabel": "전체 단어 검색", + "customPaddingLabel": "사용자 지정 여백", + "convertPDFToImageLabel": "PDF를 PDF-Image로 변환 (박스 뒤의 텍스트 제거에 사용)", + "submitButton": "제출" + }, + "replaceColorPdf": { + "tags": "색상 교체,페이지 작업,백엔드,서버 사이드" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/ml-ML/translation.json b/frontend/public/locales/ml-ML/translation.json index b272c0ee2..1a8b5b7a8 100644 --- a/frontend/public/locales/ml-ML/translation.json +++ b/frontend/public/locales/ml-ML/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "ഇഷ്ടാനുസൃത ടെക്സ്റ്റ്", "numberPagesDesc": "ഏത് പേജുകളാണ് നമ്പർ ചെയ്യേണ്ടത്, സ്ഥിരസ്ഥിതി 'എല്ലാം', 1-5 അല്ലെങ്കിൽ 2,5,9 തുടങ്ങിയവയും സ്വീകരിക്കുന്നു", "customNumberDesc": "സ്ഥിരസ്ഥിതിയായി {n}, 'പേജ് {n} / {total}', 'ടെക്സ്റ്റ്-{n}', '{filename}-{n}' എന്നിവയും സ്വീകരിക്കുന്നു", - "submit": "പേജ് നമ്പറുകൾ ചേർക്കുക" + "submit": "പേജ് നമ്പറുകൾ ചേർക്കുക", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "ഇഷ്ടാനുസൃത പേജ് തിരഞ്ഞെടുക്കൽ (പേജ് നമ്പറുകളുടെ കോമയാൽ വേർതിരിച്ച ലിസ്റ്റ് 1,5,6 അല്ലെങ്കിൽ 2n+1 പോലുള്ള ഫംഗ്ഷനുകൾ നൽകുക) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "PDF(കൾ) തിരഞ്ഞെടുക്കുക", "multiPdfPrompt": "PDF-കൾ തിരഞ്ഞെടുക്കുക (2+)", "multiPdfDropPrompt": "നിങ്ങൾക്ക് ആവശ്യമുള്ള എല്ലാ PDF-കളും തിരഞ്ഞെടുക്കുക (അല്ലെങ്കിൽ വലിച്ചിടുക)", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "വളരെ വലുതാണ്. അനുവദനീയമായ പരമാവധി വലുപ്പം", "processTimeWarning": "മുന്നറിയിപ്പ്: ഫയൽ വലുപ്പത്തിനനുസരിച്ച് ഈ പ്രക്രിയ ഒരു മിനിറ്റ് വരെ എടുത്തേക്കാം", "pageOrderPrompt": "ഇഷ്ടാനുസൃത പേജ് ക്രമം (പേജ് നമ്പറുകളുടെ കോമയാൽ വേർതിരിച്ച ലിസ്റ്റ് അല്ലെങ്കിൽ 2n+1 പോലുള്ള ഫംഗ്ഷനുകൾ നൽകുക) :", - "pageSelectionPrompt": "ഇഷ്ടാനുസൃത പേജ് തിരഞ്ഞെടുക്കൽ (പേജ് നമ്പറുകളുടെ കോമയാൽ വേർതിരിച്ച ലിസ്റ്റ് 1,5,6 അല്ലെങ്കിൽ 2n+1 പോലുള്ള ഫംഗ്ഷനുകൾ നൽകുക) :", "goToPage": "പോകുക", "true": "ശരി", "false": "തെറ്റ്", "unknown": "അജ്ഞാതം", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "സേവ് ചെയ്യുക", "saveToBrowser": "ബ്രൗസറിൽ സേവ് ചെയ്യുക", + "download": "Download", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "അടയ്ക്കുക", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "ഫയലുകൾ തിരഞ്ഞെടുത്തു", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "പ്രിയപ്പെട്ടവ ചേർത്തിട്ടില്ല", "downloadComplete": "ഡൗൺലോഡ് പൂർത്തിയായി", "bored": "കാത്തിരുന്ന് മുഷിഞ്ഞോ?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF ഡോക്യുമെന്റ് പാസ്വേഡ് ഉപയോഗിച്ച് സംരക്ഷിച്ചിരിക്കുന്നു, പാസ്വേഡ് നൽകിയിട്ടില്ല അല്ലെങ്കിൽ തെറ്റായിരുന്നു", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "പിശക്", + "dismissAllErrors": "Dismiss All Errors", "sorry": "പ്രശ്നത്തിന് ക്ഷമിക്കുക!", "needHelp": "സഹായം വേണോ / ഒരു പ്രശ്നം കണ്ടെത്തിയോ?", "contactTip": "നിങ്ങൾക്ക് ഇപ്പോഴും പ്രശ്നമുണ്ടെങ്കിൽ, സഹായത്തിനായി ഞങ്ങളെ ബന്ധപ്പെടാൻ മടിക്കരുത്. ഞങ്ങളുടെ GitHub പേജിൽ നിങ്ങൾക്ക് ഒരു ടിക്കറ്റ് സമർപ്പിക്കാം അല്ലെങ്കിൽ Discord വഴി ഞങ്ങളെ ബന്ധപ്പെടാം:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - ഒരു ടിക്കറ്റ് സമർപ്പിക്കുക", "discordSubmit": "Discord - പിന്തുണാ പോസ്റ്റ് സമർപ്പിക്കുക" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "മായ്ക്കുക", "username": "ഉപയോക്തൃനാമം", "password": "പാസ്വേഡ്", @@ -82,6 +169,7 @@ "green": "പച്ച", "blue": "നീല", "custom": "ഇഷ്ടാനുസൃതം...", + "comingSoon": "Coming soon", "WorkInProgess": "നിർമ്മാണത്തിലിരിക്കുന്നു, ശരിയായി പ്രവർത്തിച്ചേക്കില്ല അല്ലെങ്കിൽ ബഗ്ഗുകൾ ഉണ്ടാകാം, ദയവായി പ്രശ്നങ്ങൾ അറിയിക്കുക!", "poweredBy": "സഹായത്തോടെ", "yes": "അതെ", @@ -115,12 +203,14 @@ "page": "പേജ്", "pages": "പേജുകൾ", "loading": "ലോഡ് ചെയ്യുന്നു...", + "review": "Review", "addToDoc": "പ്രമാണത്തിലേക്ക് ചേർക്കുക", "reset": "പുനഃസജ്ജമാക്കുക", "apply": "പ്രയോഗിക്കുക", "noFileSelected": "ഫയലൊന്നും തിരഞ്ഞെടുത്തിട്ടില്ല. ദയവായി ഒരെണ്ണം അപ്ലോഡ് ചെയ്യുക.", "legal": { "privacy": "സ്വകാര്യതാ നയം", + "iAgreeToThe": "I agree to all of the", "terms": "നിബന്ധനകളും വ്യവസ്ഥകളും", "accessibility": "ലഭ്യത", "cookie": "കുക്കി നയം", @@ -160,6 +250,7 @@ "title": "സ്റ്റെർലിംഗ് PDF മികച്ചതാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?", "paragraph1": "ഉൽപ്പന്നം മെച്ചപ്പെടുത്താൻ ഞങ്ങളെ സഹായിക്കുന്നതിന് സ്റ്റെർലിംഗ് PDF-ൽ ഓപ്റ്റ്-ഇൻ അനലിറ്റിക്സ് ഉണ്ട്. ഞങ്ങൾ വ്യക്തിഗത വിവരങ്ങളോ ഫയൽ ഉള്ളടക്കങ്ങളോ ട്രാക്ക് ചെയ്യുന്നില്ല.", "paragraph2": "സ്റ്റെർലിംഗ്-PDF വളരാനും ഞങ്ങളുടെ ഉപയോക്താക്കളെ നന്നായി മനസ്സിലാക്കാനും അനലിറ്റിക്സ് പ്രവർത്തനക്ഷമമാക്കുന്നത് പരിഗണിക്കുക.", + "learnMore": "Learn more", "enable": "അനലിറ്റിക്സ് പ്രവർത്തനക്ഷമമാക്കുക", "disable": "അനലിറ്റിക്സ് പ്രവർത്തനരഹിതമാക്കുക", "settings": "config/settings.yml ഫയലിൽ നിങ്ങൾക്ക് അനലിറ്റിക്സിനായുള്ള ക്രമീകരണങ്ങൾ മാറ്റാൻ കഴിയും" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "ഫോം ഇൻപുട്ടുകൾ സംരക്ഷിക്കുക", "help": "ഭാവിയിലെ ഉപയോഗത്തിനായി മുമ്പ് ഉപയോഗിച്ച ഇൻപുട്ടുകൾ സംഭരിക്കാൻ പ്രവർത്തനക്ഷമമാക്കുക" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "മികച്ച 20", "all": "എല്ലാം", "refresh": "പുതുക്കുക", - "includeHomepage": "ഹോംപേജ് ഉൾപ്പെടുത്തുക ('/')", - "includeLoginPage": "ലോഗിൻ പേജ് ഉൾപ്പെടുത്തുക ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "ആകെ എൻഡ്പോയിന്റുകൾ", "totalVisits": "ആകെ സന്ദർശനങ്ങൾ", "showing": "കാണിക്കുന്നു", @@ -290,7 +431,9 @@ "top": "മികച്ച", "numberOfVisits": "സന്ദർശനങ്ങളുടെ എണ്ണം", "visitsTooltip": "സന്ദർശനങ്ങൾ: {0} (ആകെയുള്ളതിന്റെ {1}%)", - "retry": "വീണ്ടും ശ്രമിക്കുക" + "retry": "വീണ്ടും ശ്രമിക്കുക", + "includeHomepage": "ഹോംപേജ് ഉൾപ്പെടുത്തുക ('/')", + "includeLoginPage": "ലോഗിൻ പേജ് ഉൾപ്പെടുത്തുക ('/login')" }, "database": { "title": "ഡാറ്റാബേസ് ഇറക്കുമതി/കയറ്റുമതി", @@ -331,22 +474,310 @@ "alphabetical": "അക്ഷരമാലാക്രമത്തിൽ", "globalPopularity": "ആഗോള ജനപ്രീതി", "sortBy": "ഇതനുസരിച്ച് അടുക്കുക:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF മൾട്ടി ടൂൾ", "desc": "പേജുകൾ ലയിപ്പിക്കുക, തിരിക്കുക, പുനഃക്രമീകരിക്കുക, വിഭജിക്കുക, നീക്കം ചെയ്യുക" }, "merge": { + "tags": "combine,join,unite", "title": "ലയിപ്പിക്കുക", "desc": "ഒന്നിലധികം PDF-കൾ എളുപ്പത്തിൽ ഒന്നിലേക്ക് ലയിപ്പിക്കുക." }, "split": { + "tags": "divide,separate,break", "title": "വിഭജിക്കുക", "desc": "PDF-കൾ ഒന്നിലധികം പ്രമാണങ്ങളായി വിഭജിക്കുക" }, "rotate": { + "tags": "turn,flip,orient", "title": "തിരിക്കുക", "desc": "നിങ്ങളുടെ PDF-കൾ എളുപ്പത്തിൽ തിരിക്കുക." }, + "convert": { + "tags": "transform,change", + "title": "Convert", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "ക്രമീകരിക്കുക", + "desc": "ഏത് ക്രമത്തിലും പേജുകൾ നീക്കം ചെയ്യുക/പുനഃക്രമീകരിക്കുക" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "ചിത്രം ചേർക്കുക", + "desc": "PDF-ൽ ഒരു നിശ്ചിത സ്ഥാനത്ത് ഒരു ചിത്രം ചേർക്കുന്നു" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "വാട്ടർമാർക്ക് ചേർക്കുക", + "desc": "നിങ്ങളുടെ PDF പ്രമാണത്തിലേക്ക് ഒരു ഇഷ്ടാനുസൃത വാട്ടർമാർക്ക് ചേർക്കുക." + }, + "removePassword": { + "tags": "unlock", + "title": "പാസ്വേഡ് നീക്കം ചെയ്യുക", + "desc": "നിങ്ങളുടെ PDF പ്രമാണത്തിൽ നിന്ന് പാസ്വേഡ് സംരക്ഷണം നീക്കം ചെയ്യുക." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "കംപ്രസ് ചെയ്യുക", + "desc": "ഫയൽ വലുപ്പം കുറയ്ക്കുന്നതിന് PDF-കൾ കംപ്രസ് ചെയ്യുക." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "PDF ഫോമുകൾ അൺലോക്ക് ചെയ്യുക", + "desc": "ഒരു PDF പ്രമാണത്തിലെ ഫോം ഫീൽഡുകളുടെ റീഡ്-ഒൺലി പ്രോപ്പർട്ടി നീക്കം ചെയ്യുക." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "മെറ്റാഡാറ്റ മാറ്റുക", + "desc": "ഒരു PDF പ്രമാണത്തിൽ നിന്ന് മെറ്റാഡാറ്റ മാറ്റുക/നീക്കം ചെയ്യുക/ചേർക്കുക" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / സ്കാനുകൾ വൃത്തിയാക്കുക", + "desc": "സ്കാനുകൾ വൃത്തിയാക്കുകയും ഒരു PDF-നുള്ളിലെ ചിത്രങ്ങളിൽ നിന്ന് ടെക്സ്റ്റ് കണ്ടെത്തുകയും അത് ടെക്സ്റ്റായി വീണ്ടും ചേർക്കുകയും ചെയ്യുന്നു." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "ചിത്രങ്ങൾ വേർതിരിച്ചെടുക്കുക", + "desc": "ഒരു PDF-ൽ നിന്ന് എല്ലാ ചിത്രങ്ങളും വേർതിരിച്ചെടുത്ത് സിപ്പിലേക്ക് സംരക്ഷിക്കുന്നു" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "ഒപ്പിടുക", + "desc": "വരച്ചോ, ടെക്സ്റ്റ് ഉപയോഗിച്ചോ, ചിത്രം ഉപയോഗിച്ചോ PDF-ൽ ഒപ്പ് ചേർക്കുന്നു" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "പരത്തുക", + "desc": "ഒരു PDF-ൽ നിന്ന് എല്ലാ ഇന്ററാക്ടീവ് ഘടകങ്ങളും ഫോമുകളും നീക്കം ചെയ്യുക" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "സർട്ടിഫിക്കറ്റ് ഉപയോഗിച്ച് ഒപ്പിടുക", + "desc": "ഒരു സർട്ടിഫിക്കറ്റ്/കീ (PEM/P12) ഉപയോഗിച്ച് ഒരു PDF ഒപ്പിടുന്നു" + }, + "repair": { + "tags": "fix,restore", + "title": "നന്നാക്കുക", + "desc": "കേടായ/തകർന്ന PDF നന്നാക്കാൻ ശ്രമിക്കുന്നു" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "ശൂന്യമായ പേജുകൾ നീക്കം ചെയ്യുക", + "desc": "ഒരു പ്രമാണത്തിൽ നിന്ന് ശൂന്യമായ പേജുകൾ കണ്ടെത്തുകയും നീക്കം ചെയ്യുകയും ചെയ്യുന്നു" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "വ്യാഖ്യാനങ്ങൾ നീക്കം ചെയ്യുക", + "desc": "ഒരു PDF-ൽ നിന്ന് എല്ലാ അഭിപ്രായങ്ങളും/വ്യാഖ്യാനങ്ങളും നീക്കം ചെയ്യുന്നു" + }, + "compare": { + "tags": "difference", + "title": "താരതമ്യം ചെയ്യുക", + "desc": "2 PDF പ്രമാണങ്ങൾ തമ്മിലുള്ള വ്യത്യാസങ്ങൾ താരതമ്യം ചെയ്യുകയും കാണിക്കുകയും ചെയ്യുന്നു" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "സർട്ടിഫിക്കറ്റ് ഒപ്പ് നീക്കം ചെയ്യുക", + "desc": "PDF-ൽ നിന്ന് സർട്ടിഫിക്കറ്റ് ഒപ്പ് നീക്കം ചെയ്യുക" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "മൾട്ടി-പേജ് ലേഔട്ട്", + "desc": "ഒരു PDF പ്രമാണത്തിന്റെ ഒന്നിലധികം പേജുകൾ ഒരൊറ്റ പേജിലേക്ക് ലയിപ്പിക്കുക" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "പേജ് വലുപ്പം/സ്കെയിൽ ക്രമീകരിക്കുക", + "desc": "ഒരു പേജിന്റെയും/അല്ലെങ്കിൽ അതിന്റെ ഉള്ളടക്കങ്ങളുടെയും വലുപ്പം/സ്കെയിൽ മാറ്റുക." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "പേജ് നമ്പറുകൾ ചേർക്കുക", + "desc": "ഒരു പ്രമാണത്തിലുടനീളം ഒരു നിശ്ചിത സ്ഥാനത്ത് പേജ് നമ്പറുകൾ ചേർക്കുക" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "നിറങ്ങൾ/കോൺട്രാസ്റ്റ് ക്രമീകരിക്കുക", + "desc": "ഒരു PDF-ന്റെ കോൺട്രാസ്റ്റ്, സാച്ചുറേഷൻ, തെളിച്ചം എന്നിവ ക്രമീകരിക്കുക" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF ക്രോപ്പ് ചെയ്യുക", + "desc": "വലുപ്പം കുറയ്ക്കാൻ ഒരു PDF ക്രോപ്പ് ചെയ്യുക (ടെക്സ്റ്റ് നിലനിർത്തുന്നു!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "പേജുകൾ സ്വയം വിഭജിക്കുക", + "desc": "ഭൗതികമായി സ്കാൻ ചെയ്ത പേജ് സ്പ്ലിറ്റർ QR കോഡ് ഉപയോഗിച്ച് സ്കാൻ ചെയ്ത PDF സ്വയം വിഭജിക്കുക" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "PDF-നെക്കുറിച്ചുള്ള എല്ലാ വിവരങ്ങളും നേടുക", + "desc": "PDF-കളെക്കുറിച്ചുള്ള സാധ്യമായ എല്ലാ വിവരങ്ങളും നേടുന്നു" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "ഒരൊറ്റ വലിയ പേജ്", + "desc": "എല്ലാ PDF പേജുകളും ഒരൊറ്റ വലിയ പേജിലേക്ക് ലയിപ്പിക്കുന്നു" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "ജാവാസ്ക്രിപ്റ്റ് കാണിക്കുക", + "desc": "ഒരു PDF-ൽ കുത്തിവച്ച ഏതെങ്കിലും JS തിരയുകയും പ്രദർശിപ്പിക്കുകയും ചെയ്യുന്നു" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "സ്വയം റെഡാക്ഷൻ", + "desc": "തിരഞ്ഞെടുത്ത ടെക്സ്റ്റ്, വരച്ച രൂപങ്ങൾ കൂടാതെ/അല്ലെങ്കിൽ തിരഞ്ഞെടുത്ത പേജ്(കൾ) അടിസ്ഥാനമാക്കി ഒരു PDF റെഡാക്റ്റ് ചെയ്യുന്നു" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "ചിത്രം നീക്കം ചെയ്യുക", + "desc": "ഫയൽ വലുപ്പം കുറയ്ക്കാൻ PDF-ൽ നിന്ന് ചിത്രം നീക്കം ചെയ്യുക" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "അധ്യായങ്ങൾ അനുസരിച്ച് PDF വിഭജിക്കുക", + "desc": "അതിന്റെ അധ്യായ ഘടനയെ അടിസ്ഥാനമാക്കി ഒരു PDF ഒന്നിലധികം ഫയലുകളായി വിഭജിക്കുക." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "PDF ഒപ്പ് സാധൂകരിക്കുക", + "desc": "PDF പ്രമാണങ്ങളിലെ ഡിജിറ്റൽ ഒപ്പുകളും സർട്ടിഫിക്കറ്റുകളും പരിശോധിക്കുക" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extract Pages", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Remove Pages", + "desc": "Remove specific pages from a PDF document" + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Auto Split by Size/Count", + "desc": "Automatically split PDFs by file size or page count" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "പാസ്വേഡ് ചേർക്കുക", + "desc": "നിങ്ങളുടെ PDF പ്രമാണം ഒരു പാസ്വേഡ് ഉപയോഗിച്ച് എൻക്രിപ്റ്റ് ചെയ്യുക." + }, + "changePermissions": { + "title": "Change Permissions", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "മറ്റൊരു PDF-ന് മുകളിൽ PDF-കൾ ഓവർലേ ചെയ്യുന്നു", + "title": "PDF-കൾ ഓവർലേ ചെയ്യുക" + }, "imageToPDF": { "title": "ചിത്രം PDF-ലേക്ക്", "desc": "ഒരു ചിത്രം (PNG, JPEG, GIF) PDF-ലേക്ക് മാറ്റുക." @@ -355,18 +786,6 @@ "title": "PDF ചിത്രത്തിലേക്ക്", "desc": "ഒരു PDF ചിത്രത്തിലേക്ക് മാറ്റുക. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "ക്രമീകരിക്കുക", - "desc": "ഏത് ക്രമത്തിലും പേജുകൾ നീക്കം ചെയ്യുക/പുനഃക്രമീകരിക്കുക" - }, - "addImage": { - "title": "ചിത്രം ചേർക്കുക", - "desc": "PDF-ൽ ഒരു നിശ്ചിത സ്ഥാനത്ത് ഒരു ചിത്രം ചേർക്കുന്നു" - }, - "watermark": { - "title": "വാട്ടർമാർക്ക് ചേർക്കുക", - "desc": "നിങ്ങളുടെ PDF പ്രമാണത്തിലേക്ക് ഒരു ഇഷ്ടാനുസൃത വാട്ടർമാർക്ക് ചേർക്കുക." - }, "permissions": { "title": "അനുമതികൾ മാറ്റുക", "desc": "നിങ്ങളുടെ PDF പ്രമാണത്തിന്റെ അനുമതികൾ മാറ്റുക" @@ -375,38 +794,10 @@ "title": "നീക്കം ചെയ്യുക", "desc": "നിങ്ങളുടെ PDF പ്രമാണത്തിൽ നിന്ന് ആവശ്യമില്ലാത്ത പേജുകൾ ഇല്ലാതാക്കുക." }, - "addPassword": { - "title": "പാസ്വേഡ് ചേർക്കുക", - "desc": "നിങ്ങളുടെ PDF പ്രമാണം ഒരു പാസ്വേഡ് ഉപയോഗിച്ച് എൻക്രിപ്റ്റ് ചെയ്യുക." - }, - "removePassword": { - "title": "പാസ്വേഡ് നീക്കം ചെയ്യുക", - "desc": "നിങ്ങളുടെ PDF പ്രമാണത്തിൽ നിന്ന് പാസ്വേഡ് സംരക്ഷണം നീക്കം ചെയ്യുക." - }, - "compress": { - "title": "കംപ്രസ് ചെയ്യുക", - "desc": "ഫയൽ വലുപ്പം കുറയ്ക്കുന്നതിന് PDF-കൾ കംപ്രസ് ചെയ്യുക." - }, - "unlockPDFForms": { - "title": "PDF ഫോമുകൾ അൺലോക്ക് ചെയ്യുക", - "desc": "ഒരു PDF പ്രമാണത്തിലെ ഫോം ഫീൽഡുകളുടെ റീഡ്-ഒൺലി പ്രോപ്പർട്ടി നീക്കം ചെയ്യുക." - }, - "changeMetadata": { - "title": "മെറ്റാഡാറ്റ മാറ്റുക", - "desc": "ഒരു PDF പ്രമാണത്തിൽ നിന്ന് മെറ്റാഡാറ്റ മാറ്റുക/നീക്കം ചെയ്യുക/ചേർക്കുക" - }, "fileToPDF": { "title": "ഫയൽ PDF-ലേക്ക് മാറ്റുക", "desc": "ഏകദേശം ഏത് ഫയലും PDF-ലേക്ക് മാറ്റുക (DOCX, PNG, XLS, PPT, TXT എന്നിവയും അതിൽ കൂടുതലും)" }, - "ocr": { - "title": "OCR / സ്കാനുകൾ വൃത്തിയാക്കുക", - "desc": "സ്കാനുകൾ വൃത്തിയാക്കുകയും ഒരു PDF-നുള്ളിലെ ചിത്രങ്ങളിൽ നിന്ന് ടെക്സ്റ്റ് കണ്ടെത്തുകയും അത് ടെക്സ്റ്റായി വീണ്ടും ചേർക്കുകയും ചെയ്യുന്നു." - }, - "extractImages": { - "title": "ചിത്രങ്ങൾ വേർതിരിച്ചെടുക്കുക", - "desc": "ഒരു PDF-ൽ നിന്ന് എല്ലാ ചിത്രങ്ങളും വേർതിരിച്ചെടുത്ത് സിപ്പിലേക്ക് സംരക്ഷിക്കുന്നു" - }, "pdfToPDFA": { "title": "PDF PDF/A-ലേക്ക്", "desc": "ദീർഘകാല സംഭരണത്തിനായി PDF PDF/A-ലേക്ക് മാറ്റുക" @@ -435,70 +826,14 @@ "title": "സ്കാൻ ചെയ്ത ഫോട്ടോകൾ കണ്ടെത്തുക/വിഭജിക്കുക", "desc": "ഒരു ഫോട്ടോ/PDF-നുള്ളിൽ നിന്ന് ഒന്നിലധികം ഫോട്ടോകൾ വിഭജിക്കുന്നു" }, - "sign": { - "title": "ഒപ്പിടുക", - "desc": "വരച്ചോ, ടെക്സ്റ്റ് ഉപയോഗിച്ചോ, ചിത്രം ഉപയോഗിച്ചോ PDF-ൽ ഒപ്പ് ചേർക്കുന്നു" - }, - "flatten": { - "title": "പരത്തുക", - "desc": "ഒരു PDF-ൽ നിന്ന് എല്ലാ ഇന്ററാക്ടീവ് ഘടകങ്ങളും ഫോമുകളും നീക്കം ചെയ്യുക" - }, - "repair": { - "title": "നന്നാക്കുക", - "desc": "കേടായ/തകർന്ന PDF നന്നാക്കാൻ ശ്രമിക്കുന്നു" - }, - "removeBlanks": { - "title": "ശൂന്യമായ പേജുകൾ നീക്കം ചെയ്യുക", - "desc": "ഒരു പ്രമാണത്തിൽ നിന്ന് ശൂന്യമായ പേജുകൾ കണ്ടെത്തുകയും നീക്കം ചെയ്യുകയും ചെയ്യുന്നു" - }, - "removeAnnotations": { - "title": "വ്യാഖ്യാനങ്ങൾ നീക്കം ചെയ്യുക", - "desc": "ഒരു PDF-ൽ നിന്ന് എല്ലാ അഭിപ്രായങ്ങളും/വ്യാഖ്യാനങ്ങളും നീക്കം ചെയ്യുന്നു" - }, - "compare": { - "title": "താരതമ്യം ചെയ്യുക", - "desc": "2 PDF പ്രമാണങ്ങൾ തമ്മിലുള്ള വ്യത്യാസങ്ങൾ താരതമ്യം ചെയ്യുകയും കാണിക്കുകയും ചെയ്യുന്നു" - }, - "certSign": { - "title": "സർട്ടിഫിക്കറ്റ് ഉപയോഗിച്ച് ഒപ്പിടുക", - "desc": "ഒരു സർട്ടിഫിക്കറ്റ്/കീ (PEM/P12) ഉപയോഗിച്ച് ഒരു PDF ഒപ്പിടുന്നു" - }, - "removeCertSign": { - "title": "സർട്ടിഫിക്കറ്റ് ഒപ്പ് നീക്കം ചെയ്യുക", - "desc": "PDF-ൽ നിന്ന് സർട്ടിഫിക്കറ്റ് ഒപ്പ് നീക്കം ചെയ്യുക" - }, - "pageLayout": { - "title": "മൾട്ടി-പേജ് ലേഔട്ട്", - "desc": "ഒരു PDF പ്രമാണത്തിന്റെ ഒന്നിലധികം പേജുകൾ ഒരൊറ്റ പേജിലേക്ക് ലയിപ്പിക്കുക" - }, - "scalePages": { - "title": "പേജ് വലുപ്പം/സ്കെയിൽ ക്രമീകരിക്കുക", - "desc": "ഒരു പേജിന്റെയും/അല്ലെങ്കിൽ അതിന്റെ ഉള്ളടക്കങ്ങളുടെയും വലുപ്പം/സ്കെയിൽ മാറ്റുക." - }, "pipeline": { "title": "പൈപ്പ്ലൈൻ", "desc": "പൈപ്പ്ലൈൻ സ്ക്രിപ്റ്റുകൾ നിർവചിച്ചുകൊണ്ട് PDF-കളിൽ ഒന്നിലധികം പ്രവർത്തനങ്ങൾ നടത്തുക" }, - "addPageNumbers": { - "title": "പേജ് നമ്പറുകൾ ചേർക്കുക", - "desc": "ഒരു പ്രമാണത്തിലുടനീളം ഒരു നിശ്ചിത സ്ഥാനത്ത് പേജ് നമ്പറുകൾ ചേർക്കുക" - }, "auto-rename": { "title": "PDF ഫയൽ സ്വയം പുനർനാമകരണം ചെയ്യുക", "desc": "കണ്ടെത്തിയ തലക്കെട്ടിനെ അടിസ്ഥാനമാക്കി ഒരു PDF ഫയൽ സ്വയം പുനർനാമകരണം ചെയ്യുന്നു" }, - "adjustContrast": { - "title": "നിറങ്ങൾ/കോൺട്രാസ്റ്റ് ക്രമീകരിക്കുക", - "desc": "ഒരു PDF-ന്റെ കോൺട്രാസ്റ്റ്, സാച്ചുറേഷൻ, തെളിച്ചം എന്നിവ ക്രമീകരിക്കുക" - }, - "crop": { - "title": "PDF ക്രോപ്പ് ചെയ്യുക", - "desc": "വലുപ്പം കുറയ്ക്കാൻ ഒരു PDF ക്രോപ്പ് ചെയ്യുക (ടെക്സ്റ്റ് നിലനിർത്തുന്നു!)" - }, - "autoSplitPDF": { - "title": "പേജുകൾ സ്വയം വിഭജിക്കുക", - "desc": "ഭൗതികമായി സ്കാൻ ചെയ്ത പേജ് സ്പ്ലിറ്റർ QR കോഡ് ഉപയോഗിച്ച് സ്കാൻ ചെയ്ത PDF സ്വയം വിഭജിക്കുക" - }, "sanitizePDF": { "title": "ശുദ്ധീകരിക്കുക", "desc": "PDF ഫയലുകളിൽ നിന്ന് സ്ക്രിപ്റ്റുകളും മറ്റ് ഘടകങ്ങളും നീക്കം ചെയ്യുക" @@ -519,30 +854,14 @@ "title": "PDF മാർക്ക്ഡൗണിലേക്ക്", "desc": "ഏത് PDF-നെയും മാർക്ക്ഡൗണിലേക്ക് മാറ്റുന്നു" }, - "getPdfInfo": { - "title": "PDF-നെക്കുറിച്ചുള്ള എല്ലാ വിവരങ്ങളും നേടുക", - "desc": "PDF-കളെക്കുറിച്ചുള്ള സാധ്യമായ എല്ലാ വിവരങ്ങളും നേടുന്നു" - }, "pageExtracter": { "title": "പേജ്(കൾ) വേർതിരിച്ചെടുക്കുക", "desc": "PDF-ൽ നിന്ന് തിരഞ്ഞെടുത്ത പേജുകൾ വേർതിരിച്ചെടുക്കുന്നു" }, - "pdfToSinglePage": { - "title": "ഒരൊറ്റ വലിയ പേജ്", - "desc": "എല്ലാ PDF പേജുകളും ഒരൊറ്റ വലിയ പേജിലേക്ക് ലയിപ്പിക്കുന്നു" - }, - "showJS": { - "title": "ജാവാസ്ക്രിപ്റ്റ് കാണിക്കുക", - "desc": "ഒരു PDF-ൽ കുത്തിവച്ച ഏതെങ്കിലും JS തിരയുകയും പ്രദർശിപ്പിക്കുകയും ചെയ്യുന്നു" - }, "autoRedact": { "title": "സ്വയം റെഡാക്റ്റ് ചെയ്യുക", "desc": "ഇൻപുട്ട് ടെക്സ്റ്റിനെ അടിസ്ഥാനമാക്കി ഒരു PDF-ലെ ടെക്സ്റ്റ് സ്വയം റെഡാക്റ്റ് (കറുപ്പിക്കുന്നു) ചെയ്യുന്നു" }, - "redact": { - "title": "സ്വയം റെഡാക്ഷൻ", - "desc": "തിരഞ്ഞെടുത്ത ടെക്സ്റ്റ്, വരച്ച രൂപങ്ങൾ കൂടാതെ/അല്ലെങ്കിൽ തിരഞ്ഞെടുത്ത പേജ്(കൾ) അടിസ്ഥാനമാക്കി ഒരു PDF റെഡാക്റ്റ് ചെയ്യുന്നു" - }, "PDFToCSV": { "title": "PDF CSV-ലേക്ക്", "desc": "ഒരു PDF-ൽ നിന്ന് പട്ടികകൾ വേർതിരിച്ചെടുത്ത് CSV-ലേക്ക് മാറ്റുന്നു" @@ -551,10 +870,6 @@ "title": "വലുപ്പം/എണ്ണം അനുസരിച്ച് സ്വയം വിഭജിക്കുക", "desc": "വലുപ്പം, പേജ് എണ്ണം, അല്ലെങ്കിൽ പ്രമാണങ്ങളുടെ എണ്ണം എന്നിവ അടിസ്ഥാനമാക്കി ഒരൊറ്റ PDF ഒന്നിലധികം പ്രമാണങ്ങളായി വിഭജിക്കുക" }, - "overlay-pdfs": { - "title": "PDF-കൾ ഓവർലേ ചെയ്യുക", - "desc": "മറ്റൊരു PDF-ന് മുകളിൽ PDF-കൾ ഓവർലേ ചെയ്യുന്നു" - }, "split-by-sections": { "title": "വിഭാഗങ്ങൾ അനുസരിച്ച് PDF വിഭജിക്കുക", "desc": "ഒരു PDF-ന്റെ ഓരോ പേജും ചെറിയ തിരശ്ചീനവും ലംബവുമായ വിഭാഗങ്ങളായി വിഭജിക്കുക" @@ -563,23 +878,15 @@ "title": "PDF-ൽ സ്റ്റാമ്പ് ചേർക്കുക", "desc": "നിശ്ചിത സ്ഥാനങ്ങളിൽ ടെക്സ്റ്റ് അല്ലെങ്കിൽ ഇമേജ് സ്റ്റാമ്പുകൾ ചേർക്കുക" }, - "removeImage": { - "title": "ചിത്രം നീക്കം ചെയ്യുക", - "desc": "ഫയൽ വലുപ്പം കുറയ്ക്കാൻ PDF-ൽ നിന്ന് ചിത്രം നീക്കം ചെയ്യുക" - }, - "splitByChapters": { - "title": "അധ്യായങ്ങൾ അനുസരിച്ച് PDF വിഭജിക്കുക", - "desc": "അതിന്റെ അധ്യായ ഘടനയെ അടിസ്ഥാനമാക്കി ഒരു PDF ഒന്നിലധികം ഫയലുകളായി വിഭജിക്കുക." - }, - "validateSignature": { - "title": "PDF ഒപ്പ് സാധൂകരിക്കുക", - "desc": "PDF പ്രമാണങ്ങളിലെ ഡിജിറ്റൽ ഒപ്പുകളും സർട്ടിഫിക്കറ്റുകളും പരിശോധിക്കുക" - }, "replace-color": { "title": "നിറം മാറ്റുകയും വിപരീതമാക്കുകയും ചെയ്യുക", "desc": "PDF-ലെ ടെക്സ്റ്റിനും പശ്ചാത്തലത്തിനും നിറം മാറ്റുകയും ഫയൽ വലുപ്പം കുറയ്ക്കുന്നതിന് PDF-ന്റെ മുഴുവൻ നിറവും വിപരീതമാക്കുകയും ചെയ്യുക" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "കാണുക,വായിക്കുക,വ്യാഖ്യാനിക്കുക,ടെക്സ്റ്റ്,ചിത്രം,ഹൈലൈറ്റ്,തിരുത്തുക", "title": "PDF കാണുക/തിരുത്തുക", @@ -613,14 +920,39 @@ "merge": { "tags": "ലയിപ്പിക്കുക,പേജ് പ്രവർത്തനങ്ങൾ,ബാക്ക് എൻഡ്,സെർവർ സൈഡ്", "title": "ലയിപ്പിക്കുക", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "ലയിപ്പിക്കുക", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "File Name", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "ഒന്നിലധികം PDF-കൾ ലയിപ്പിക്കുക (2+)", "sortByName": "പേര് അനുസരിച്ച് അടുക്കുക", "sortByDate": "തീയതി അനുസരിച്ച് അടുക്കുക", - "removeCertSign": "ലയിപ്പിച്ച ഫയലിലെ ഡിജിറ്റൽ ഒപ്പ് നീക്കം ചെയ്യണോ?", - "submit": "ലയിപ്പിക്കുക" + "removeCertSign": "ലയിപ്പിച്ച ഫയലിലെ ഡിജിറ്റൽ ഒപ്പ് നീക്കം ചെയ്യണോ?" }, "split": { - "tags": "പേജ് പ്രവർത്തനങ്ങൾ,വിഭജിക്കുക,മൾട്ടി പേജ്,മുറിക്കുക,സെർവർ സൈഡ്", "title": "PDF വിഭജിക്കുക", "header": "PDF വിഭജിക്കുക", "desc": { @@ -634,14 +966,251 @@ "8": "പ്രമാണം #6: പേജ് 10" }, "splitPages": "വിഭജിക്കേണ്ട പേജുകൾ നൽകുക:", - "submit": "വിഭജിക്കുക" + "submit": "വിഭജിക്കുക", + "steps": { + "chooseMethod": "Choose Method", + "settings": "Settings" + }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, + "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, + "bySize": { + "name": "File Size", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" + } + }, + "value": { + "fileSize": { + "label": "File Size", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" + } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "പേജ് പ്രവർത്തനങ്ങൾ,വിഭജിക്കുക,മൾട്ടി പേജ്,മുറിക്കുക,സെർവർ സൈഡ്" }, "rotate": { - "tags": "സെർവർ സൈഡ്", "title": "PDF തിരിക്കുക", + "submit": "തിരിക്കുക", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "സെർവർ സൈഡ്", "header": "PDF തിരിക്കുക", - "selectAngle": "തിരിക്കേണ്ട കോൺ തിരഞ്ഞെടുക്കുക (90 ഡിഗ്രിയുടെ ഗുണിതങ്ങളിൽ):", - "submit": "തിരിക്കുക" + "selectAngle": "തിരിക്കേണ്ട കോൺ തിരഞ്ഞെടുക്കുക (90 ഡിഗ്രിയുടെ ഗുണിതങ്ങളിൽ):" + }, + "convert": { + "title": "Convert", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Settings", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Colour", + "greyscale": "Greyscale", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Fill Page", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "The PDF contains a digital signature. This will be removed in the next step.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Greyscale", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "പരിവർത്തനം,img,jpg,ചിത്രം,ഫോട്ടോ" @@ -679,7 +1248,33 @@ "8": "അവസാനത്തേത് നീക്കം ചെയ്യുക", "9": "ആദ്യത്തേതും അവസാനത്തേതും നീക്കം ചെയ്യുക", "10": "ഒറ്റ-ഇരട്ട ലയനം", - "11": "എല്ലാ പേജുകളും തനിപ്പകർപ്പാക്കുക" + "11": "എല്ലാ പേജുകളും തനിപ്പകർപ്പാക്കുക", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(ഉദാ. 1,3,2 അല്ലെങ്കിൽ 4-8,2,10-12 അല്ലെങ്കിൽ 2n-1)" }, @@ -691,9 +1286,198 @@ "upload": "ചിത്രം ചേർക്കുക", "submit": "ചിത്രം ചേർക്കുക" }, + "attachments": { + "tags": "attachments,add,remove,embed,file", + "title": "Add Attachments", + "header": "Add Attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add Attachments" + }, "watermark": { - "tags": "ടെക്സ്റ്റ്,ആവർത്തിക്കുന്ന,ലേബൽ,സ്വന്തം,പകർപ്പവകാശം,വ്യാപാരമുദ്ര,img,jpg,ചിത്രം,ഫോട്ടോ", "title": "വാട്ടർമാർക്ക് ചേർക്കുക", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "വാട്ടർമാർക്ക് ചേർക്കുക", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Text", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Font Size", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "ടെക്സ്റ്റ്", + "2": "ചിത്രം" + }, + "tags": "ടെക്സ്റ്റ്,ആവർത്തിക്കുന്ന,ലേബൽ,സ്വന്തം,പകർപ്പവകാശം,വ്യാപാരമുദ്ര,img,jpg,ചിത്രം,ഫോട്ടോ", "header": "വാട്ടർമാർക്ക് ചേർക്കുക", "customColor": "ഇഷ്ടാനുസൃത ടെക്സ്റ്റ് നിറം", "selectText": { @@ -707,11 +1491,6 @@ "8": "വാട്ടർമാർക്ക് തരം:", "9": "വാട്ടർമാർക്ക് ചിത്രം:", "10": "PDF-നെ PDF-ചിത്രത്തിലേക്ക് മാറ്റുക" - }, - "submit": "വാട്ടർമാർക്ക് ചേർക്കുക", - "type": { - "1": "ടെക്സ്റ്റ്", - "2": "ചിത്രം" } }, "permissions": { @@ -734,41 +1513,204 @@ "submit": "മാറ്റുക" }, "removePages": { - "tags": "പേജുകൾ നീക്കം ചെയ്യുക,പേജുകൾ ഇല്ലാതാക്കുക" - }, - "addPassword": { - "tags": "സുരക്ഷിതം,സുരക്ഷ", - "title": "പാസ്വേഡ് ചേർക്കുക", - "header": "പാസ്വേഡ് ചേർക്കുക (എൻക്രിപ്റ്റ് ചെയ്യുക)", - "selectText": { - "1": "എൻക്രിപ്റ്റ് ചെയ്യേണ്ട PDF തിരഞ്ഞെടുക്കുക", - "2": "ഉപയോക്തൃ പാസ്വേഡ്", - "3": "എൻക്രിപ്ഷൻ കീ ദൈർഘ്യം", - "4": "ഉയർന്ന മൂല്യങ്ങൾ കൂടുതൽ ശക്തമാണ്, എന്നാൽ താഴ്ന്ന മൂല്യങ്ങൾക്ക് മികച്ച അനുയോജ്യതയുണ്ട്.", - "5": "സജ്ജമാക്കേണ്ട അനുമതികൾ (ഉടമയുടെ പാസ്വേഡിനൊപ്പം ഉപയോഗിക്കാൻ ശുപാർശ ചെയ്യുന്നു)", - "6": "പ്രമാണം കൂട്ടിച്ചേർക്കുന്നത് തടയുക", - "7": "ഉള്ളടക്കം വേർതിരിച്ചെടുക്കുന്നത് തടയുക", - "8": "ലഭ്യതയ്ക്കായി വേർതിരിച്ചെടുക്കുന്നത് തടയുക", - "9": "ഫോം പൂരിപ്പിക്കുന്നത് തടയുക", - "10": "പരിഷ്ക്കരണം തടയുക", - "11": "വ്യാഖ്യാന പരിഷ്ക്കരണം തടയുക", - "12": "അച്ചടി തടയുക", - "13": "വ്യത്യസ്ത ഫോർമാറ്റുകളിൽ അച്ചടിക്കുന്നത് തടയുക", - "14": "ഉടമയുടെ പാസ്വേഡ്", - "15": "പ്രമാണം തുറന്നുകഴിഞ്ഞാൽ എന്തുചെയ്യാൻ കഴിയുമെന്നത് നിയന്ത്രിക്കുന്നു (എല്ലാ റീഡറുകളും പിന്തുണയ്ക്കുന്നില്ല)", - "16": "പ്രമാണം തന്നെ തുറക്കുന്നത് നിയന്ത്രിക്കുന്നു" + "tags": "പേജുകൾ നീക്കം ചെയ്യുക,പേജുകൾ ഇല്ലാതാക്കുക", + "title": "Remove Pages", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" }, - "submit": "എൻക്രിപ്റ്റ് ചെയ്യുക" - }, - "removePassword": { - "tags": "സുരക്ഷിതം,ഡീക്രിപ്റ്റ്,സുരക്ഷ,പാസ്വേഡ് ഇല്ലാതാക്കുക,പാസ്വേഡ് നീക്കം ചെയ്യുക", - "title": "പാസ്വേഡ് നീക്കം ചെയ്യുക", - "header": "പാസ്വേഡ് നീക്കം ചെയ്യുക (ഡീക്രിപ്റ്റ് ചെയ്യുക)", - "selectText": { - "1": "ഡീക്രിപ്റ്റ് ചെയ്യേണ്ട PDF തിരഞ്ഞെടുക്കുക", - "2": "പാസ്വേഡ്" + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" }, - "submit": "നീക്കം ചെയ്യുക" + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, + "submit": "Remove Pages" + }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" + } + } + }, + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" + } }, "compressPdfs": { "tags": "ചുരുക്കുക,ചെറുത്,വളരെ ചെറുത്" @@ -777,12 +1719,142 @@ "tags": "നീക്കം ചെയ്യുക,ഇല്ലാതാക്കുക,ഫോം,ഫീൽഡ്,റീഡ്-ഒൺലി", "title": "ഫോം ഫീൽഡുകളിൽ നിന്ന് റീഡ്-ഒൺലി നീക്കം ചെയ്യുക", "header": "PDF ഫോമുകൾ അൺലോക്ക് ചെയ്യുക", - "submit": "നീക്കം ചെയ്യുക" + "submit": "നീക്കം ചെയ്യുക", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "തലക്കെട്ട്,രചയിതാവ്,തീയതി,സൃഷ്ടി,സമയം,പ്രസാധകൻ,നിർമ്മാതാവ്,സ്ഥിതിവിവരക്കണക്കുകൾ", - "title": "തലക്കെട്ട്:", "header": "മെറ്റാഡാറ്റ മാറ്റുക", + "submit": "മാറ്റുക", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "തലക്കെട്ട്,രചയിതാവ്,തീയതി,സൃഷ്ടി,സമയം,പ്രസാധകൻ,നിർമ്മാതാവ്,സ്ഥിതിവിവരക്കണക്കുകൾ", "selectText": { "1": "ദയവായി നിങ്ങൾ മാറ്റാൻ ആഗ്രഹിക്കുന്ന വേരിയബിളുകൾ തിരുത്തുക", "2": "എല്ലാ മെറ്റാഡാറ്റയും ഇല്ലാതാക്കുക", @@ -790,15 +1862,7 @@ "4": "മറ്റ് മെറ്റാഡാറ്റ:", "5": "ഇഷ്ടാനുസൃത മെറ്റാഡാറ്റ എൻട്രി ചേർക്കുക" }, - "author": "രചയിതാവ്:", - "creationDate": "സൃഷ്ടിച്ച തീയതി (yyyy/MM/dd HH:mm:ss):", - "creator": "സ്രഷ്ടാവ്:", - "keywords": "കീവേഡുകൾ:", - "modDate": "പരിഷ്ക്കരിച്ച തീയതി (yyyy/MM/dd HH:mm:ss):", - "producer": "നിർമ്മാതാവ്:", - "subject": "വിഷയം:", - "trapped": "ട്രാപ്പ്ഡ്:", - "submit": "മാറ്റുക" + "modDate": "പരിഷ്ക്കരിച്ച തീയതി (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "രൂപാന്തരം,ഫോർമാറ്റ്,പ്രമാണം,ചിത്രം,സ്ലൈഡ്,ടെക്സ്റ്റ്,പരിവർത്തനം,ഓഫീസ്,ഡോക്സ്,വേഡ്,എക്സൽ,പവർപോയിന്റ്", @@ -812,6 +1876,7 @@ "ocr": { "tags": "തിരിച്ചറിയൽ,ടെക്സ്റ്റ്,ചിത്രം,സ്കാൻ,വായിക്കുക,തിരിച്ചറിയുക,കണ്ടെത്തൽ,തിരുത്താവുന്നത്", "title": "OCR / സ്കാൻ വൃത്തിയാക്കൽ", + "desc": "Cleanup scans and detects text from images within a PDF and re-adds it as text.", "header": "സ്കാനുകൾ വൃത്തിയാക്കുക / OCR (ഒപ്റ്റിക്കൽ ക്യാരക്ടർ റെക്കഗ്നിഷൻ)", "selectText": { "1": "PDF-നുള്ളിൽ കണ്ടെത്തേണ്ട ഭാഷകൾ തിരഞ്ഞെടുക്കുക (ലിസ്റ്റ് ചെയ്തിട്ടുള്ളവ നിലവിൽ കണ്ടെത്തിയവയാണ്):", @@ -829,7 +1894,91 @@ }, "help": "മറ്റ് ഭാഷകൾക്കായി ഇത് എങ്ങനെ ഉപയോഗിക്കാമെന്നും കൂടാതെ/അല്ലെങ്കിൽ ഡോക്കറിൽ ഉപയോഗിക്കാതിരിക്കുന്നതിനെക്കുറിച്ചും ഈ ഡോക്യുമെന്റേഷൻ വായിക്കുക", "credit": "ഈ സേവനം OCR-നായി qpdf, Tesseract എന്നിവ ഉപയോഗിക്കുന്നു.", - "submit": "OCR ഉപയോഗിച്ച് PDF പ്രോസസ്സ് ചെയ്യുക" + "submit": "OCR ഉപയോഗിച്ച് PDF പ്രോസസ്സ് ചെയ്യുക", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, + "settings": { + "title": "Settings", + "ocrMode": { + "label": "OCR Mode", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" + }, + "languages": { + "label": "Languages", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" + } + }, + "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, + "mode": { + "title": "OCR Mode", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." + }, + "languages": { + "title": "Languages", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } + } + }, + "error": { + "failed": "OCR operation failed" + } }, "extractImages": { "tags": "ചിത്രം,ഫോട്ടോ,സംരക്ഷിക്കുക,ആർക്കൈവ്,സിപ്പ്,പിടിച്ചെടുക്കുക,നേടുക", @@ -837,7 +1986,13 @@ "header": "ചിത്രങ്ങൾ വേർതിരിച്ചെടുക്കുക", "selectText": "വേർതിരിച്ചെടുത്ത ചിത്രങ്ങൾ പരിവർത്തനം ചെയ്യേണ്ട ഇമേജ് ഫോർമാറ്റ് തിരഞ്ഞെടുക്കുക", "allowDuplicates": "തനിപ്പകർപ്പ് ചിത്രങ്ങൾ സംരക്ഷിക്കുക", - "submit": "വേർതിരിച്ചെടുക്കുക" + "submit": "വേർതിരിച്ചെടുക്കുക", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "ആർക്കൈവ്,ദീർഘകാല,മാനദണ്ഡം,പരിവർത്തനം,സംഭരണം,സംരക്ഷണം", @@ -909,17 +2064,53 @@ }, "info": "പൈത്തൺ ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല. ഇത് പ്രവർത്തിപ്പിക്കാൻ ആവശ്യമാണ്." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "അംഗീകരിക്കുക,ആദ്യാക്ഷരങ്ങൾ,വരച്ച-ഒപ്പ്,ടെക്സ്റ്റ്-ഒപ്പ്,ചിത്ര-ഒപ്പ്", "title": "ഒപ്പിടുക", "header": "PDF-കൾ ഒപ്പിടുക", "upload": "ചിത്രം അപ്ലോഡ് ചെയ്യുക", - "draw": "ഒപ്പ് വരയ്ക്കുക", - "text": "ടെക്സ്റ്റ് ഇൻപുട്ട്", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "മായ്ക്കുക", "add": "ചേർക്കുക", "saved": "സംരക്ഷിച്ച ഒപ്പുകൾ", "save": "ഒപ്പ് സംരക്ഷിക്കുക", + "applySignatures": "Apply Signatures", "personalSigs": "വ്യക്തിഗത ഒപ്പുകൾ", "sharedSigs": "പങ്കിട്ട ഒപ്പുകൾ", "noSavedSigs": "സംരക്ഷിച്ച ഒപ്പുകളൊന്നും കണ്ടെത്തിയില്ല", @@ -931,36 +2122,179 @@ "previous": "മുമ്പത്തെ പേജ്", "maintainRatio": "വീക്ഷണാനുപാതം നിലനിർത്തുക ടോഗിൾ ചെയ്യുക", "undo": "പഴയപടി ആക്കുക", - "redo": "വീണ്ടും ചെയ്യുക" + "redo": "വീണ്ടും ചെയ്യുക", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "അംഗീകരിക്കുക,ആദ്യാക്ഷരങ്ങൾ,വരച്ച-ഒപ്പ്,ടെക്സ്റ്റ്-ഒപ്പ്,ചിത്ര-ഒപ്പ്" }, "flatten": { - "tags": "സ്ഥിരം,പ്രവർത്തനരഹിതമാക്കുക,നോൺ-ഇന്ററാക്ടീവ്,ലഘൂകരിക്കുക", "title": "പരത്തുക", "header": "PDF-കൾ പരത്തുക", "flattenOnlyForms": "ഫോമുകൾ മാത്രം പരത്തുക", - "submit": "പരത്തുക" + "submit": "പരത്തുക", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "steps": { + "settings": "Settings" + }, + "options": { + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "സ്ഥിരം,പ്രവർത്തനരഹിതമാക്കുക,നോൺ-ഇന്ററാക്ടീവ്,ലഘൂകരിക്കുക" }, "repair": { "tags": "പരിഹരിക്കുക,പുനഃസ്ഥാപിക്കുക,തിരുത്തൽ,വീണ്ടെടുക്കുക", "title": "നന്നാക്കുക", "header": "PDF-കൾ നന്നാക്കുക", - "submit": "നന്നാക്കുക" + "submit": "നന്നാക്കുക", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "വൃത്തിയാക്കൽ,ലഘൂകരിക്കുക,ഉള്ളടക്കമില്ലാത്ത,ക്രമീകരിക്കുക", "title": "ശൂന്യമായവ നീക്കം ചെയ്യുക", "header": "ശൂന്യമായ പേജുകൾ നീക്കം ചെയ്യുക", - "threshold": "പിക്സൽ വെളുപ്പ് പരിധി:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "ശൂന്യമായവ നീക്കം ചെയ്യുക", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "വൃത്തിയാക്കൽ,ലഘൂകരിക്കുക,ഉള്ളടക്കമില്ലാത്ത,ക്രമീകരിക്കുക", "thresholdDesc": "'വെള്ള' എന്ന് തരംതിരിക്കാൻ ഒരു വെളുത്ത പിക്സൽ എത്ര വെളുത്തതായിരിക്കണം എന്ന് നിർണ്ണയിക്കുന്നതിനുള്ള പരിധി. 0 = കറുപ്പ്, 255 ശുദ്ധമായ വെളുപ്പ്.", - "whitePercent": "വെളുപ്പ് ശതമാനം (%):", - "whitePercentDesc": "നീക്കം ചെയ്യേണ്ട 'വെളുത്ത' പിക്സലുകൾ അടങ്ങിയ പേജിന്റെ ശതമാനം", - "submit": "ശൂന്യമായവ നീക്കം ചെയ്യുക" + "whitePercentDesc": "നീക്കം ചെയ്യേണ്ട 'വെളുത്ത' പിക്സലുകൾ അടങ്ങിയ പേജിന്റെ ശതമാനം" }, "removeAnnotations": { "tags": "അഭിപ്രായങ്ങൾ,ഹൈലൈറ്റ്,കുറിപ്പുകൾ,മാർക്ക്അപ്പ്,നീക്കം ചെയ്യുക", "title": "വ്യാഖ്യാനങ്ങൾ നീക്കം ചെയ്യുക", "header": "വ്യാഖ്യാനങ്ങൾ നീക്കം ചെയ്യുക", - "submit": "നീക്കം ചെയ്യുക" + "submit": "നീക്കം ചെയ്യുക", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "വേർതിരിക്കുക,വ്യത്യാസം,മാറ്റങ്ങൾ,വിശകലനം", @@ -992,6 +2326,142 @@ "certSign": { "tags": "സ്ഥിരീകരിക്കുക,PEM,P12,ഔദ്യോഗികം,എൻക്രിപ്റ്റ് ചെയ്യുക", "title": "സർട്ടിഫിക്കറ്റ് ഒപ്പിടൽ", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "സ്ഥലം", + "logoTitle": "Logo", + "name": "പേര്", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "നിങ്ങളുടെ കീസ്റ്റോർ അല്ലെങ്കിൽ സ്വകാര്യ കീ പാസ്വേഡ് നൽകുക (ഉണ്ടെങ്കിൽ):", + "passwordOptional": "Leave empty if no password", + "reason": "കാരണം", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "ലോഗോ കാണിക്കുക", "header": "നിങ്ങളുടെ സർട്ടിഫിക്കറ്റ് ഉപയോഗിച്ച് ഒരു PDF ഒപ്പിടുക (നിർമ്മാണത്തിലിരിക്കുന്നു)", "selectPDF": "ഒപ്പിടുന്നതിനായി ഒരു PDF ഫയൽ തിരഞ്ഞെടുക്കുക:", "jksNote": "ശ്രദ്ധിക്കുക: നിങ്ങളുടെ സർട്ടിഫിക്കറ്റ് തരം താഴെ ലിസ്റ്റ് ചെയ്തിട്ടില്ലെങ്കിൽ, ദയവായി കീടൂൾ കമാൻഡ് ലൈൻ ടൂൾ ഉപയോഗിച്ച് അതിനെ ഒരു ജാവ കീസ്റ്റോർ (.jks) ഫയലിലേക്ക് മാറ്റുക. തുടർന്ന്, താഴെയുള്ള .jks ഫയൽ ഓപ്ഷൻ തിരഞ്ഞെടുക്കുക.", @@ -999,13 +2469,7 @@ "selectCert": "നിങ്ങളുടെ സർട്ടിഫിക്കറ്റ് ഫയൽ തിരഞ്ഞെടുക്കുക (X.509 ഫോർമാറ്റ്, .pem അല്ലെങ്കിൽ .der ആകാം):", "selectP12": "നിങ്ങളുടെ PKCS#12 കീസ്റ്റോർ ഫയൽ (.p12 അല്ലെങ്കിൽ .pfx) തിരഞ്ഞെടുക്കുക (ഓപ്ഷണൽ, നൽകിയിട്ടുണ്ടെങ്കിൽ, അതിൽ നിങ്ങളുടെ സ്വകാര്യ കീയും സർട്ടിഫിക്കറ്റും അടങ്ങിയിരിക്കണം):", "selectJKS": "നിങ്ങളുടെ ജാവ കീസ്റ്റോർ ഫയൽ (.jks അല്ലെങ്കിൽ .keystore) തിരഞ്ഞെടുക്കുക:", - "certType": "സർട്ടിഫിക്കറ്റ് തരം", - "password": "നിങ്ങളുടെ കീസ്റ്റോർ അല്ലെങ്കിൽ സ്വകാര്യ കീ പാസ്വേഡ് നൽകുക (ഉണ്ടെങ്കിൽ):", "showSig": "ഒപ്പ് കാണിക്കുക", - "reason": "കാരണം", - "location": "സ്ഥലം", - "name": "പേര്", - "showLogo": "ലോഗോ കാണിക്കുക", "submit": "PDF ഒപ്പിടുക" }, "removeCertSign": { @@ -1013,7 +2477,18 @@ "title": "സർട്ടിഫിക്കറ്റ് ഒപ്പ് നീക്കം ചെയ്യുക", "header": "PDF-ൽ നിന്ന് ഡിജിറ്റൽ സർട്ടിഫിക്കറ്റ് നീക്കം ചെയ്യുക", "selectPDF": "ഒരു PDF ഫയൽ തിരഞ്ഞെടുക്കുക:", - "submit": "ഒപ്പ് നീക്കം ചെയ്യുക" + "submit": "ഒപ്പ് നീക്കം ചെയ്യുക", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "ലയിപ്പിക്കുക,സംയോജിപ്പിക്കുക,ഒറ്റ-കാഴ്ച,ക്രമീകരിക്കുക", @@ -1021,16 +2496,157 @@ "header": "മൾട്ടി പേജ് ലേഔട്ട്", "pagesPerSheet": "ഓരോ ഷീറ്റിലെയും പേജുകൾ:", "addBorder": "അതിരുകൾ ചേർക്കുക", - "submit": "സമർപ്പിക്കുക" + "submit": "സമർപ്പിക്കുക", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "വലുപ്പം മാറ്റുക,പരിഷ്ക്കരിക്കുക,അളവ്,അനുയോജ്യമാക്കുക", "title": "പേജ്-സ്കെയിൽ ക്രമീകരിക്കുക", "header": "പേജ്-സ്കെയിൽ ക്രമീകരിക്കുക", "pageSize": "പ്രമാണത്തിലെ ഒരു പേജിന്റെ വലുപ്പം.", "keepPageSize": "യഥാർത്ഥ വലുപ്പം", "scaleFactor": "ഒരു പേജിന്റെ സൂം നില (ക്രോപ്പ്).", - "submit": "സമർപ്പിക്കുക" + "submit": "സമർപ്പിക്കുക", + "tags": "വലുപ്പം മാറ്റുക,പരിഷ്ക്കരിക്കുക,അളവ്,അനുയോജ്യമാക്കുക" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "പേജ് നമ്പർ നൽകുക,ലേബൽ,ക്രമീകരിക്കുക,സൂചിക" @@ -1039,16 +2655,83 @@ "tags": "സ്വയം-കണ്ടെത്തുക,തലക്കെട്ട്-അടിസ്ഥാനമാക്കിയുള്ള,ക്രമീകരിക്കുക,പുനർലേബൽ ചെയ്യുക", "title": "സ്വയം പുനർനാമകരണം ചെയ്യുക", "header": "PDF സ്വയം പുനർനാമകരണം ചെയ്യുക", - "submit": "സ്വയം പുനർനാമകരണം ചെയ്യുക" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "സ്വയം പുനർനാമകരണം ചെയ്യുക", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "നിറം-തിരുത്തൽ,ട്യൂൺ ചെയ്യുക,പരിഷ്ക്കരിക്കുക,മെച്ചപ്പെടുത്തുക" }, "crop": { - "tags": "മുറിക്കുക,ചുരുക്കുക,തിരുത്തുക,രൂപം", "title": "ക്രോപ്പ് ചെയ്യുക", "header": "PDF ക്രോപ്പ് ചെയ്യുക", - "submit": "സമർപ്പിക്കുക" + "submit": "സമർപ്പിക്കുക", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "മുറിക്കുക,ചുരുക്കുക,തിരുത്തുക,രൂപം" }, "autoSplitPDF": { "tags": "QR-അടിസ്ഥാനമാക്കിയുള്ള,വേർതിരിക്കുക,സ്കാൻ-സെഗ്മെന്റ്,ക്രമീകരിക്കുക", @@ -1131,24 +2814,124 @@ "downloadJS": "ജാവാസ്ക്രിപ്റ്റ് ഡൗൺലോഡ് ചെയ്യുക", "submit": "കാണിക്കുക" }, - "autoRedact": { - "tags": "റെഡാക്റ്റ്,മറയ്ക്കുക,കറുപ്പിക്കുക,കറുപ്പ്,മാർക്കർ,മറഞ്ഞിരിക്കുന്ന", - "title": "സ്വയം റെഡാക്റ്റ് ചെയ്യുക", - "header": "സ്വയം റെഡാക്റ്റ് ചെയ്യുക", - "colorLabel": "നിറം", - "textsToRedactLabel": "റെഡാക്റ്റ് ചെയ്യേണ്ട ടെക്സ്റ്റ് (വരികളാൽ വേർതിരിച്ചത്)", - "textsToRedactPlaceholder": "ഉദാ. \\nരഹസ്യം \\nഅതീവ-രഹസ്യം", - "useRegexLabel": "റെഗുലർ എക്സ്പ്രഷൻ ഉപയോഗിക്കുക", - "wholeWordSearchLabel": "മുഴുവൻ വാക്ക് തിരയൽ", - "customPaddingLabel": "ഇഷ്ടാനുസൃത അധിക പാഡിംഗ്", - "convertPDFToImageLabel": "PDF-നെ PDF-ചിത്രത്തിലേക്ക് മാറ്റുക (ബോക്സിന് പിന്നിലെ ടെക്സ്റ്റ് നീക്കം ചെയ്യാൻ ഉപയോഗിക്കുന്നു)", - "submitButton": "സമർപ്പിക്കുക" - }, "redact": { "tags": "റെഡാക്റ്റ്,മറയ്ക്കുക,കറുപ്പിക്കുക,കറുപ്പ്,മാർക്കർ,മറഞ്ഞിരിക്കുന്ന,സ്വയം", "title": "സ്വയം റെഡാക്ഷൻ", - "header": "സ്വയം റെഡാക്ഷൻ", "submit": "റെഡാക്റ്റ് ചെയ്യുക", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Advanced" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Add", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pages", + "placeholder": "(e.g. 1,2,8 or 4,7,12-16 or 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "സ്വയം റെഡാക്ഷൻ", "textBasedRedaction": "ടെക്സ്റ്റ് അടിസ്ഥാനമാക്കിയുള്ള റെഡാക്ഷൻ", "pageBasedRedaction": "പേജ് അടിസ്ഥാനമാക്കിയുള്ള റെഡാക്ഷൻ", "convertPDFToImageLabel": "PDF-നെ PDF-ചിത്രത്തിലേക്ക് മാറ്റുക (ബോക്സിന് പിന്നിലെ ടെക്സ്റ്റ് നീക്കം ചെയ്യാൻ ഉപയോഗിക്കുന്നു)", @@ -1185,11 +2968,15 @@ "overlay-pdfs": { "tags": "ഓവർലേ", "header": "PDF ഫയലുകൾ ഓവർലേ ചെയ്യുക", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "അടിസ്ഥാന PDF ഫയൽ തിരഞ്ഞെടുക്കുക" }, "overlayFiles": { - "label": "ഓവർലേ PDF ഫയലുകൾ തിരഞ്ഞെടുക്കുക" + "label": "ഓവർലേ PDF ഫയലുകൾ തിരഞ്ഞെടുക്കുക", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "ഓവർലേ മോഡ് തിരഞ്ഞെടുക്കുക", @@ -1199,14 +2986,53 @@ }, "counts": { "label": "ഓവർലേ എണ്ണം (നിശ്ചിത ആവർത്തന മോഡിനായി)", - "placeholder": "കോമയാൽ വേർതിരിച്ച എണ്ണം നൽകുക (ഉദാ., 2,3,1)" + "placeholder": "കോമയാൽ വേർതിരിച്ച എണ്ണം നൽകുക (ഉദാ., 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "ഓവർലേ സ്ഥാനം തിരഞ്ഞെടുക്കുക", "foreground": "മുൻഭാഗം", "background": "പശ്ചാത്തലം" }, - "submit": "സമർപ്പിക്കുക" + "submit": "സമർപ്പിക്കുക", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "വിഭാഗം വിഭജനം, വിഭജിക്കുക, ഇഷ്ടാനുസൃതമാക്കുക", @@ -1227,6 +3053,7 @@ "tags": "സ്റ്റാമ്പ്, ചിത്രം ചേർക്കുക, ചിത്രം മധ്യത്തിലാക്കുക, വാട്ടർമാർക്ക്, PDF, ഉൾപ്പെടുത്തുക, ഇഷ്ടാനുസൃതമാക്കുക", "header": "PDF സ്റ്റാമ്പ് ചെയ്യുക", "title": "PDF സ്റ്റാമ്പ് ചെയ്യുക", + "stampSetup": "Stamp Setup", "stampType": "സ്റ്റാമ്പ് തരം", "stampText": "സ്റ്റാമ്പ് ടെക്സ്റ്റ്", "stampImage": "സ്റ്റാമ്പ് ചിത്രം", @@ -1239,7 +3066,19 @@ "overrideY": "Y കോർഡിനേറ്റ് മാറ്റിയെഴുതുക", "customMargin": "ഇഷ്ടാനുസൃത മാർജിൻ", "customColor": "ഇഷ്ടാനുസൃത ടെക്സ്റ്റ് നിറം", - "submit": "സമർപ്പിക്കുക" + "submit": "സമർപ്പിക്കുക", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "ചിത്രം നീക്കം ചെയ്യുക,പേജ് പ്രവർത്തനങ്ങൾ,ബാക്ക് എൻഡ്,സെർവർ സൈഡ്" @@ -1257,7 +3096,8 @@ "status": { "_value": "സ്ഥിതി", "valid": "സാധുവാണ്", - "invalid": "അസാധുവാണ്" + "invalid": "അസാധുവാണ്", + "complete": "Validation complete" }, "signer": "ഒപ്പിട്ടയാൾ", "date": "തീയതി", @@ -1284,40 +3124,122 @@ "version": "പതിപ്പ്", "keyUsage": "കീ ഉപയോഗം", "selfSigned": "സ്വയം ഒപ്പിട്ടത്", - "bits": "ബിറ്റുകൾ" + "bits": "ബിറ്റുകൾ", + "details": "Certificate Details" }, "signature": { "info": "ഒപ്പ് വിവരങ്ങൾ", "_value": "ഒപ്പ്", "mathValid": "ഒപ്പ് ഗണിതശാസ്ത്രപരമായി സാധുവാണ് പക്ഷേ:" }, - "selectCustomCert": "ഇഷ്ടാനുസൃത സർട്ടിഫിക്കറ്റ് ഫയൽ X.509 (ഓപ്ഷണൽ)" - }, - "replace-color": { - "title": "നിറം-മാറ്റുക-വിപരീതമാക്കുക", - "header": "PDF-ലെ നിറം മാറ്റുക-വിപരീതമാക്കുക", - "selectText": { - "1": "നിറം മാറ്റുന്നതിനോ വിപരീതമാക്കുന്നതിനോ ഉള്ള ഓപ്ഷനുകൾ", - "2": "സ്ഥിരസ്ഥിതി (സ്ഥിരസ്ഥിതി ഉയർന്ന കോൺട്രാസ്റ്റ് നിറങ്ങൾ)", - "3": "ഇഷ്ടാനുസൃതം (ഇഷ്ടാനുസൃതമാക്കിയ നിറങ്ങൾ)", - "4": "പൂർണ്ണ-വിപരീതം (എല്ലാ നിറങ്ങളും വിപരീതമാക്കുക)", - "5": "ഉയർന്ന കോൺട്രാസ്റ്റ് വർണ്ണ ഓപ്ഷനുകൾ", - "6": "കറുത്ത പശ്ചാത്തലത്തിൽ വെളുത്ത ടെക്സ്റ്റ്", - "7": "വെളുത്ത പശ്ചാത്തലത്തിൽ കറുത്ത ടെക്സ്റ്റ്", - "8": "കറുത്ത പശ്ചാത്തലത്തിൽ മഞ്ഞ ടെക്സ്റ്റ്", - "9": "കറുത്ത പശ്ചാത്തലത്തിൽ പച്ച ടെക്സ്റ്റ്", - "10": "ടെക്സ്റ്റ് നിറം തിരഞ്ഞെടുക്കുക", - "11": "പശ്ചാത്തല നിറം തിരഞ്ഞെടുക്കുക" + "selectCustomCert": "ഇഷ്ടാനുസൃത സർട്ടിഫിക്കറ്റ് ഫയൽ X.509 (ഓപ്ഷണൽ)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "മാറ്റുക" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "നിറം മാറ്റുക,പേജ് പ്രവർത്തനങ്ങൾ,ബാക്ക് എൻഡ്,സെർവർ സൈഡ്" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "സൈൻ ഇൻ ചെയ്യുക", "header": "സൈൻ ഇൻ ചെയ്യുക", "signin": "സൈൻ ഇൻ ചെയ്യുക", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "എന്നെ ഓർക്കുക", "invalid": "അസാധുവായ ഉപയോക്തൃനാമം അല്ലെങ്കിൽ പാസ്വേഡ്.", "locked": "നിങ്ങളുടെ അക്കൗണ്ട് ലോക്ക് ചെയ്തിരിക്കുന്നു.", @@ -1336,12 +3258,83 @@ "alreadyLoggedIn": "നിങ്ങൾ ഇതിനകം ലോഗിൻ ചെയ്തിട്ടുണ്ട്", "alreadyLoggedIn2": "ഉപകരണങ്ങളിൽ. ദയവായി ഉപകരണങ്ങളിൽ നിന്ന് ലോഗ് ഔട്ട് ചെയ്ത് വീണ്ടും ശ്രമിക്കുക.", "toManySessions": "നിങ്ങൾക്ക് വളരെയധികം സജീവ സെഷനുകൾ ഉണ്ട്", - "logoutMessage": "നിങ്ങൾ ലോഗ് ഔട്ട് ചെയ്തു." + "logoutMessage": "നിങ്ങൾ ലോഗ് ഔട്ട് ചെയ്തു.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF ഒരൊറ്റ പേജിലേക്ക്", "header": "PDF ഒരൊറ്റ പേജിലേക്ക്", - "submit": "ഒരൊറ്റ പേജിലേക്ക് മാറ്റുക" + "submit": "ഒരൊറ്റ പേജിലേക്ക് മാറ്റുക", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "പേജുകൾ വേർതിരിച്ചെടുക്കുക", @@ -1365,18 +3358,59 @@ "adjustContrast": { "title": "കോൺട്രാസ്റ്റ് ക്രമീകരിക്കുക", "header": "കോൺട്രാസ്റ്റ് ക്രമീകരിക്കുക", + "basic": "Basic Adjustments", "contrast": "കോൺട്രാസ്റ്റ്:", "brightness": "തെളിച്ചം:", "saturation": "സാച്ചുറേഷൻ:", - "download": "ഡൗൺലോഡ് ചെയ്യുക" + "download": "ഡൗൺലോഡ് ചെയ്യുക", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "കംപ്രസ് ചെയ്യുക", + "desc": "Compress PDFs to reduce their file size.", "header": "PDF കംപ്രസ് ചെയ്യുക", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "File Size" + }, "credit": "ഈ സേവനം PDF കംപ്രസ്/ഒപ്റ്റിമൈസേഷനായി qpdf ഉപയോഗിക്കുന്നു.", "grayscale": { "label": "കംപ്രഷനായി ഗ്രേസ്കെയിൽ പ്രയോഗിക്കുക" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "കംപ്രഷൻ ക്രമീകരണങ്ങൾ", @@ -1487,7 +3521,13 @@ "title": "ചിത്രം നീക്കം ചെയ്യുക", "header": "ചിത്രം നീക്കം ചെയ്യുക", "removeImage": "ചിത്രം നീക്കം ചെയ്യുക", - "submit": "ചിത്രം നീക്കം ചെയ്യുക" + "submit": "ചിത്രം നീക്കം ചെയ്യുക", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "അധ്യായങ്ങൾ അനുസരിച്ച് PDF വിഭജിക്കുക", @@ -1521,6 +3561,12 @@ }, "note": "റിലീസ് കുറിപ്പുകൾ ഇംഗ്ലീഷിൽ മാത്രമേ ലഭ്യമാകൂ" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "ഞങ്ങൾ കുക്കികൾ എങ്ങനെ ഉപയോഗിക്കുന്നു", @@ -1556,6 +3602,1747 @@ "title": "അനലിറ്റിക്സ്", "description": "ഞങ്ങളുടെ ടൂളുകൾ എങ്ങനെ ഉപയോഗിക്കുന്നുവെന്ന് മനസ്സിലാക്കാൻ ഈ കുക്കികൾ ഞങ്ങളെ സഹായിക്കുന്നു, അതിനാൽ ഞങ്ങളുടെ കമ്മ്യൂണിറ്റി ഏറ്റവും കൂടുതൽ വിലമതിക്കുന്ന ഫീച്ചറുകൾ നിർമ്മിക്കുന്നതിൽ ഞങ്ങൾക്ക് ശ്രദ്ധ കേന്ദ്രീകരിക്കാൻ കഴിയും. ഉറപ്പാക്കുക—സ്റ്റെർലിംഗ് PDF-ന് നിങ്ങൾ പ്രവർത്തിക്കുന്ന പ്രമാണങ്ങളുടെ ഉള്ളടക്കം ട്രാക്ക് ചെയ്യാൻ കഴിയില്ല, ഒരിക്കലും കഴിയില്ല." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } + }, + "removeMetadata": { + "submit": "Remove Metadata" + }, + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } + }, + "quickAccess": { + "read": "Read", + "sign": "Sign", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, + "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Loading...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" + }, + "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", + "fileName": "Name", + "fileFormat": "Format", + "fileSize": "Size", + "fileVersion": "Version", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", + "download": "Download", + "delete": "Delete", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" + }, + "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", + "submit": "Sanitise PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", + "steps": { + "files": "Files", + "settings": "Settings", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "പാസ്വേഡ് ചേർക്കുക", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "എൻക്രിപ്റ്റ് ചെയ്യുക", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Change Permissions", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "സുരക്ഷിതം,സുരക്ഷ", + "header": "പാസ്വേഡ് ചേർക്കുക (എൻക്രിപ്റ്റ് ചെയ്യുക)", + "selectText": { + "1": "എൻക്രിപ്റ്റ് ചെയ്യേണ്ട PDF തിരഞ്ഞെടുക്കുക", + "2": "ഉപയോക്തൃ പാസ്വേഡ്", + "3": "എൻക്രിപ്ഷൻ കീ ദൈർഘ്യം", + "4": "ഉയർന്ന മൂല്യങ്ങൾ കൂടുതൽ ശക്തമാണ്, എന്നാൽ താഴ്ന്ന മൂല്യങ്ങൾക്ക് മികച്ച അനുയോജ്യതയുണ്ട്.", + "5": "സജ്ജമാക്കേണ്ട അനുമതികൾ (ഉടമയുടെ പാസ്വേഡിനൊപ്പം ഉപയോഗിക്കാൻ ശുപാർശ ചെയ്യുന്നു)", + "6": "പ്രമാണം കൂട്ടിച്ചേർക്കുന്നത് തടയുക", + "7": "ഉള്ളടക്കം വേർതിരിച്ചെടുക്കുന്നത് തടയുക", + "8": "ലഭ്യതയ്ക്കായി വേർതിരിച്ചെടുക്കുന്നത് തടയുക", + "9": "ഫോം പൂരിപ്പിക്കുന്നത് തടയുക", + "10": "പരിഷ്ക്കരണം തടയുക", + "11": "വ്യാഖ്യാന പരിഷ്ക്കരണം തടയുക", + "12": "അച്ചടി തടയുക", + "13": "വ്യത്യസ്ത ഫോർമാറ്റുകളിൽ അച്ചടിക്കുന്നത് തടയുക", + "14": "ഉടമയുടെ പാസ്വേഡ്", + "15": "പ്രമാണം തുറന്നുകഴിഞ്ഞാൽ എന്തുചെയ്യാൻ കഴിയുമെന്നത് നിയന്ത്രിക്കുന്നു (എല്ലാ റീഡറുകളും പിന്തുണയ്ക്കുന്നില്ല)", + "16": "പ്രമാണം തന്നെ തുറക്കുന്നത് നിയന്ത്രിക്കുന്നു" + } + }, + "changePermissions": { + "title": "Change Permissions", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", + "submit": "Change Permissions", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, + "permissions": { + "preventAssembly": { + "label": "Prevent assembly of document" + }, + "preventExtractContent": { + "label": "Prevent content extraction" + }, + "preventExtractForAccessibility": { + "label": "Prevent extraction for accessibility" + }, + "preventFillInForm": { + "label": "Prevent filling in form" + }, + "preventModify": { + "label": "Prevent modification" + }, + "preventModifyAnnotations": { + "label": "Prevent annotation modification" + }, + "preventPrinting": { + "label": "Prevent printing" + }, + "preventPrintingFaithful": { + "label": "Prevent printing different formats" + } + }, + "results": { + "title": "Modified PDFs" + }, + "tooltip": { + "header": { + "title": "Change Permissions" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." + } + } + }, + "removePassword": { + "title": "പാസ്വേഡ് നീക്കം ചെയ്യുക", + "desc": "Remove password protection from your PDF document.", + "tags": "സുരക്ഷിതം,ഡീക്രിപ്റ്റ്,സുരക്ഷ,പാസ്വേഡ് ഇല്ലാതാക്കുക,പാസ്വേഡ് നീക്കം ചെയ്യുക", + "password": { + "stepTitle": "Remove Password", + "label": "Current Password", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "നീക്കം ചെയ്യുക", + "results": { + "title": "Decrypted PDFs" + }, + "header": "പാസ്വേഡ് നീക്കം ചെയ്യുക (ഡീക്രിപ്റ്റ് ചെയ്യുക)", + "selectText": { + "1": "ഡീക്രിപ്റ്റ് ചെയ്യേണ്ട PDF തിരഞ്ഞെടുക്കുക", + "2": "പാസ്വേഡ്" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "നിറം മാറ്റുന്നതിനോ വിപരീതമാക്കുന്നതിനോ ഉള്ള ഓപ്ഷനുകൾ", + "2": "സ്ഥിരസ്ഥിതി (സ്ഥിരസ്ഥിതി ഉയർന്ന കോൺട്രാസ്റ്റ് നിറങ്ങൾ)", + "3": "ഇഷ്ടാനുസൃതം (ഇഷ്ടാനുസൃതമാക്കിയ നിറങ്ങൾ)", + "4": "പൂർണ്ണ-വിപരീതം (എല്ലാ നിറങ്ങളും വിപരീതമാക്കുക)", + "5": "ഉയർന്ന കോൺട്രാസ്റ്റ് വർണ്ണ ഓപ്ഷനുകൾ", + "6": "കറുത്ത പശ്ചാത്തലത്തിൽ വെളുത്ത ടെക്സ്റ്റ്", + "7": "വെളുത്ത പശ്ചാത്തലത്തിൽ കറുത്ത ടെക്സ്റ്റ്", + "8": "കറുത്ത പശ്ചാത്തലത്തിൽ മഞ്ഞ ടെക്സ്റ്റ്", + "9": "കറുത്ത പശ്ചാത്തലത്തിൽ പച്ച ടെക്സ്റ്റ്", + "10": "ടെക്സ്റ്റ് നിറം തിരഞ്ഞെടുക്കുക", + "11": "പശ്ചാത്തല നിറം തിരഞ്ഞെടുക്കുക", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "മാറ്റുക", + "title": "നിറം-മാറ്റുക-വിപരീതമാക്കുക", + "header": "PDF-ലെ നിറം മാറ്റുക-വിപരീതമാക്കുക" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "റെഡാക്റ്റ്,മറയ്ക്കുക,കറുപ്പിക്കുക,കറുപ്പ്,മാർക്കർ,മറഞ്ഞിരിക്കുന്ന", + "title": "സ്വയം റെഡാക്റ്റ് ചെയ്യുക", + "header": "സ്വയം റെഡാക്റ്റ് ചെയ്യുക", + "colorLabel": "നിറം", + "textsToRedactLabel": "റെഡാക്റ്റ് ചെയ്യേണ്ട ടെക്സ്റ്റ് (വരികളാൽ വേർതിരിച്ചത്)", + "textsToRedactPlaceholder": "ഉദാ. \\nരഹസ്യം \\nഅതീവ-രഹസ്യം", + "useRegexLabel": "റെഗുലർ എക്സ്പ്രഷൻ ഉപയോഗിക്കുക", + "wholeWordSearchLabel": "മുഴുവൻ വാക്ക് തിരയൽ", + "customPaddingLabel": "ഇഷ്ടാനുസൃത അധിക പാഡിംഗ്", + "convertPDFToImageLabel": "PDF-നെ PDF-ചിത്രത്തിലേക്ക് മാറ്റുക (ബോക്സിന് പിന്നിലെ ടെക്സ്റ്റ് നീക്കം ചെയ്യാൻ ഉപയോഗിക്കുന്നു)", + "submitButton": "സമർപ്പിക്കുക" + }, + "replaceColorPdf": { + "tags": "നിറം മാറ്റുക,പേജ് പ്രവർത്തനങ്ങൾ,ബാക്ക് എൻഡ്,സെർവർ സൈഡ്" } } diff --git a/frontend/public/locales/nl-NL/translation.json b/frontend/public/locales/nl-NL/translation.json index 6b3ad5eb8..1b7be68fb 100644 --- a/frontend/public/locales/nl-NL/translation.json +++ b/frontend/public/locales/nl-NL/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Aangepaste tekst", "numberPagesDesc": "Welke pagina's genummerd moeten worden, standaard 'all', accepteert ook 1-5 of 2,5,9 etc", "customNumberDesc": "Standaard {n}, accepteert ook 'Pagina {n} van {total}', 'Tekst-{n}', '{filename}-{n}", - "submit": "Paginanummers toevoegen" + "submit": "Paginanummers toevoegen", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Aangepaste pagina selectie (Voer een komma-gescheiden lijst van paginanummer 1,5,6 of functies zoals 2n+1 in) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Selecteer PDF('s)", "multiPdfPrompt": "Selecteer PDF's (2+)", "multiPdfDropPrompt": "Selecteer (of sleep & zet neer) alle PDF's die je nodig hebt", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Waarschuwing: Dit proces kan tot een minuut duren afhankelijk van de bestandsgrootte", "pageOrderPrompt": "Aangepaste pagina volgorde (Voer een komma-gescheiden lijst van paginanummers of functies in, zoals 2n+1) :", - "pageSelectionPrompt": "Aangepaste pagina selectie (Voer een komma-gescheiden lijst van paginanummer 1,5,6 of functies zoals 2n+1 in) :", "goToPage": "Ga", "true": "Waar", "false": "Onwaar", "unknown": "Onbekend", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Opslaan", "saveToBrowser": "Opslaan in browser", + "download": "Downloaden", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Sluiten", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "Bestanden geselecteerd", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Geen favorieten toegevoegd", "downloadComplete": "Download klaar", "bored": "Verveeld met wachten?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "Het PDF document is beveiligd met een wachtwoord en het wachtwoord is niet ingevoerd of is onjuist", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Fout", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Excuses voor het probleem!", "needHelp": "Hulp nodig / probleem gevonden?", "contactTip": "Als je nog steeds problemen hebt, schroom niet om contact met ons op te nemen voor hulp. Je kan een ticket op onze Github pagina indienen of ons via Discord bereiken:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Dien een ticket in", "discordSubmit": "Discord - Maak een support post" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Verwijderen", "username": "Gebruikersnaam", "password": "Wachtwoord", @@ -82,6 +169,7 @@ "green": "Groen", "blue": "Blauw", "custom": "Aangepast...", + "comingSoon": "Coming soon", "WorkInProgess": "Werk in uitvoering. Werkt mogelijk niet of bevat fouten. Meld eventuele problemen!", "poweredBy": "Mogelijk gemaakt door", "yes": "Ja", @@ -115,12 +203,14 @@ "page": "Pagina", "pages": "Pagen", "loading": "Laden...", + "review": "Review", "addToDoc": "Toevoegen aan document", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Privacybeleid", + "iAgreeToThe": "I agree to all of the", "terms": "Voorwaarden van gebruik", "accessibility": "Toegankelijkheid", "cookie": "Cookiesbeleid", @@ -160,6 +250,7 @@ "title": "Do you want make Stirling PDF better?", "paragraph1": "Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.", "paragraph2": "Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.", + "learnMore": "Learn more", "enable": "Enable analytics", "disable": "Disable analytics", "settings": "You can change the settings for analytics in the config/settings.yml file" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Sla invoer in formulieren op", "help": "Schakel in om eerdere invoeren op te slaan voor toekomstige uitvoeren" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Database Importeer/Exporteer", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF multitool", "desc": "Pagina's samenvoegen, draaien, herschikken en verwijderen" }, "merge": { + "tags": "combine,join,unite", "title": "Samenvoegen", "desc": "Voeg eenvoudig meerdere PDF's samen tot één." }, "split": { + "tags": "divide,separate,break", "title": "Splitsen", "desc": "Splits PDF's in meerdere documenten" }, "rotate": { + "tags": "turn,flip,orient", "title": "Roteren", "desc": "Roteer eenvoudig je PDF's." }, + "convert": { + "tags": "transform,change", + "title": "Omzetten", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organiseren", + "desc": "Verwijder/herschik pagina's in een volgorde naar keus" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Afbeelding toevoegen", + "desc": "Voegt een afbeelding toe op een specifieke locatie in de PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Watermerk toevoegen", + "desc": "Voeg een aangepast watermerk toe aan je PDF-document." + }, + "removePassword": { + "tags": "unlock", + "title": "Wachtwoord verwijderen", + "desc": "Verwijder wachtwoordbeveiliging van je PDF-document." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Comprimeren", + "desc": "Comprimeer PDF's om hun bestandsgrootte te verkleinen." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Metadata wijzigen", + "desc": "Wijzig/verwijder/voeg metadata toe van een PDF-document" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Scans opruimen", + "desc": "Ruim scans op, detecteert tekst van afbeeldingen in een PDF en voegt deze opnieuw toe als tekst." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Afbeeldingen extraheren", + "desc": "Extraheert alle afbeeldingen uit een PDF en slaat ze op in een zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Ondertekenen", + "desc": "Voegt handtekening toe aan PDF via tekenen, tekst of afbeelding" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Platdrukken", + "desc": "Verwijder alle interactieve elementen en formulieren uit een PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Ondertekenen met certificaat", + "desc": "Ondertekent een PDF met een certificaat/sleutel (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Repareren", + "desc": "Probeert een corrupt/beschadigd PDF te herstellen" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Verwijder lege pagina's", + "desc": "Detecteert en verwijdert lege pagina's uit een document" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Annotaties verwijderen", + "desc": "Verwijdert alle opmerkingen/annotaties uit een PDF" + }, + "compare": { + "tags": "difference", + "title": "Vergelijken", + "desc": "Vergelijkt en toont de verschillen tussen twee PDF-documenten" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Verwijder certificaat", + "desc": "Verwijder certificaat van PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Multi-pagina indeling", + "desc": "Voeg meerdere pagina's van een PDF-document samen op één pagina" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Aanpassen paginaformaat/schaal", + "desc": "Wijzig de grootte/schaal van een pagina en/of de inhoud ervan." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Paginanummers toevoegen", + "desc": "Voeg paginanummers toe binnen het volledige document op een vastgestelde locatie" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Kleuren/contrast aanpassen", + "desc": "Pas contrast, verzadiging en helderheid van een PDF aan" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF bijsnijden", + "desc": "Snijd een PDF bij om de grootte te verkleinen (behoudt tekst!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Automatisch splitsen pagina's", + "desc": "Automatisch splitsen van gescande PDF met fysieke gescande paginasplitter QR-code" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Haal ALLE informatie op over PDF", + "desc": "Haalt alle mogelijke informatie op van PDF's" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF naar één grote pagina", + "desc": "Voegt alle PDF-pagina's samen tot één grote pagina" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Toon Javascript", + "desc": "Zoekt en toont ieder script dat in een PDF is geïnjecteerd" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Afbeelding verwijderen", + "desc": "Afbeeldingen uit PDF verwijderen om het bestandsgrootte te verminderen" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "PDF op hoofdstukken splitsen", + "desc": "Splits een PDF op basis van zijn hoofdstukstructuur in meerdere bestanden." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Pagina's extraheren", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Verwijderen", + "desc": "Verwijder ongewenste pagina's uit je PDF-document." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Automatisch splitsen op grootte/aantal", + "desc": "Splits een enkele PDF in meerdere documenten op basis van grootte, aantal pagina's of aantal documenten" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Wachtwoord toevoegen", + "desc": "Versleutel je PDF-document met een wachtwoord." + }, + "changePermissions": { + "title": "Rechten wijzigen", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Plaatst PDF's over een andere PDF heen", + "title": "PDF's overlappen" + }, "imageToPDF": { "title": "Afbeelding naar PDF", "desc": "Converteer een afbeelding (PNG, JPEG, GIF) naar PDF." @@ -355,18 +786,6 @@ "title": "PDF naar Afbeelding", "desc": "Converteer een PDF naar een afbeelding. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organiseren", - "desc": "Verwijder/herschik pagina's in een volgorde naar keus" - }, - "addImage": { - "title": "Afbeelding toevoegen", - "desc": "Voegt een afbeelding toe op een specifieke locatie in de PDF" - }, - "watermark": { - "title": "Watermerk toevoegen", - "desc": "Voeg een aangepast watermerk toe aan je PDF-document." - }, "permissions": { "title": "Permissies wijzigen", "desc": "Wijzig de permissies van je PDF-document" @@ -375,38 +794,10 @@ "title": "Verwijderen", "desc": "Verwijder ongewenste pagina's uit je PDF-document." }, - "addPassword": { - "title": "Wachtwoord toevoegen", - "desc": "Versleutel je PDF-document met een wachtwoord." - }, - "removePassword": { - "title": "Wachtwoord verwijderen", - "desc": "Verwijder wachtwoordbeveiliging van je PDF-document." - }, - "compress": { - "title": "Comprimeren", - "desc": "Comprimeer PDF's om hun bestandsgrootte te verkleinen." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Metadata wijzigen", - "desc": "Wijzig/verwijder/voeg metadata toe van een PDF-document" - }, "fileToPDF": { "title": "Bestand naar PDF converteren", "desc": "Converteer bijna ieder bestand naar PDF (DOCX, PNG, XLS, PPT, TXT en meer)" }, - "ocr": { - "title": "OCR / Scans opruimen", - "desc": "Ruim scans op, detecteert tekst van afbeeldingen in een PDF en voegt deze opnieuw toe als tekst." - }, - "extractImages": { - "title": "Afbeeldingen extraheren", - "desc": "Extraheert alle afbeeldingen uit een PDF en slaat ze op in een zip" - }, "pdfToPDFA": { "title": "PDF naar PDF/A", "desc": "Converteer PDF naar PDF/A voor langdurige opslag" @@ -435,70 +826,14 @@ "title": "Detecteer/Split gescande foto's", "desc": "Splits meerdere foto's van binnen een foto/PDF" }, - "sign": { - "title": "Ondertekenen", - "desc": "Voegt handtekening toe aan PDF via tekenen, tekst of afbeelding" - }, - "flatten": { - "title": "Platdrukken", - "desc": "Verwijder alle interactieve elementen en formulieren uit een PDF" - }, - "repair": { - "title": "Repareren", - "desc": "Probeert een corrupt/beschadigd PDF te herstellen" - }, - "removeBlanks": { - "title": "Verwijder lege pagina's", - "desc": "Detecteert en verwijdert lege pagina's uit een document" - }, - "removeAnnotations": { - "title": "Annotaties verwijderen", - "desc": "Verwijdert alle opmerkingen/annotaties uit een PDF" - }, - "compare": { - "title": "Vergelijken", - "desc": "Vergelijkt en toont de verschillen tussen twee PDF-documenten" - }, - "certSign": { - "title": "Ondertekenen met certificaat", - "desc": "Ondertekent een PDF met een certificaat/sleutel (PEM/P12)" - }, - "removeCertSign": { - "title": "Verwijder certificaat", - "desc": "Verwijder certificaat van PDF" - }, - "pageLayout": { - "title": "Multi-pagina indeling", - "desc": "Voeg meerdere pagina's van een PDF-document samen op één pagina" - }, - "scalePages": { - "title": "Aanpassen paginaformaat/schaal", - "desc": "Wijzig de grootte/schaal van een pagina en/of de inhoud ervan." - }, "pipeline": { "title": "Pijplijn", "desc": "Voer meerdere acties uit op PDF's door pipelinescripts te definiëren" }, - "addPageNumbers": { - "title": "Paginanummers toevoegen", - "desc": "Voeg paginanummers toe binnen het volledige document op een vastgestelde locatie" - }, "auto-rename": { "title": "Automatisch hernoemen PDF-bestand", "desc": "Hernoemt automatisch een PDF-bestand op basis van de gedetecteerde header" }, - "adjustContrast": { - "title": "Kleuren/contrast aanpassen", - "desc": "Pas contrast, verzadiging en helderheid van een PDF aan" - }, - "crop": { - "title": "PDF bijsnijden", - "desc": "Snijd een PDF bij om de grootte te verkleinen (behoudt tekst!)" - }, - "autoSplitPDF": { - "title": "Automatisch splitsen pagina's", - "desc": "Automatisch splitsen van gescande PDF met fysieke gescande paginasplitter QR-code" - }, "sanitizePDF": { "title": "Opschonen", "desc": "Verwijder scripts en andere elementen uit PDF-bestanden" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Haal ALLE informatie op over PDF", - "desc": "Haalt alle mogelijke informatie op van PDF's" - }, "pageExtracter": { "title": "Pagina('s) extraheren", "desc": "Extraheert geselecteerde pagina's uit PDF" }, - "pdfToSinglePage": { - "title": "PDF naar één grote pagina", - "desc": "Voegt alle PDF-pagina's samen tot één grote pagina" - }, - "showJS": { - "title": "Toon Javascript", - "desc": "Zoekt en toont ieder script dat in een PDF is geïnjecteerd" - }, "autoRedact": { "title": "Automatisch censureren", "desc": "Automatisch censureren (onherkenbaar maken) van tekst in een PDF op basis van ingevoerde tekst" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF naar CSV", "desc": "Haalt tabellen uit een PDF en converteert ze naar CSV" @@ -551,10 +870,6 @@ "title": "Automatisch splitsen op grootte/aantal", "desc": "Splits een enkele PDF in meerdere documenten op basis van grootte, aantal pagina's of aantal documenten" }, - "overlay-pdfs": { - "title": "PDF's overlappen", - "desc": "Plaatst PDF's over een andere PDF heen" - }, "split-by-sections": { "title": "PDF in secties splitsen", "desc": "Verdeel elke pagina van een PDF in kleinere horizontale en verticale secties" @@ -563,43 +878,17 @@ "title": "Stempel toevoegen aan PDF", "desc": "Voeg tekst of afbeeldingsstempels toe op vaste locaties" }, - "removeImage": { - "title": "Afbeelding verwijderen", - "desc": "Afbeeldingen uit PDF verwijderen om het bestandsgrootte te verminderen" - }, - "splitByChapters": { - "title": "PDF op hoofdstukken splitsen", - "desc": "Splits een PDF op basis van zijn hoofdstukstructuur in meerdere bestanden." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Vervang de kleur van tekst en achtergrond in een PDF en omverkeer de volledige kleur van het document om bestandsgrootte te verkleinen." }, - "convert": { - "title": "Omzetten" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Pagina's extraheren" - }, - "removePages": { - "title": "Verwijderen", - "desc": "Verwijder ongewenste pagina's uit je PDF-document." - }, "removeImagePdf": { "title": "Afbeelding verwijderen", "desc": "Afbeeldingen uit PDF verwijderen om het bestandsgrootte te verminderen" }, - "autoSizeSplitPDF": { - "title": "Automatisch splitsen op grootte/aantal", - "desc": "Splits een enkele PDF in meerdere documenten op basis van grootte, aantal pagina's of aantal documenten" - }, "adjust-contrast": { "title": "Kleuren/contrast aanpassen", "desc": "Pas contrast, verzadiging en helderheid van een PDF aan" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Replace and Invert Color", "desc": "Vervang de kleur van tekst en achtergrond in een PDF en omverkeer de volledige kleur van het document om bestandsgrootte te verkleinen." - }, - "changePermissions": { - "title": "Rechten wijzigen" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "bekijken,lezen,annoteren,tekst,afbeelding", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "samenvoegen,pagina bewerkingen,serverzijde", "title": "Samenvoegen", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Samenvoegen", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Bestandsnaam", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Meerdere PDF's samenvoegen (2+)", "sortByName": "Sorteer op naam", "sortByDate": "Sorteer op datum", - "removeCertSign": "Verwijder digitale handtekening in het samengevoegde bestand?", - "submit": "Samenvoegen", - "sortBy": { - "filename": "Bestandsnaam" - } + "removeCertSign": "Verwijder digitale handtekening in het samengevoegde bestand?" }, "split": { - "tags": "Pagina bewerkingen,verdelen,meerdere pagina's,knippen,serverzijde", "title": "PDF splitsen", "header": "PDF splitsen", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Voer pagina's in om op te splitsen:", "submit": "Splitsen", "steps": { + "chooseMethod": "Choose Method", "settings": "Instellingen" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Bestandsgrootte" + "name": "Bestandsgrootte", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Bestandsgrootte" + "label": "Bestandsgrootte", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Pagina bewerkingen,verdelen,meerdere pagina's,knippen,serverzijde" }, "rotate": { - "tags": "serverzijde", "title": "PDF roteren", + "submit": "Roteren", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "serverzijde", "header": "PDF roteren", - "selectAngle": "Selecteer rotatiehoek (in veelvouden van 90 graden):", - "submit": "Roteren" + "selectAngle": "Selecteer rotatiehoek (in veelvouden van 90 graden):" + }, + "convert": { + "title": "Omzetten", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Instellingen", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Kleur", + "greyscale": "Grijstinten", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Pagina vullen", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "Dit PDF bestand bevat een digitale handtekening. Deze wordt in de volgende stap verwijderd.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Grijstinten", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversie,img,jpg,foto" @@ -727,7 +1263,33 @@ "8": "Laatste verwijderen", "9": "Eerste en laaste verwijderen", "10": "Oneven-even samenvoeken", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(bijv. 1,3,2 of 4-8,2,10-12 of 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Afbeelding toevoegen", "submit": "Afbeelding toevoegen" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Tekst,herhalend,label,eigen,copyright,handelsmerk,img,jpg,foto", "title": "Watermerk toevoegen", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Watermerk toevoegen", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Tekst", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Lettertypegrootte", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Tekst", + "2": "Afbeelding" + }, + "tags": "Tekst,herhalend,label,eigen,copyright,handelsmerk,img,jpg,foto", "header": "Watermerk toevoegen", "customColor": "Aangepaste tekstkleur", "selectText": { @@ -755,17 +1506,6 @@ "8": "Type watermerk:", "9": "Watermerk afbeelding:", "10": "PDF omzetten naar PDF-Afbeelding" - }, - "submit": "Watermerk toevoegen", - "type": { - "1": "Tekst", - "2": "Afbeelding" - }, - "watermarkType": { - "text": "Tekst" - }, - "settings": { - "fontSize": "Lettertypegrootte" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Pagina's verwijderen", "title": "Verwijderen", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Verwijderen" }, - "addPassword": { - "tags": "veilig,beveiliging", - "title": "Wachtwoord toevoegen", - "header": "Wachtwoord toevoegen (Versleutelen)", - "selectText": { - "1": "Selecteer PDF om te versleutelen", - "2": "Gebruikerswachtwoord", - "3": "Versleutelingssleutellengte", - "4": "Hogere waarden zijn sterker, maar lagere waarden hebben een betere compatibiliteit.", - "5": "In te stellen rechten (Aanbevolen om te gebruiken samen met eigenaarswachtwoord)", - "6": "Voorkomen van documentassemblage", - "7": "Voorkomen van inhoudsextractie", - "8": "Voorkomen van extractie voor toegankelijkheid", - "9": "Voorkomen van invullen van formulier", - "10": "Voorkomen van wijziging", - "11": "Voorkomen van annotatiewijziging", - "12": "Voorkomen van afdrukken", - "13": "Voorkomen van afdrukken in verschillende formaten", - "14": "Eigenaarswachtwoord", - "15": "Beperkt wat gedaan kan worden met het document nadat het is geopend (Niet ondersteund door alle lezers)", - "16": "Beperkt het openen van het document zelf" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Versleutelen", "tooltip": { - "permissions": { - "title": "Rechten wijzigen" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "veilig,ontsleutelen,beveiliging,wachtwoord verwijderen", - "title": "Wachtwoord verwijderen", - "header": "Wachtwoord verwijderen (Decrypteren)", - "selectText": { - "1": "Selecteer PDF om te decrypteren", - "2": "Wachtwoord" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Verwijderen", - "desc": "Verwijder wachtwoordbeveiliging van je PDF-document.", - "password": { - "stepTitle": "Wachtwoord verwijderen", - "label": "Huidige wachtwoord" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Titel,auteur,datum,creatie,tijd,uitgever,producent,statistieken", - "title": "Titel:", "header": "Metadata wijzigen", + "submit": "Wijzigen", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Titel,auteur,datum,creatie,tijd,uitgever,producent,statistieken", "selectText": { "1": "Pas de variabelen aan die je wilt wijzigen", "2": "Verwijder alle metadata", @@ -856,15 +1877,7 @@ "4": "Overige metadata:", "5": "Voeg aangepaste metadata-invoer toe" }, - "author": "Auteur:", - "creationDate": "Aanmaakdatum (yyyy/MM/dd HH:mm:ss):", - "creator": "Maker:", - "keywords": "Trefwoorden:", - "modDate": "Wijzigingsdatum (yyyy/MM/dd HH:mm:ss):", - "producer": "Producent:", - "subject": "Onderwerp:", - "trapped": "Vastgezet:", - "submit": "Wijzigen" + "modDate": "Wijzigingsdatum (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformatie,formaat,document,foto,slide,tekst,conversie,kantoor,docs,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "herkenning,tekst,afbeelding,scan,lezen,identificeren,detectie,bewerkbaar", "title": "OCR / Scan opruimen", + "desc": "Ruim scans op, detecteert tekst van afbeeldingen in een PDF en voegt deze opnieuw toe als tekst.", "header": "Scans opruimen / OCR (Optical Character Recognition)", "selectText": { "1": "Selecteer talen die binnen de PDF gedetecteerd moeten worden (De vermelde zijn de momenteel gedetecteerde):", @@ -896,23 +1910,89 @@ "help": "Lees deze documentatie over hoe dit te gebruiken voor andere talen en/of gebruik buiten docker", "credit": "Deze dienst maakt gebruik van qpdf en Tesseract voor OCR.", "submit": "Verwerk PDF met OCR", - "desc": "Ruim scans op, detecteert tekst van afbeeldingen in een PDF en voegt deze opnieuw toe als tekst.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Instellingen", "ocrMode": { - "label": "OCR-modus" + "label": "OCR-modus", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Talen" + "label": "Talen", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR-modus" + "title": "OCR-modus", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Talen" + "title": "Talen", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Afbeeldingen extraheren", "selectText": "Selecteer het beeldformaat voor geëxtraheerde afbeeldingen", "allowDuplicates": "Dubbele afbeeldingen opslaan", - "submit": "Extraheer" + "submit": "Extraheer", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "archief,langdurig,standaard,conversie,opslag,bewaring", @@ -993,17 +2079,53 @@ }, "info": "Python is niet geïnstalleerd. Het wordt vereist om te worden uitgevoerd." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autoriseren,initialen,getekende-handtekening,tekst-handtekening,afbeelding-handtekening", "title": "Ondertekenen", "header": "PDF's ondertekenen", "upload": "Upload afbeelding", - "draw": "Handtekening tekenen", - "text": "Tekstinvoer", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Wissen", "add": "Toevoegen", "saved": "Gesleutelde handtekeningen opgeslagen", "save": "Opslaan Signatuur", + "applySignatures": "Apply Signatures", "personalSigs": "Persoonlijke Signatuuren", "sharedSigs": "Gedeelde Signatuuren", "noSavedSigs": "Geen opgeslagen signatuuren gevonden", @@ -1015,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autoriseren,initialen,getekende-handtekening,tekst-handtekening,afbeelding-handtekening" }, "flatten": { - "tags": "statisch,deactiveren,niet-interactief,stroomlijnen", "title": "Afvlakken", "header": "PDF's afvlakken", "flattenOnlyForms": "Alleen formulieren afvlakken", "submit": "Afvlakken", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Instellingen" }, "options": { - "flattenOnlyForms": "Alleen formulieren afvlakken" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Alleen formulieren afvlakken", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statisch,deactiveren,niet-interactief,stroomlijnen" }, "repair": { "tags": "repareren,herstellen,correctie,terughalen", "title": "Repareren", "header": "PDF's repareren", - "submit": "Repareren" + "submit": "Repareren", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "opruimen,stroomlijnen,geen-inhoud,organiseren", "title": "Verwijder blanco's", "header": "Verwijder lege pagina's", - "threshold": "Pixel witheid drempel:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Blanco's verwijderen", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "opruimen,stroomlijnen,geen-inhoud,organiseren", "thresholdDesc": "Drempel voor het bepalen hoe wit een witte pixel moet zijn om als 'Wit' te worden geclassificeerd. 0 = Zwart, 255 zuiver wit.", - "whitePercent": "Wit percentage (%):", - "whitePercentDesc": "Percentage van de pagina dat 'witte' pixels moet zijn om verwijderd te worden", - "submit": "Blanco's verwijderen" + "whitePercentDesc": "Percentage van de pagina dat 'witte' pixels moet zijn om verwijderd te worden" }, "removeAnnotations": { "tags": "opmerkingen,highlight,notities,opmaak,verwijderen", "title": "Verwijder annotaties", "header": "Verwijder annotaties", - "submit": "Verwijderen" + "submit": "Verwijderen", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "onderscheiden,contrasteren,veranderingen,analyse", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "authenticeren,PEM,P12,officieel,versleutelen", "title": "Certificaat ondertekening", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Locatie", + "logoTitle": "Logo", + "name": "Naam", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Voer je sleutelopslag of privésleutel wachtwoord in (indien van toepassing):", + "passwordOptional": "Leave empty if no password", + "reason": "Reden", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Logotype tonen", "header": "Onderteken een PDF met je certificaat (in ontwikkeling)", "selectPDF": "Selecteer een PDF-bestand voor ondertekening:", "jksNote": "Let op: als het certificaattype hieronder niet staat, converteer het dan naar een Java Keystore (.jks) bestand met de keytool command line tool. Kies vervolgens de .jks bestandsoptie.", @@ -1089,13 +2484,7 @@ "selectCert": "Selecteer je certificaatbestand (X.509 formaat, kan .pem of .der zijn):", "selectP12": "Selecteer je PKCS#12 Sleutelopslagbestand (.p12 of .pfx) (Optioneel, indien verstrekt, moet het je privésleutel en certificaat bevatten):", "selectJKS": "Selecteer je Java Keystore bestand (.jks of .keystore):", - "certType": "Certificaattype", - "password": "Voer je sleutelopslag of privésleutel wachtwoord in (indien van toepassing):", "showSig": "Toon handtekening", - "reason": "Reden", - "location": "Locatie", - "name": "Naam", - "showLogo": "Logotype tonen", "submit": "PDF ondertekenen" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Verwijder certificaat", "header": "Verwijder het digitale certificaat van de PDF", "selectPDF": "Selecteer een PDF bestand:", - "submit": "Verwijder certificaat" + "submit": "Verwijder certificaat", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "samenvoegen,composiet,enkel-zicht,organiseren", @@ -1111,16 +2511,157 @@ "header": "Meerdere pagina indeling", "pagesPerSheet": "Pagina's per vel:", "addBorder": "Randen toevoegen", - "submit": "Indienen" + "submit": "Indienen", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "resize,aanpassen,dimensie,aanpassen", "title": "Pagina-schaal aanpassen", "header": "Pagina-schaal aanpassen", "pageSize": "Grootte van een pagina van het document.", "keepPageSize": "Oorspronkelijke grootte behouden", "scaleFactor": "Zoomniveau (uitsnede) van een pagina.", - "submit": "Indienen" + "submit": "Indienen", + "tags": "resize,aanpassen,dimensie,aanpassen" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "pagineren,labelen,organiseren,indexeren" @@ -1129,16 +2670,83 @@ "tags": "auto-detecteren,op-header-gebaseerd,organiseren,herlabelen", "title": "Automatisch hernoemen", "header": "PDF automatisch hernoemen", - "submit": "Automatisch hernoemen" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Automatisch hernoemen", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "kleur-correctie,afstemmen,aanpassen,verbeteren" }, "crop": { - "tags": "trimmen,verkleinen,bewerken,vorm", "title": "Bijwerken", "header": "PDF bijsnijden", - "submit": "Indienen" + "submit": "Indienen", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "trimmen,verkleinen,bewerken,vorm" }, "autoSplitPDF": { "tags": "QR-gebaseerd,scheiden,scan-segment,organiseren", @@ -1221,24 +2829,124 @@ "downloadJS": "Javascript downloaden", "submit": "Toon" }, - "autoRedact": { - "tags": "Verzwakken, Verbergen, Uitroepen, Gekleurd, Verborgen", - "title": "Automatisch censureren", - "header": "Automatisch censureren", - "colorLabel": "Kleur", - "textsToRedactLabel": "Tekst om te censureren (gescheiden door regels)", - "textsToRedactPlaceholder": "bijv.\\Vertrouwelijk \\nTopgeheim", - "useRegexLabel": "Gebruik regex", - "wholeWordSearchLabel": "Zoeken op hele woorden", - "customPaddingLabel": "Aangepaste extra ruimtevulling", - "convertPDFToImageLabel": "Converteer PDF naar PDF-afbeelding (wordt gebruikt om tekst achter het vak te verwijderen)", - "submitButton": "Indienen" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Geavanceerd" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Toevoegen", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pagen", + "placeholder": "(bijv. 1,2,8 of 4,7,12-16 of 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1264,21 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Geavanceerd" - }, - "wordsToRedact": { - "add": "Toevoegen" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Pagen", - "placeholder": "(bijv. 1,2,8 of 4,7,12-16 of 2n-1)" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,tabel extractie,extractie,converteren" @@ -1289,11 +2983,15 @@ "overlay-pdfs": { "tags": "Overlappen", "header": "PDF bestanden overlappen", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Selecteer basis PDF-bestand" }, "overlayFiles": { - "label": "Selecteer overlappende PDF-bestanden" + "label": "Selecteer overlappende PDF-bestanden", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Selecteer overlappingsmodus", @@ -1303,14 +3001,53 @@ }, "counts": { "label": "Aantal keren overlappen (voor vaste herhalings modus)", - "placeholder": "Voer door komma's gescheiden aantallen in (bijv., 2,3,1)" + "placeholder": "Voer door komma's gescheiden aantallen in (bijv., 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Selecteer overlappingspositie", "foreground": "Voorgrond", "background": "Achtergrond" }, - "submit": "Indienen" + "submit": "Indienen", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Sectie splitsen, Verdelen, Aanpassen", @@ -1331,6 +3068,7 @@ "tags": "Stempel, Afbeelding toevoegen, afbeelding centreren, watermerk, PDF, Insluiten, Aanpassen", "header": "Stempel PDF", "title": "Stempel PDF", + "stampSetup": "Stamp Setup", "stampType": "Soort stempel", "stampText": "Stempel tekst", "stampImage": "Stempel afbeelding", @@ -1343,7 +3081,19 @@ "overrideY": "Y coördinaat overschrijven", "customMargin": "Aangepaste marge", "customColor": "Aangepaste tekstkleur", - "submit": "Indienen" + "submit": "Indienen", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Afbeelding verwijderen, Paginabewerkingen, Achterkant, Serverkant" @@ -1361,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1388,40 +3139,122 @@ "version": "Versie", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Kleur-instellingen voor PDF's", - "selectText": { - "1": "Vervang of invertere kleure opties", - "2": "Standaard (hoog contrast kleuren)", - "3": "Aangepast (aangepaste kleuren)", - "4": "Volledig inverteren (alle kleuren omverkeren)", - "5": "Opties voor hoog contrast", - "6": "wit tekst op een zwart grondvlak", - "7": "zwarte tekst op wit grondvlak", - "8": "gele tekst op een zwart grondvlak", - "9": "groene tekst op een zwart grondvlak", - "10": "Kies de tekstkleur", - "11": "Kies het achtergrondkleur" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Vervang" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Kleur vervangen, pagina-acties, achterkant, serverzijde" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Inloggen", "header": "Inloggen", "signin": "Inloggen", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Onthoud mij", "invalid": "Ongeldige gebruikersnaam of wachtwoord.", "locked": "Je account is geblokkeerd.", @@ -1440,12 +3273,83 @@ "alreadyLoggedIn": "U zit reeds ingelogd bij", "alreadyLoggedIn2": "apparaten. U moet u a.u.b. uitloggen van de apparaten en opnieuw proberen.", "toManySessions": "U heeft te veel actieve sessies", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF naar enkele pagina", "header": "PDF naar enkele pagina", - "submit": "Converteren naar enkele pagina" + "submit": "Converteren naar enkele pagina", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Pagina's extraheren", @@ -1469,18 +3373,59 @@ "adjustContrast": { "title": "Contrast aanpassen", "header": "Contrast aanpassen", + "basic": "Basic Adjustments", "contrast": "Kehrbrechting:", "brightness": "Helderheid:", "saturation": "Verzadiging:", - "download": "Downloaden" + "download": "Downloaden", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Comprimeren", + "desc": "Compress PDFs to reduce their file size.", "header": "PDF comprimeren", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Bestandsgrootte" + }, "credit": "Deze functie gebruikt qpdf voor PDF Compressie/Optimalisatie.", "grayscale": { "label": "Grijsschaal toepassen voor compressie" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1490,10 +3435,7 @@ "4": "Automatische modus - Past kwaliteit automatisch aan om PDF naar exacte grootte te krijgen", "5": "Verwachte PDF-grootte (bijv. 25MB, 10.8MB, 25KB)" }, - "submit": "Comprimeren", - "method": { - "filesize": "Bestandsgrootte" - } + "submit": "Comprimeren" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1594,7 +3536,13 @@ "title": "Afbeelding verwijderen", "header": "Afbeelding verwijderen", "removeImage": "Afbeelding verwijderen", - "submit": "Verwijder afbeelding" + "submit": "Verwijder afbeelding", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "PDF splits op hoofdstukken", @@ -1628,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1663,45 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Downloaden", - "convert": { - "title": "Omzetten", - "settings": "Instellingen", - "color": "Kleur", - "greyscale": "Grijstinten", - "fillPage": "Pagina vullen", - "pdfaDigitalSignatureWarning": "Dit PDF bestand bevat een digitale handtekening. Deze wordt in de volgende stap verwijderd.", - "grayscale": "Grijstinten" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Ondertekenen" + "read": "Read", + "sign": "Ondertekenen", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { - "loading": "Laden..." + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Laden...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Naam", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Versie", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Downloaden", - "delete": "Verwijderen" + "delete": "Verwijderen", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDF opschonen", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Instellingen" + "files": "Files", + "settings": "Instellingen", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Wachtwoord toevoegen", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Versleutelen", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Rechten wijzigen", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "veilig,beveiliging", + "header": "Wachtwoord toevoegen (Versleutelen)", + "selectText": { + "1": "Selecteer PDF om te versleutelen", + "2": "Gebruikerswachtwoord", + "3": "Versleutelingssleutellengte", + "4": "Hogere waarden zijn sterker, maar lagere waarden hebben een betere compatibiliteit.", + "5": "In te stellen rechten (Aanbevolen om te gebruiken samen met eigenaarswachtwoord)", + "6": "Voorkomen van documentassemblage", + "7": "Voorkomen van inhoudsextractie", + "8": "Voorkomen van extractie voor toegankelijkheid", + "9": "Voorkomen van invullen van formulier", + "10": "Voorkomen van wijziging", + "11": "Voorkomen van annotatiewijziging", + "12": "Voorkomen van afdrukken", + "13": "Voorkomen van afdrukken in verschillende formaten", + "14": "Eigenaarswachtwoord", + "15": "Beperkt wat gedaan kan worden met het document nadat het is geopend (Niet ondersteund door alle lezers)", + "16": "Beperkt het openen van het document zelf" } }, "changePermissions": { "title": "Rechten wijzigen", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Rechten wijzigen", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Voorkom samenvoegen van document" @@ -1728,10 +4580,784 @@ "label": "Voorkom afdrukken in verschillende formaten" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Rechten wijzigen" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Wachtwoord verwijderen", + "desc": "Verwijder wachtwoordbeveiliging van je PDF-document.", + "tags": "veilig,ontsleutelen,beveiliging,wachtwoord verwijderen", + "password": { + "stepTitle": "Wachtwoord verwijderen", + "label": "Huidige wachtwoord", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Verwijderen", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Wachtwoord verwijderen (Decrypteren)", + "selectText": { + "1": "Selecteer PDF om te decrypteren", + "2": "Wachtwoord" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Vervang of invertere kleure opties", + "2": "Standaard (hoog contrast kleuren)", + "3": "Aangepast (aangepaste kleuren)", + "4": "Volledig inverteren (alle kleuren omverkeren)", + "5": "Opties voor hoog contrast", + "6": "wit tekst op een zwart grondvlak", + "7": "zwarte tekst op wit grondvlak", + "8": "gele tekst op een zwart grondvlak", + "9": "groene tekst op een zwart grondvlak", + "10": "Kies de tekstkleur", + "11": "Kies het achtergrondkleur", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Vervang", + "title": "Replace-Invert-Color", + "header": "Kleur-instellingen voor PDF's" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Verzwakken, Verbergen, Uitroepen, Gekleurd, Verborgen", + "title": "Automatisch censureren", + "header": "Automatisch censureren", + "colorLabel": "Kleur", + "textsToRedactLabel": "Tekst om te censureren (gescheiden door regels)", + "textsToRedactPlaceholder": "bijv.\\Vertrouwelijk \\nTopgeheim", + "useRegexLabel": "Gebruik regex", + "wholeWordSearchLabel": "Zoeken op hele woorden", + "customPaddingLabel": "Aangepaste extra ruimtevulling", + "convertPDFToImageLabel": "Converteer PDF naar PDF-afbeelding (wordt gebruikt om tekst achter het vak te verwijderen)", + "submitButton": "Indienen" + }, + "replaceColorPdf": { + "tags": "Kleur vervangen, pagina-acties, achterkant, serverzijde" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/no-NB/translation.json b/frontend/public/locales/no-NB/translation.json index 65a297b87..354e13720 100644 --- a/frontend/public/locales/no-NB/translation.json +++ b/frontend/public/locales/no-NB/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Tilpasset Tekst", "numberPagesDesc": "Hvilke sider som skal nummereres, standard 'alle', aksepterer også 1-5 eller 2,5,9 osv.", "customNumberDesc": "Standard til {n}, aksepterer også 'Side {n} av {total}', 'Tekst-{n}', '{filnavn}-{n}", - "submit": "Legg til Sidetall" + "submit": "Legg til Sidetall", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Tilpasset Sidevalg (Skriv inn en kommaseparert liste over sidetall 1,5,6 eller Funksjoner som 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Velg PDF(er)", "multiPdfPrompt": "Velg PDF-filer (2+)", "multiPdfDropPrompt": "Velg (eller dra og slipp) alle PDF-ene du trenger", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Denne prosessen kan ta opptil ett minutt avhengig av filstørrelse", "pageOrderPrompt": "Tilpasset side rekkefølge (Skriv inn en kommaseparert liste over sidetall eller funksjoner som 2n+1):", - "pageSelectionPrompt": "Tilpasset Sidevalg (Skriv inn en kommaseparert liste over sidetall 1,5,6 eller Funksjoner som 2n+1):", "goToPage": "Gå", "true": "Sann", "false": "Usann", "unknown": "Ukjent", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Lagre", "saveToBrowser": "Lagre til Nettleser", + "download": "Last ned", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Angre", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Lukk", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "filer valgt", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Ingen favoritter lagt til", "downloadComplete": "Nedlasting Fullført", "bored": "Lei av å vente?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF-dokumentet er passordbeskyttet og enten ble passordet ikke oppgitt eller var feil", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Feil", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Beklager for problemet!", "needHelp": "Trenger du hjelp / Har du funnet et problem?", "contactTip": "Hvis du fortsatt har problemer, ikke nøl med å kontakte oss for hjelp. Du kan sende inn en billett på vår GitHub-side eller kontakte oss via Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Send inn en billett", "discordSubmit": "Discord - Send inn støtteinnlegg" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Slett", "username": "Brukernavn", "password": "Passord", @@ -82,6 +169,7 @@ "green": "Grønn", "blue": "Blå", "custom": "Tilpasset...", + "comingSoon": "Coming soon", "WorkInProgess": "Arbeid pågår, Kan være feil eller buggy, Vennligst rapporter eventuelle problemer!", "poweredBy": "Drevet av", "yes": "Ja", @@ -115,12 +203,14 @@ "page": "Side", "pages": "Sider", "loading": "Laster...", + "review": "Review", "addToDoc": "Legg til i dokument", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Personvernerklæring", + "iAgreeToThe": "I agree to all of the", "terms": "Vilkår og betingelser", "accessibility": "Tilgjengelighet", "cookie": "Informasjonskapsler", @@ -160,6 +250,7 @@ "title": "Vill du gjøre Stirling PDF bedre?", "paragraph1": "Stirling PDF har valgfri analyse for å hjelpe oss med å forbedre produktet. Vi sporer ikke personlig informasjon eller filinnhold.", "paragraph2": "Vennligst vurder å aktivere analyse for å hjelpe Stirling-PDF å vokse og for å la oss forstå brukerne våre bedre.", + "learnMore": "Learn more", "enable": "Aktiver analyse", "disable": "Deaktiver analyse", "settings": "Du kan endre innstillingene for analyse i config/settings.yml filen" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Lagre skjemainput", "help": "Aktiver for å lagre tidligere brukte input for fremtidige kjøringer" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Database Import/Eksport", @@ -331,22 +474,310 @@ "alphabetical": "Alfabetisk", "globalPopularity": "Global Popularitet", "sortBy": "Sorter etter:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Multi Verktøy", "desc": "Slå sammen, roter, omorganiser og fjern sider" }, "merge": { + "tags": "combine,join,unite", "title": "Slå sammen", "desc": "Slå enkelt sammen flere PDF-er til én." }, "split": { + "tags": "divide,separate,break", "title": "Del opp", "desc": "Del PDF-er i flere dokumenter" }, "rotate": { + "tags": "turn,flip,orient", "title": "Roter", "desc": "Roter enkelt dine PDF-er." }, + "convert": { + "tags": "transform,change", + "title": "Konverter", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organiser", + "desc": "Fjern/omorganiser sider i hvilken som helst rekkefølge" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Legg til bilde", + "desc": "Legger til et bilde på en angitt plassering i PDF-en" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Legg til Vannmerke", + "desc": "Legg til et tilpasset vannmerke i din PDF-dokument." + }, + "removePassword": { + "tags": "unlock", + "title": "Fjern Passord", + "desc": "Fjern passordbeskyttelse fra din PDF-dokument." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Komprimer", + "desc": "Komprimer PDF-er for å redusere filstørrelsen." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Endre Metadata", + "desc": "Endre/fjern/legg til metadata fra en PDF-dokument" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Rydd opp skanninger", + "desc": "Rydd opp skanninger og oppdag tekst fra bilder i en PDF og legg den til som tekst." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Ekstraher Bilder", + "desc": "Ekstraherer alle bilder fra en PDF og lagrer dem som zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Signer", + "desc": "Legger til signatur i PDF ved tegning, tekst eller bilde" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Gjøre flat", + "desc": "Fjern alle interaktive elementer og skjemaer fra en PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Signer med Sertifikat", + "desc": "Signer en PDF med et sertifikat/nøkkel (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Reparer", + "desc": "Forsøker å reparere en korrupt/ødelagt PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Fjern Tomme sider", + "desc": "Oppdager og fjerner tomme sider fra et dokument" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Fjern Anmerkninger", + "desc": "Fjerner alle kommentarer/anmerkninger fra en PDF" + }, + "compare": { + "tags": "difference", + "title": "Sammenlign", + "desc": "Sammenligner og viser forskjellene mellom to PDF-dokumenter" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Fjern Sertifikatsignering", + "desc": "Fjern sertifikatsignatur fra PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Flersidig Layout", + "desc": "Slå sammen flere sider av en PDF-dokument til en enkelt side" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Juster sidestørrelse/skala", + "desc": "Endre størrelsen/skalaen til en side og/eller dens innhold." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Legg til Sidetall", + "desc": "Legg til sidetall gjennom et dokument på en angitt plassering" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Juster Farger/Kontrast", + "desc": "Juster kontrast, metning og lysstyrke i en PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Beskjære PDF", + "desc": "Beskjære en PDF for å redusere størrelsen (beholder tekst!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Auto Del Sider", + "desc": "Auto Del Skannet PDF med fysisk skannet sidesplitter QR-kode" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Få ALL informasjon om PDF", + "desc": "Fanger opp all tilgjengelig informasjon om PDF-er" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF til Enkelt Stor Side", + "desc": "Slår sammen alle PDF-sider til en stor enkeltside" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Vis Javascript", + "desc": "Søker og viser eventuelle JS injisert i en PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manuell Sensurering", + "desc": "Sensurerer en PDF basert på valgt tekst, tegnede former og/eller valgte side(r)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Fjern bilde", + "desc": "Fjern bilde fra PDF for å redusere filstørrelsen" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Split PDF by Chapters", + "desc": "Split a PDF into multiple files based on its chapter structure." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Valider PDF-signatur", + "desc": "Verifiser digitale signaturer og sertifikater i PDF-dokumenter" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Trekk ut Sider", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Fjern", + "desc": "Slett uønskede sider fra din PDF-dokument." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Auto Del etter Størrelse/Antall", + "desc": "Del en enkelt PDF i flere dokumenter basert på størrelse, antall sider eller dokumenter" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Legg til Passord", + "desc": "Krypter din PDF-dokument med et passord." + }, + "changePermissions": { + "title": "Endre tillatelser", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Legger PDF-er over hverandre", + "title": "Overlay PDF-er" + }, "imageToPDF": { "title": "Bilde til PDF", "desc": "Konverter et bilde (PNG, JPEG, GIF) til PDF." @@ -355,18 +786,6 @@ "title": "PDF til Bilde", "desc": "Konverter en PDF til et bilde. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organiser", - "desc": "Fjern/omorganiser sider i hvilken som helst rekkefølge" - }, - "addImage": { - "title": "Legg til bilde", - "desc": "Legger til et bilde på en angitt plassering i PDF-en" - }, - "watermark": { - "title": "Legg til Vannmerke", - "desc": "Legg til et tilpasset vannmerke i din PDF-dokument." - }, "permissions": { "title": "Endre Tillatelser", "desc": "Endre tillatelsene til din PDF-dokument" @@ -375,38 +794,10 @@ "title": "Fjern", "desc": "Slett uønskede sider fra din PDF-dokument." }, - "addPassword": { - "title": "Legg til Passord", - "desc": "Krypter din PDF-dokument med et passord." - }, - "removePassword": { - "title": "Fjern Passord", - "desc": "Fjern passordbeskyttelse fra din PDF-dokument." - }, - "compress": { - "title": "Komprimer", - "desc": "Komprimer PDF-er for å redusere filstørrelsen." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Endre Metadata", - "desc": "Endre/fjern/legg til metadata fra en PDF-dokument" - }, "fileToPDF": { "title": "Konverter fil til PDF", "desc": "Konverter nesten hvilken som helst fil til PDF (DOCX, PNG, XLS, PPT, TXT og mer)" }, - "ocr": { - "title": "OCR / Rydd opp skanninger", - "desc": "Rydd opp skanninger og oppdag tekst fra bilder i en PDF og legg den til som tekst." - }, - "extractImages": { - "title": "Ekstraher Bilder", - "desc": "Ekstraherer alle bilder fra en PDF og lagrer dem som zip" - }, "pdfToPDFA": { "title": "PDF til PDF/A", "desc": "Konverter PDF til PDF/A for langtidslagring" @@ -435,70 +826,14 @@ "title": "Oppdag/Del Skannede bilder", "desc": "Deler flere bilder fra et bilde/PDF" }, - "sign": { - "title": "Signer", - "desc": "Legger til signatur i PDF ved tegning, tekst eller bilde" - }, - "flatten": { - "title": "Gjøre flat", - "desc": "Fjern alle interaktive elementer og skjemaer fra en PDF" - }, - "repair": { - "title": "Reparer", - "desc": "Forsøker å reparere en korrupt/ødelagt PDF" - }, - "removeBlanks": { - "title": "Fjern Tomme sider", - "desc": "Oppdager og fjerner tomme sider fra et dokument" - }, - "removeAnnotations": { - "title": "Fjern Anmerkninger", - "desc": "Fjerner alle kommentarer/anmerkninger fra en PDF" - }, - "compare": { - "title": "Sammenlign", - "desc": "Sammenligner og viser forskjellene mellom to PDF-dokumenter" - }, - "certSign": { - "title": "Signer med Sertifikat", - "desc": "Signer en PDF med et sertifikat/nøkkel (PEM/P12)" - }, - "removeCertSign": { - "title": "Fjern Sertifikatsignering", - "desc": "Fjern sertifikatsignatur fra PDF" - }, - "pageLayout": { - "title": "Flersidig Layout", - "desc": "Slå sammen flere sider av en PDF-dokument til en enkelt side" - }, - "scalePages": { - "title": "Juster sidestørrelse/skala", - "desc": "Endre størrelsen/skalaen til en side og/eller dens innhold." - }, "pipeline": { "title": "Pipeline (Avansert)", "desc": "Utfør flere handlinger på PDF-er ved å definere pipelineskripter" }, - "addPageNumbers": { - "title": "Legg til Sidetall", - "desc": "Legg til sidetall gjennom et dokument på en angitt plassering" - }, "auto-rename": { "title": "Auto Omdøp PDF Fil", "desc": "Omdøper automatisk en PDF-fil basert på dens oppdagede overskrift" }, - "adjustContrast": { - "title": "Juster Farger/Kontrast", - "desc": "Juster kontrast, metning og lysstyrke i en PDF" - }, - "crop": { - "title": "Beskjære PDF", - "desc": "Beskjære en PDF for å redusere størrelsen (beholder tekst!)" - }, - "autoSplitPDF": { - "title": "Auto Del Sider", - "desc": "Auto Del Skannet PDF med fysisk skannet sidesplitter QR-kode" - }, "sanitizePDF": { "title": "Sanitiser", "desc": "Fjern skript og andre elementer fra PDF-filer" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Få ALL informasjon om PDF", - "desc": "Fanger opp all tilgjengelig informasjon om PDF-er" - }, "pageExtracter": { "title": "Ekstraher side(r)", "desc": "Ekstraher valgte sider fra PDF" }, - "pdfToSinglePage": { - "title": "PDF til Enkelt Stor Side", - "desc": "Slår sammen alle PDF-sider til en stor enkeltside" - }, - "showJS": { - "title": "Vis Javascript", - "desc": "Søker og viser eventuelle JS injisert i en PDF" - }, "autoRedact": { "title": "Automatisk Sensurering", "desc": "Automatisk sensurering (sverter ut) tekst i en PDF basert på inntastet tekst" }, - "redact": { - "title": "Manuell Sensurering", - "desc": "Sensurerer en PDF basert på valgt tekst, tegnede former og/eller valgte side(r)" - }, "PDFToCSV": { "title": "PDF til CSV", "desc": "Ekstraherer tabeller fra en PDF og konverterer dem til CSV" @@ -551,10 +870,6 @@ "title": "Auto Del etter Størrelse/Antall", "desc": "Del en enkelt PDF i flere dokumenter basert på størrelse, antall sider eller dokumenter" }, - "overlay-pdfs": { - "title": "Overlay PDF-er", - "desc": "Legger PDF-er over hverandre" - }, "split-by-sections": { "title": "Del PDF etter Seksjoner", "desc": "Del hver side av en PDF i mindre horisontale og vertikale seksjoner" @@ -563,43 +878,17 @@ "title": "Legg til Stempel i PDF", "desc": "Legg til tekst eller bilde stempler på angitte steder" }, - "removeImage": { - "title": "Fjern bilde", - "desc": "Fjern bilde fra PDF for å redusere filstørrelsen" - }, - "splitByChapters": { - "title": "Split PDF by Chapters", - "desc": "Split a PDF into multiple files based on its chapter structure." - }, - "validateSignature": { - "title": "Valider PDF-signatur", - "desc": "Verifiser digitale signaturer og sertifikater i PDF-dokumenter" - }, "replace-color": { "title": "Erstatt og Inverter Farge", "desc": "Erstatt farge for tekst og bakgrunn i PDF og inverter full farge av pdf for å redusere filstørrelsen" }, - "convert": { - "title": "Konverter" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Trekk ut Sider" - }, - "removePages": { - "title": "Fjern", - "desc": "Slett uønskede sider fra din PDF-dokument." - }, "removeImagePdf": { "title": "Fjern bilde", "desc": "Fjern bilde fra PDF for å redusere filstørrelsen" }, - "autoSizeSplitPDF": { - "title": "Auto Del etter Størrelse/Antall", - "desc": "Del en enkelt PDF i flere dokumenter basert på størrelse, antall sider eller dokumenter" - }, "adjust-contrast": { "title": "Juster Farger/Kontrast", "desc": "Juster kontrast, metning og lysstyrke i en PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Erstatt og Inverter Farge", "desc": "Erstatt farge for tekst og bakgrunn i PDF og inverter full farge av pdf for å redusere filstørrelsen" - }, - "changePermissions": { - "title": "Endre tillatelser" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "vis,les,annoter,tekst,bilde", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "sammenslåing,sideoperasjoner,backend,serverside", "title": "Slå sammen", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Slå sammen", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Fil navn", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Slå sammen flere PDF-er (2+)", "sortByName": "Sorter etter navn", "sortByDate": "Sorter etter dato", - "removeCertSign": "Fjern digital signatur i den sammenslåtte filen?", - "submit": "Slå sammen", - "sortBy": { - "filename": "Fil navn" - } + "removeCertSign": "Fjern digital signatur i den sammenslåtte filen?" }, "split": { - "tags": "sideoperasjoner,del,flersidig,kutt,serverside", "title": "Del PDF", "header": "Del PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Skriv inn sidene som skal deles på:", "submit": "Del", "steps": { + "chooseMethod": "Choose Method", "settings": "Innstillinger" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Filstørrelse" + "name": "Filstørrelse", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Filstørrelse" + "label": "Filstørrelse", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "sideoperasjoner,del,flersidig,kutt,serverside" }, "rotate": { - "tags": "serverside", "title": "Roter PDF", + "submit": "Roter", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "serverside", "header": "Roter PDF", - "selectAngle": "Velg rotasjonsvinkel (i multipler av 90 grader):", - "submit": "Roter" + "selectAngle": "Velg rotasjonsvinkel (i multipler av 90 grader):" + }, + "convert": { + "title": "Konverter", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Innstillinger", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Farge", + "greyscale": "Gråtone", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Fyll side", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDFen inneholder en digital signatur. Denne vil bli fjernet i neste steg.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Gråtone", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konvertering,bilde,jpg,foto" @@ -727,7 +1263,33 @@ "8": "Fjern sist", "9": "Fjern først og sist", "10": "Partall-Oddetall Sammenslåing", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Legg til bilde", "submit": "Legg til bilde" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "tekst,gjentakende,etikett,egen,opphavsrett,varemerke,bilde,jpg,foto", "title": "Legg til vannmerke", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Legg til vannmerke", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Tekst", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Skriftstørrelse", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Tekst", + "2": "Bilde" + }, + "tags": "tekst,gjentakende,etikett,egen,opphavsrett,varemerke,bilde,jpg,foto", "header": "Legg til vannmerke", "customColor": "Tilpasset Tekstfarge", "selectText": { @@ -755,17 +1506,6 @@ "8": "Vannmerketype:", "9": "Vannmerkebilde:", "10": "Konverter PDF til PDF-Bilde" - }, - "submit": "Legg til vannmerke", - "type": { - "1": "Tekst", - "2": "Bilde" - }, - "watermarkType": { - "text": "Tekst" - }, - "settings": { - "fontSize": "Skriftstørrelse" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "fjern sider,slett sider", "title": "Fjern", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Fjern" }, - "addPassword": { - "tags": "sikker,trygghet", - "title": "Legg til passord", - "header": "Legg til passord (Krypter)", - "selectText": { - "1": "Velg PDF-fil for kryptering", - "2": "Brukerpassord", - "3": "Krypteringsnøkkellengde", - "4": "Høyere verdier er sterkere, men lavere verdier har bedre kompatibilitet.", - "5": "Tillatelser å sette (Anbefales å brukes sammen med eierpassord)", - "6": "Forhindre sammenstilling av dokumentet", - "7": "Forhindre innholdsekstraksjon", - "8": "Forhindre ekstraksjon for tilgjengelighet", - "9": "Forhindre utfylling av skjema", - "10": "Forhindre modifisering", - "11": "Forhindre annotasjonsmodifisering", - "12": "Forhindre utskrift", - "13": "Forhindre utskrift i ulike formater", - "14": "Eierpassord", - "15": "Begrenser hva som kan gjøres med dokumentet når det er åpnet (Støttes ikke av alle leserprogrammer)", - "16": "Begrenser åpningen av dokumentet selv" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Krypter", "tooltip": { - "permissions": { - "title": "Endre tillatelser" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "sikker,dekrypter,trygghet,upassord,slett passord", - "title": "Fjern passord", - "header": "Fjern passord (Dekrypter)", - "selectText": { - "1": "Velg PDF for å dekryptere", - "2": "Passord" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Fjern", - "desc": "Fjern passordbeskyttelse fra din PDF-dokument.", - "password": { - "stepTitle": "Fjern Passord", - "label": "Nåværende Passord" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "title,forfatter,dato,opprettelse,tidsstempel,utgiver,produsent,statistikk", - "title": "Endre metadata", "header": "Endre metadata", + "submit": "Endre", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "title,forfatter,dato,opprettelse,tidsstempel,utgiver,produsent,statistikk", "selectText": { "1": "Vennligst rediger variablene du ønsker å endre", "2": "Slett all metadata", @@ -856,15 +1877,7 @@ "4": "Annen metadata:", "5": "Legg til tilpasset metadataoppføring" }, - "author": "Forfatter:", - "creationDate": "Opprettelsesdato (åååå/MM/dd HH:mm:ss):", - "creator": "Oppretter:", - "keywords": "Nøkkelord:", - "modDate": "Endringsdato (åååå/MM/dd HH:mm:ss):", - "producer": "Produsent:", - "subject": "Emne:", - "trapped": "Fanget:", - "submit": "Endre" + "modDate": "Endringsdato (åååå/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformasjon,format,dokument,bilde,slide,tekst,konvertering,office,dokumenter,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "gjenkjenning,tekst,bilde,skann,les,identifisere,deteksjon,redigerbar", "title": "OCR / Rens av skanning", + "desc": "Rydd opp skanninger og oppdag tekst fra bilder i en PDF og legg den til som tekst.", "header": "Rens av skanning / OCR (Optisk tegngjenkjenning)", "selectText": { "1": "Velg språk som skal oppdages innenfor PDF-en (De oppførte er de som for øyeblikket er oppdaget):", @@ -896,23 +1910,89 @@ "help": "Vennligst les denne dokumentasjonen for hvordan du bruker dette for andre språk og/eller bruk utenfor Docker.", "credit": "Denne tjenesten bruker qpdf og Tesseract for OCR.", "submit": "Behandle PDF med OCR", - "desc": "Rydd opp skanninger og oppdag tekst fra bilder i en PDF og legg den til som tekst.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Innstillinger", "ocrMode": { - "label": "OCR-modus" + "label": "OCR-modus", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Språk" + "label": "Språk", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR-modus" + "title": "OCR-modus", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Språk" + "title": "Språk", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Hent ut bilder", "selectText": "Velg bildeformat for å konvertere de hentede bildene til", "allowDuplicates": "Save duplicate images", - "submit": "Hent ut" + "submit": "Hent ut", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arkiv,langtidslagring,standard,konvertering,lagring,bevaring", @@ -993,17 +2079,53 @@ }, "info": "Python er ikke installert. Det er påkrevd for å kjøre." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autorisere,initialer,tegnet signatur,tekst signatur,bildesignatur", "title": "Signer", "header": "Signer PDF-er", "upload": "Last opp bilde", - "draw": "Tegn signatur", - "text": "Tekstinput", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Slett", "add": "Legg til", "saved": "Lagrede signaturer", "save": "Lagre signatur", + "applySignatures": "Apply Signatures", "personalSigs": "Personlige signaturer", "sharedSigs": "Delte signaturer", "noSavedSigs": "Ingen lagrede signaturer funnet", @@ -1015,42 +2137,179 @@ "previous": "Forrige side", "maintainRatio": "Bytt behold sideforhold", "undo": "Angre", - "redo": "Gjør om" + "redo": "Gjør om", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autorisere,initialer,tegnet signatur,tekst signatur,bildesignatur" }, "flatten": { - "tags": "statisk,deaktiver,ikke-interaktiv,strømlinjeformet", "title": "Utjevning", "header": "Utjevning av PDf", "flattenOnlyForms": "Utjevning av kun skjemaer", "submit": "Utjevn", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Innstillinger" }, "options": { - "flattenOnlyForms": "Utjevning av kun skjemaer" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Utjevning av kun skjemaer", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statisk,deaktiver,ikke-interaktiv,strømlinjeformet" }, "repair": { "tags": "fiks,gjenopprett,korreksjon,gjenoppretting", "title": "Reparer", "header": "Reparer PDF-er", - "submit": "Reparer" + "submit": "Reparer", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "rydde opp,strømlinjeformet,ingen-innhold,organisere", "title": "Fjern Blank Sider", "header": "Fjern Blank Sider", - "threshold": "Pixel Hvithetsgrense:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Fjern Blank Sider", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "rydde opp,strømlinjeformet,ingen-innhold,organisere", "thresholdDesc": "Grense for å bestemme hvor hvit en hvit piksel må være for å klassifiseres som 'Hvit'. 0 = Svart, 255 = Ren hvit.", - "whitePercent": "Hvit Prosent (%):", - "whitePercentDesc": "Prosent av siden som må være 'hvite' piksler for å fjernes", - "submit": "Fjern Blank Sider" + "whitePercentDesc": "Prosent av siden som må være 'hvite' piksler for å fjernes" }, "removeAnnotations": { "tags": "kommentarer,utheving,notater,markering,fjern", "title": "Fjern Anmerkninger", "header": "Fjern Anmerkninger", - "submit": "Fjern" + "submit": "Fjern", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "differensiere,kontrast,endringer,analyse", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "autentisere,PEM,P12,offisiell,krypter", "title": "Sertifikatsignering", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Sted", + "logoTitle": "Logo", + "name": "Navn", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Skriv inn passordet for keystore eller privat nøkkel (hvis noen):", + "passwordOptional": "Leave empty if no password", + "reason": "Årsak", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo", "header": "Signer en PDF med sertifikatet ditt (Arbeid pågår)", "selectPDF": "Velg en PDF-fil for signering:", "jksNote": "Merk: Hvis sertifikattypen din ikke er oppført nedenfor, vennligst konverter den til en Java-keystore (.jks) fil ved å bruke kommandolinjeverktøyet keytool. Deretter velger du .jks-fil-alternativet nedenfor.", @@ -1089,13 +2484,7 @@ "selectCert": "Velg din sertifikatfil (X.509-format, kan være .pem eller .der):", "selectP12": "Velg din PKCS#12-keystore-fil (.p12 eller .pfx) (Valgfritt, hvis angitt, bør den inneholde din private nøkkel og sertifikat):", "selectJKS": "Velg din Java-keystore-fil (.jks eller .keystore):", - "certType": "Sertifikattype", - "password": "Skriv inn passordet for keystore eller privat nøkkel (hvis noen):", "showSig": "Vis signatur", - "reason": "Årsak", - "location": "Sted", - "name": "Navn", - "showLogo": "Show Logo", "submit": "Signer PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Fjern Sertifikatsignatur", "header": "Fjern det digitale sertifikatet fra PDF-en", "selectPDF": "Velg en PDF-fil:", - "submit": "Fjern Signatur" + "submit": "Fjern Signatur", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "slå sammen,kompositt,enkel-visning,organisere", @@ -1111,16 +2511,157 @@ "header": "Flersideoppsett", "pagesPerSheet": "Sider per ark:", "addBorder": "Legg til rammer", - "submit": "Send inn" + "submit": "Send inn", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "endre størrelse,modifisere,dimensjon,tilpasse", "title": "Juster side-skala", "header": "Juster side-skala", "pageSize": "Størrelse på et ark i dokumentet.", "keepPageSize": "Original Size", "scaleFactor": "Zoom-nivå (beskjær) for en side.", - "submit": "Send inn" + "submit": "Send inn", + "tags": "endre størrelse,modifisere,dimensjon,tilpasse" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginere,etikett,organisere,indeks" @@ -1129,16 +2670,83 @@ "tags": "auto-oppdag,overskrift-basert,organisere,omdøp", "title": "Auto Navngi", "header": "Auto Navngi PDF", - "submit": "Auto Navngi" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Auto Navngi", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "fargekorrigering,tilpasse,modifisere,forbedre" }, "crop": { - "tags": "trim,redusere,redigere,form", "title": "Beskjær", "header": "Beskjær PDF", - "submit": "Send inn" + "submit": "Send inn", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "trim,redusere,redigere,form" }, "autoSplitPDF": { "tags": "QR-basert,separere,skann-segment,organisere", @@ -1221,24 +2829,124 @@ "downloadJS": "Last ned Javascript", "submit": "Vis" }, - "autoRedact": { - "tags": "Sensurere,Skjule,sverte ut,svart,markør,skjult", - "title": "Automatisk Sensurering", - "header": "Automatisk Sensurering", - "colorLabel": "Farge", - "textsToRedactLabel": "Tekst som skal sensureres (linje-separert)", - "textsToRedactPlaceholder": "f.eks. \\nKonfidensiell \\nTopp-hemmelig", - "useRegexLabel": "Bruk Regex", - "wholeWordSearchLabel": "Hele ordsøk", - "customPaddingLabel": "Tilpasset ekstra polstring", - "convertPDFToImageLabel": "Konverter PDF til PDF-bilde (Brukes for å fjerne tekst bak boksen)", - "submitButton": "Send inn" - }, "redact": { "tags": "Sensurere,Skjule,sverte ut,svart,markør,skjult,manuell", "title": "Manuell Sensurering", - "header": "Manuell Sensurering", "submit": "Sensurer", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Avansert" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Legg til", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Sider", + "placeholder": "(f.eks. 1,2,8 eller 4,7,12-16 eller 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manuell Sensurering", "textBasedRedaction": "Tekstbasert sensurering", "pageBasedRedaction": "Sidebasert sensurering", "convertPDFToImageLabel": "Konverter PDF til PDF-bilde (Brukes for å fjerne tekst bak boksen)", @@ -1264,21 +2972,7 @@ "showLayers": "Vis lag (dobbeltklikk for å tilbakestille alle lag til standardtilstand)", "colourPicker": "Fargevelger", "findCurrentOutlineItem": "Finn gjeldende punkt i strukturen", - "applyChanges": "Bruk endringer", - "auto": { - "settings": { - "advancedTitle": "Avansert" - }, - "wordsToRedact": { - "add": "Legg til" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Sider", - "placeholder": "(f.eks. 1,2,8 eller 4,7,12-16 eller 2n-1)" - } - } + "applyChanges": "Bruk endringer" }, "tableExtraxt": { "tags": "CSV,tabelluttrekk,ekstrahere,konvertere" @@ -1289,11 +2983,15 @@ "overlay-pdfs": { "tags": "overlay", "header": "Overlegg PDF-filer", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Velg grunnleggende PDF-fil" }, "overlayFiles": { - "label": "Velg overlegg PDF-filer" + "label": "Velg overlegg PDF-filer", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Velg overleggmodus", @@ -1303,14 +3001,53 @@ }, "counts": { "label": "Antall overlegg (for fast gjentakende modus)", - "placeholder": "Skriv inn komma-separerte tellinger (f.eks. 2,3,1)" + "placeholder": "Skriv inn komma-separerte tellinger (f.eks. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Velg overleggposisjon", "foreground": "Forgrunn", "background": "Bakgrunn" }, - "submit": "Send inn" + "submit": "Send inn", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "seksjonsdeling,del,tilpass", @@ -1331,6 +3068,7 @@ "tags": "stempel,legg til bilde,senter bilde,vannmerke,PDF,embed,tilpass", "header": "Stemple PDF", "title": "Stemple PDF", + "stampSetup": "Stamp Setup", "stampType": "Stempeltype", "stampText": "Stempele tekst", "stampImage": "Stemplebilde", @@ -1343,7 +3081,19 @@ "overrideY": "Overskriv Y-koordinat", "customMargin": "Tilpasset Margin", "customColor": "Tilpasset Tekstfarge", - "submit": "Send inn" + "submit": "Send inn", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Fjern Bilde,Sideoperasjoner,Backend,serverside" @@ -1361,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Gyldig", - "invalid": "Ugyldig" + "invalid": "Ugyldig", + "complete": "Validation complete" }, "signer": "Signatar", "date": "Dato", @@ -1388,40 +3139,122 @@ "version": "Versjon", "keyUsage": "Nøkkelbruk", "selfSigned": "Selv-signert", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signaturinformasjon", "_value": "Signatur", "mathValid": "Signaturen er matematisk gyldig MEN:" }, - "selectCustomCert": "Tilpasset Sertifikatfil X.509 (Valgfritt)" - }, - "replace-color": { - "title": "Erstatt-Inverter-Farge", - "header": "Erstatt-Inverter Farge PDF", - "selectText": { - "1": "Erstatt eller Inverter farge alternativer", - "2": "Standard(Standard høy kontrast farger)", - "3": "Tilpasset(Tilpassede farger)", - "4": "Full-Invertering(Inverter alle farger)", - "5": "Høy kontrast fargealternativer", - "6": "hvit tekst på svart bakgrunn", - "7": "Svart tekst på hvit bakgrunn", - "8": "Gul tekst på svart bakgrunn", - "9": "Grønn tekst på svart bakgrunn", - "10": "Velg tekstfarge", - "11": "Velg bakgrunnsfarge" + "selectCustomCert": "Tilpasset Sertifikatfil X.509 (Valgfritt)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Erstatt" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Erstatt Farge,Sideoperasjoner,Backend,serverside" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Logg inn", "header": "Logg inn", "signin": "Logg inn", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Husk meg", "invalid": "Ugyldig brukernavn eller passord.", "locked": "Kontoen din har blitt låst.", @@ -1440,12 +3273,83 @@ "alreadyLoggedIn": "Du er allerede innlogget på", "alreadyLoggedIn2": "enheter. Logg ut og forsøk igjen", "toManySessions": "Du har for mange aktive økter", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF Til Enkelt Side", "header": "PDF Til Enkelt Side", - "submit": "Konverter til Enkelt Side" + "submit": "Konverter til Enkelt Side", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Trekk ut Sider", @@ -1469,18 +3373,59 @@ "adjustContrast": { "title": "Juster Kontrast", "header": "Juster Kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Lysstyrke:", "saturation": "Metning:", - "download": "Last ned" + "download": "Last ned", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Komprimer", + "desc": "Compress PDFs to reduce their file size.", "header": "Komprimer PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Filstørrelse" + }, "credit": "Denne tjenesten bruker qpdf for PDF-komprimering/optimisering.", "grayscale": { "label": "Bruk gråskala for komprimering" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1490,10 +3435,7 @@ "4": "Automatisk modus - Justerer automatisk kvaliteten for å få PDF til nøyaktig størrelse", "5": "Forventet PDF-størrelse (f.eks. 25MB, 10.8MB, 25KB)" }, - "submit": "Komprimer", - "method": { - "filesize": "Filstørrelse" - } + "submit": "Komprimer" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1594,7 +3536,13 @@ "title": "Remove image", "header": "Remove image", "removeImage": "Remove image", - "submit": "Remove image" + "submit": "Remove image", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Split PDF by Chapters", @@ -1628,6 +3576,12 @@ }, "note": "Versjonsnotater er kun tilgjengelige på engelsk" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1663,46 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Last ned", - "undo": "Angre", - "convert": { - "title": "Konverter", - "settings": "Innstillinger", - "color": "Farge", - "greyscale": "Gråtone", - "fillPage": "Fyll side", - "pdfaDigitalSignatureWarning": "PDFen inneholder en digital signatur. Denne vil bli fjernet i neste steg.", - "grayscale": "Gråtone" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Signer" + "read": "Read", + "sign": "Signer", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { - "loading": "Laster..." + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Laster...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Navn", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Versjon", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Last ned", - "delete": "Slett" + "delete": "Slett", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Rensker PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Innstillinger" + "files": "Files", + "settings": "Innstillinger", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Legg til passord", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Krypter", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Endre tillatelser", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "sikker,trygghet", + "header": "Legg til passord (Krypter)", + "selectText": { + "1": "Velg PDF-fil for kryptering", + "2": "Brukerpassord", + "3": "Krypteringsnøkkellengde", + "4": "Høyere verdier er sterkere, men lavere verdier har bedre kompatibilitet.", + "5": "Tillatelser å sette (Anbefales å brukes sammen med eierpassord)", + "6": "Forhindre sammenstilling av dokumentet", + "7": "Forhindre innholdsekstraksjon", + "8": "Forhindre ekstraksjon for tilgjengelighet", + "9": "Forhindre utfylling av skjema", + "10": "Forhindre modifisering", + "11": "Forhindre annotasjonsmodifisering", + "12": "Forhindre utskrift", + "13": "Forhindre utskrift i ulike formater", + "14": "Eierpassord", + "15": "Begrenser hva som kan gjøres med dokumentet når det er åpnet (Støttes ikke av alle leserprogrammer)", + "16": "Begrenser åpningen av dokumentet selv" } }, "changePermissions": { "title": "Endre tillatelser", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Endre tillatelser", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Forhindre sammenstilling av dokumentet" @@ -1729,10 +4580,784 @@ "label": "Forhindre utskrift i ulike formater" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Endre tillatelser" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Fjern passord", + "desc": "Fjern passordbeskyttelse fra din PDF-dokument.", + "tags": "sikker,dekrypter,trygghet,upassord,slett passord", + "password": { + "stepTitle": "Fjern Passord", + "label": "Nåværende Passord", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Fjern", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Fjern passord (Dekrypter)", + "selectText": { + "1": "Velg PDF for å dekryptere", + "2": "Passord" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Erstatt eller Inverter farge alternativer", + "2": "Standard(Standard høy kontrast farger)", + "3": "Tilpasset(Tilpassede farger)", + "4": "Full-Invertering(Inverter alle farger)", + "5": "Høy kontrast fargealternativer", + "6": "hvit tekst på svart bakgrunn", + "7": "Svart tekst på hvit bakgrunn", + "8": "Gul tekst på svart bakgrunn", + "9": "Grønn tekst på svart bakgrunn", + "10": "Velg tekstfarge", + "11": "Velg bakgrunnsfarge", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Erstatt", + "title": "Erstatt-Inverter-Farge", + "header": "Erstatt-Inverter Farge PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Sensurere,Skjule,sverte ut,svart,markør,skjult", + "title": "Automatisk Sensurering", + "header": "Automatisk Sensurering", + "colorLabel": "Farge", + "textsToRedactLabel": "Tekst som skal sensureres (linje-separert)", + "textsToRedactPlaceholder": "f.eks. \\nKonfidensiell \\nTopp-hemmelig", + "useRegexLabel": "Bruk Regex", + "wholeWordSearchLabel": "Hele ordsøk", + "customPaddingLabel": "Tilpasset ekstra polstring", + "convertPDFToImageLabel": "Konverter PDF til PDF-bilde (Brukes for å fjerne tekst bak boksen)", + "submitButton": "Send inn" + }, + "replaceColorPdf": { + "tags": "Erstatt Farge,Sideoperasjoner,Backend,serverside" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/pl-PL/translation.json b/frontend/public/locales/pl-PL/translation.json index cda6625d6..ac047a468 100644 --- a/frontend/public/locales/pl-PL/translation.json +++ b/frontend/public/locales/pl-PL/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Tekst własny", "numberPagesDesc": "Strony do numeracji, wszystkie (all), 1-5, 2, 5, 9", "customNumberDesc": "Domyślnie do {n}, również akceptuje 'Strona {n} z {total},Teskt-{n},'{filename}-{n}", - "submit": "Dodaj numerację stron" + "submit": "Dodaj numerację stron", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Niestandardowy wybór strony (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Wybierz PDF", "multiPdfPrompt": "Wybierz PDF (2+)", "multiPdfDropPrompt": "Wybierz (lub przeciągnij i puść) wszystkie dokumenty PDF", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Ostrzeżenie: Ten proces może potrwać do minuty, w zależności od rozmiaru pliku", "pageOrderPrompt": "Kolejność stron (wprowadź listę numerów stron oddzielonych przecinkami) :", - "pageSelectionPrompt": "Niestandardowy wybór strony (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :", "goToPage": "Idź", "true": "Tak", "false": "Nie", "unknown": "Nieznany", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Zapisz", "saveToBrowser": "Zapisz w przeglądarce", + "download": "Pobierz", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Cofnij", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Zamknij", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "wybrane pliki", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Nie dodano ulubionych", "downloadComplete": "Pobieranie zakończone", "bored": "Znudzony czekaniem?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "Dokument PDF jest zabezpieczony hasłem, musisz podać prawidłowe hasło.", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "błąd", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Przykro nam z powodu problemu!", "needHelp": "Potrzebujesz pomocy/znalazłem usterkę?", "contactTip": "Jeśli ciągle masz problem, skontakuj się z nami. Wyślij zgłoszenia na naszej stronie GitHub albo za pomocą Discorda:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - wyślij zgłoszenie", "discordSubmit": "Discord - wyślij posta z prośbą o pomoc" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "usuń", "username": "nazwa użytkownika", "password": "hasło", @@ -82,6 +169,7 @@ "green": "zielony", "blue": "niebieski", "custom": "Własny...", + "comingSoon": "Coming soon", "WorkInProgess": "Praca w toku, proszę zgłaszać błędy!", "poweredBy": "Zasilany", "yes": "tak", @@ -115,12 +203,14 @@ "page": "Strona", "pages": "Strony", "loading": "Ładowanie...", + "review": "Review", "addToDoc": "Dodaj do dokumentu", "reset": "Resetuj", "apply": "Zastosuj", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Polityka Prywatności", + "iAgreeToThe": "I agree to all of the", "terms": "Zasady i Postanowienia", "accessibility": "Dostępność", "cookie": "Polityka plików cookie", @@ -160,6 +250,7 @@ "title": "Czy chcesz ulepszyć Stirling PDF?", "paragraph1": "Stirling PDF ma opcję analizy, która pomaga nam udoskonalać produkt. Nie śledzimy żadnych danych osobowych ani zawartości plików.", "paragraph2": "Rozważ włączenie funkcji analitycznych, które pomogą w rozwoju Stirling-PDF i pozwolą nam lepiej zrozumieć naszych użytkowników.", + "learnMore": "Learn more", "enable": "Włącz analitykę", "disable": "Wyłącz analitykę", "settings": "Możesz zmienić ustawienia analityki w pliku config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Zapisz dane formularzy", "help": "Włącz aby zapisać dane dla przyszłych automatyzacji" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "Wszystkie", "refresh": "Odśwież", - "includeHomepage": "Uwzględnij stronę główną ('/')", - "includeLoginPage": "Uwzględnij stronę logowania ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Łączna liczba punktów końcowych", "totalVisits": "Łączna liczba wizyt", "showing": "Pokazuje", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Liczba wizyt", "visitsTooltip": "Wizyty: {0} ({1}% całości)", - "retry": "Spróbuj ponownie" + "retry": "Spróbuj ponownie", + "includeHomepage": "Uwzględnij stronę główną ('/')", + "includeLoginPage": "Uwzględnij stronę logowania ('/login')" }, "database": { "title": "Import/Eksport bazy danych", @@ -331,22 +474,310 @@ "alphabetical": "Alfabetycznie", "globalPopularity": "Globalna popularność", "sortBy": "Sortuj według:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Wielofunkcyjne Narzędzie PDF", "desc": "Łącz, dziel, obracaj, zmieniaj kolejność i usuwaj strony" }, "merge": { + "tags": "combine,join,unite", "title": "Połącz", "desc": "Łatwe łączenie wielu dokumentów PDF w jeden." }, "split": { + "tags": "divide,separate,break", "title": "Podziel", "desc": "Podziel dokument PDF na wiele dokumentów" }, "rotate": { + "tags": "turn,flip,orient", "title": "Obróć", "desc": "Łatwo obracaj dokumenty PDF." }, + "convert": { + "tags": "transform,change", + "title": "Konwertuj", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Uporządkuj", + "desc": "Usuń/Zmień kolejność stron w dowolnej kolejności" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Dodaj obraz", + "desc": "Dodaje obraz w wybranym miejscu w dokumencie PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Dodaj znak wodny", + "desc": "Dodaj niestandardowy znak wodny do dokumentu PDF." + }, + "removePassword": { + "tags": "unlock", + "title": "Usuń hasło", + "desc": "Usuń ochronę hasłem z dokumentu PDF." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Kompresuj", + "desc": "Kompresuj dokumenty PDF, aby zmniejszyć ich rozmiar." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Zmień metadane", + "desc": "Zmień/Usuń/Dodaj metadane w dokumencie PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Zamiana na tekst", + "desc": "OCR skanuje i wykrywa tekst z obrazów w dokumencie PDF i zamienia go na tekst." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Wyodrębnij obrazy", + "desc": "Wyodrębnia wszystkie obrazy z dokumentu PDF i zapisuje je w wybranym formacie" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Podpis", + "desc": "Dodaje podpis do dokumentu PDF za pomocą rysunku, tekstu lub obrazu" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Spłaszcz", + "desc": "Usuń wszystkie interaktywne elementy i formularze z dokumentu PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Podpisz certyfikatem", + "desc": "Podpisz dokument PDF za pomocą certyfikatu/klucza prywatnego (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Napraw", + "desc": "Spróbuj naprawić uszkodzony dokument PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Usuń puste strony", + "desc": "Wykrywa i usuwa puste strony z dokumentu PDF" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Usuń notatki/przypisy", + "desc": "Usuwa wszystkie notatki i przypisy z dokumentu PDF" + }, + "compare": { + "tags": "difference", + "title": "Porównaj", + "desc": "Porównuje i pokazuje różnice między dwoma dokumentami PDF" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Usuń podpis certyfikatem", + "desc": "Usuń podpis certyfikatem z dokumentu PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Układ wielu stron", + "desc": "Scal wiele stron dokumentu PDF w jedną stronę" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Dopasuj rozmiar stron", + "desc": "Dopasuj rozmiar stron wybranego dokumentu PDF" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Dodaj numery stron", + "desc": "Dodaj numery strony w dokumencie PDF w podanej lokalizacji" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Zmień kolor/nasycenie/jasność", + "desc": "Zmień kolor/nasycenie/jasność w dokumencie PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Przytnij PDF", + "desc": "Przytnij dokument PDF w celu zmniejszenia rozmiaru" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Automatycznie podziel strony", + "desc": "Automatycznie podziel dokument na strony" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Pobierz informacje o pliku PDF", + "desc": "Pobiera wszelkie informacje o pliku PDF" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF do jednej strony", + "desc": "Łączy wszystkie strony PDFa w jedną wielką stronę PDF" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Pokaż kod JavaScript", + "desc": "Znajduje i pokazuje załączony kod JS w dokumencie PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Usuń obraz", + "desc": "Usuń obraz z pliku PDF, aby zmniejszyć rozmiar pliku" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Podziel PDF według rozdziałów", + "desc": "Podział pliku PDF na wiele plików na podstawie struktury rozdziałów." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Sprawdź poprawność podpisu PDF", + "desc": "Weryfikuj podpisy cyfrowe i certyfikaty w dokumentach PDF" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Wyciągnij stronę", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Usuń", + "desc": "Usuń niechciane strony z dokumentu PDF." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Podziel (Rozmiar/Ilość stron)", + "desc": "Rozdziela dokument PDF na wiele dokumentów bazując na podanym rozmiarze, ilości stron bądź ilości dokumentów" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Dodaj hasło", + "desc": "Zaszyfruj dokument PDF za pomocą hasła." + }, + "changePermissions": { + "title": "Zmień uprawnienia", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Nakłada dokumenty PDF na siebie", + "title": "Nałóż PDFa" + }, "imageToPDF": { "title": "Obraz na PDF", "desc": "Konwertuj obraz (PNG, JPEG, GIF) do dokumentu PDF." @@ -355,18 +786,6 @@ "title": "PDF na Obraz", "desc": "Konwertuj plik PDF na obraz (PNG, JPEG, GIF)." }, - "pdfOrganiser": { - "title": "Uporządkuj", - "desc": "Usuń/Zmień kolejność stron w dowolnej kolejności" - }, - "addImage": { - "title": "Dodaj obraz", - "desc": "Dodaje obraz w wybranym miejscu w dokumencie PDF" - }, - "watermark": { - "title": "Dodaj znak wodny", - "desc": "Dodaj niestandardowy znak wodny do dokumentu PDF." - }, "permissions": { "title": "Zmień uprawnienia", "desc": "Zmień uprawnienia dokumentu PDF" @@ -375,38 +794,10 @@ "title": "Usuń", "desc": "Usuń niechciane strony z dokumentu PDF." }, - "addPassword": { - "title": "Dodaj hasło", - "desc": "Zaszyfruj dokument PDF za pomocą hasła." - }, - "removePassword": { - "title": "Usuń hasło", - "desc": "Usuń ochronę hasłem z dokumentu PDF." - }, - "compress": { - "title": "Kompresuj", - "desc": "Kompresuj dokumenty PDF, aby zmniejszyć ich rozmiar." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Zmień metadane", - "desc": "Zmień/Usuń/Dodaj metadane w dokumencie PDF" - }, "fileToPDF": { "title": "Konwertuj plik do PDF", "desc": "Konwertuj dowolny plik do dokumentu PDF (DOCX, PNG, XLS, PPT, TXT i więcej)" }, - "ocr": { - "title": "OCR / Zamiana na tekst", - "desc": "OCR skanuje i wykrywa tekst z obrazów w dokumencie PDF i zamienia go na tekst." - }, - "extractImages": { - "title": "Wyodrębnij obrazy", - "desc": "Wyodrębnia wszystkie obrazy z dokumentu PDF i zapisuje je w wybranym formacie" - }, "pdfToPDFA": { "title": "PDF na PDF/A", "desc": "Konwertuj dokument PDF na PDF/A w celu długoterminowego przechowywania" @@ -435,70 +826,14 @@ "title": "Wykryj/Podziel zeskanowane zdjęcia", "desc": "Podziel na wiele zdjęć z jednego zdjęcia/PDF" }, - "sign": { - "title": "Podpis", - "desc": "Dodaje podpis do dokumentu PDF za pomocą rysunku, tekstu lub obrazu" - }, - "flatten": { - "title": "Spłaszcz", - "desc": "Usuń wszystkie interaktywne elementy i formularze z dokumentu PDF" - }, - "repair": { - "title": "Napraw", - "desc": "Spróbuj naprawić uszkodzony dokument PDF" - }, - "removeBlanks": { - "title": "Usuń puste strony", - "desc": "Wykrywa i usuwa puste strony z dokumentu PDF" - }, - "removeAnnotations": { - "title": "Usuń notatki/przypisy", - "desc": "Usuwa wszystkie notatki i przypisy z dokumentu PDF" - }, - "compare": { - "title": "Porównaj", - "desc": "Porównuje i pokazuje różnice między dwoma dokumentami PDF" - }, - "certSign": { - "title": "Podpisz certyfikatem", - "desc": "Podpisz dokument PDF za pomocą certyfikatu/klucza prywatnego (PEM/P12)" - }, - "removeCertSign": { - "title": "Usuń podpis certyfikatem", - "desc": "Usuń podpis certyfikatem z dokumentu PDF" - }, - "pageLayout": { - "title": "Układ wielu stron", - "desc": "Scal wiele stron dokumentu PDF w jedną stronę" - }, - "scalePages": { - "title": "Dopasuj rozmiar stron", - "desc": "Dopasuj rozmiar stron wybranego dokumentu PDF" - }, "pipeline": { "title": "Automatyzacja", "desc": "Wykonaj wiele akcji na dokumentach PDF, tworząc automatyzację" }, - "addPageNumbers": { - "title": "Dodaj numery stron", - "desc": "Dodaj numery strony w dokumencie PDF w podanej lokalizacji" - }, "auto-rename": { "title": "Automatycznie zmień nazwę PDF", "desc": "Automatycznie zmień nazwę PDF bazując na nagłówku" }, - "adjustContrast": { - "title": "Zmień kolor/nasycenie/jasność", - "desc": "Zmień kolor/nasycenie/jasność w dokumencie PDF" - }, - "crop": { - "title": "Przytnij PDF", - "desc": "Przytnij dokument PDF w celu zmniejszenia rozmiaru" - }, - "autoSplitPDF": { - "title": "Automatycznie podziel strony", - "desc": "Automatycznie podziel dokument na strony" - }, "sanitizePDF": { "title": "Dezynfekcja", "desc": "Usuń skrypt i inne elementy z dokumentu PDF" @@ -519,30 +854,14 @@ "title": "PDF do Markdown", "desc": "Konwertuje dowolny plik PDF na Markdown" }, - "getPdfInfo": { - "title": "Pobierz informacje o pliku PDF", - "desc": "Pobiera wszelkie informacje o pliku PDF" - }, "pageExtracter": { "title": "Wyciągnij stronę z PDF", "desc": "Wyciąga stronę z dokumentu PDF" }, - "pdfToSinglePage": { - "title": "PDF do jednej strony", - "desc": "Łączy wszystkie strony PDFa w jedną wielką stronę PDF" - }, - "showJS": { - "title": "Pokaż kod JavaScript", - "desc": "Znajduje i pokazuje załączony kod JS w dokumencie PDF" - }, "autoRedact": { "title": "Zaciemnij", "desc": "Zaciemnia dokument PDF bazując na podanej wartości" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF do CSV", "desc": "Konwertuje tabele z PDF do pliku CSV" @@ -551,10 +870,6 @@ "title": "Podziel (Rozmiar/Ilość stron)", "desc": "Rozdziela dokument PDF na wiele dokumentów bazując na podanym rozmiarze, ilości stron bądź ilości dokumentów" }, - "overlay-pdfs": { - "title": "Nałóż PDFa", - "desc": "Nakłada dokumenty PDF na siebie" - }, "split-by-sections": { "title": "Podziel PDF na sekcje", "desc": "Podziel strony PDF w mniejsze sekcje" @@ -563,43 +878,17 @@ "title": "Dodaj pieczęć", "desc": "Dodaj pieczęć tekstową/obrazową w wyznaczonej lokalizacji dokumentu" }, - "removeImage": { - "title": "Usuń obraz", - "desc": "Usuń obraz z pliku PDF, aby zmniejszyć rozmiar pliku" - }, - "splitByChapters": { - "title": "Podziel PDF według rozdziałów", - "desc": "Podział pliku PDF na wiele plików na podstawie struktury rozdziałów." - }, - "validateSignature": { - "title": "Sprawdź poprawność podpisu PDF", - "desc": "Weryfikuj podpisy cyfrowe i certyfikaty w dokumentach PDF" - }, "replace-color": { "title": "Zastąp i Odwróć Kolor", "desc": "Zastąp kolor tekstu i tła w pliku PDF i odwróć pełen kolor pliku PDF, aby zmniejszyć rozmiar pliku" }, - "convert": { - "title": "Konwertuj" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Wyciągnij stronę" - }, - "removePages": { - "title": "Usuń", - "desc": "Usuń niechciane strony z dokumentu PDF." - }, "removeImagePdf": { "title": "Usuń obraz", "desc": "Usuń obraz z pliku PDF, aby zmniejszyć rozmiar pliku" }, - "autoSizeSplitPDF": { - "title": "Podziel (Rozmiar/Ilość stron)", - "desc": "Rozdziela dokument PDF na wiele dokumentów bazując na podanym rozmiarze, ilości stron bądź ilości dokumentów" - }, "adjust-contrast": { "title": "Zmień kolor/nasycenie/jasność", "desc": "Zmień kolor/nasycenie/jasność w dokumencie PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Zastąp i Odwróć Kolor", "desc": "Zastąp kolor tekstu i tła w pliku PDF i odwróć pełen kolor pliku PDF, aby zmniejszyć rozmiar pliku" - }, - "changePermissions": { - "title": "Zmień uprawnienia" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "wyświetl,czytaj,adnotuj,tekst,obraz", "title": "Przeglądaj/Edytuj PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "scalanie, operacje na stronach, back-end, po stronie serwera", "title": "Połącz", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Połącz", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Nazwa pliku", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Połącz wiele dokumentów PDF (2+)", "sortByName": "Sortuj po nazwie", "sortByDate": "Sortuj po dacie", - "removeCertSign": "Usuń podpis cyfrowy w scalonym pliku?", - "submit": "Połącz", - "sortBy": { - "filename": "Nazwa pliku" - } + "removeCertSign": "Usuń podpis cyfrowy w scalonym pliku?" }, "split": { - "tags": "Operacje na stronach, dzielenie, wiele stron, cięcie, po stronie serwera", "title": "Podziel dokument PDF", "header": "Podziel dokument PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Wprowadź strony do podziału na:", "submit": "Podziel", "steps": { + "chooseMethod": "Choose Method", "settings": "Ustawienia" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Rozmiar pliku" + "name": "Rozmiar pliku", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Rozmiar pliku" + "label": "Rozmiar pliku", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operacje na stronach, dzielenie, wiele stron, cięcie, po stronie serwera" }, "rotate": { - "tags": "strona serwera", "title": "Obróć dokument PDF", + "submit": "Obróć", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "strona serwera", "header": "Obróć dokument PDF", - "selectAngle": "Wybierz kąt obrotu (domyślnie 90 stopni):", - "submit": "Obróć" + "selectAngle": "Wybierz kąt obrotu (domyślnie 90 stopni):" + }, + "convert": { + "title": "Konwertuj", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Ustawienia", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "kolor", + "greyscale": "Odcień szarości", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Wypełnij stronę", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "Dokument zawiera podpis cyfrowy, nie zostanie on wczytany.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Odcień szarości", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konwersja,img,jpg,obraz,zdjęcie" @@ -727,7 +1263,33 @@ "8": "Usuń ostatnią", "9": "Usuń pierwszą i ostatnią", "10": "Połącz parzyste i nieparzyste", - "11": "Zduplikuj wszystkie strony" + "11": "Zduplikuj wszystkie strony", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(przykład 1,3,2 lub 4-8,2,10-12 lub 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Dodaj obraz", "submit": "Dodaj obraz" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Tekst,powtarzanie,etykieta,własne,prawa autorskie,znak wodny,img,jpg,obraz,zdjęcie", "title": "Dodaj znak wodny", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Dodaj znak wodny", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Tekst", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Rozmiar Czcionki", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Tekst", + "2": "Obraz" + }, + "tags": "Tekst,powtarzanie,etykieta,własne,prawa autorskie,znak wodny,img,jpg,obraz,zdjęcie", "header": "Dodaj znak wodny", "customColor": "Własny kolor tekstu", "selectText": { @@ -755,17 +1506,6 @@ "8": "Typ znaku wodnego:", "9": "Obraz znaku wodnego:", "10": "Konwertuj PDF do PDF-Image" - }, - "submit": "Dodaj znak wodny", - "type": { - "1": "Tekst", - "2": "Obraz" - }, - "watermarkType": { - "text": "Tekst" - }, - "settings": { - "fontSize": "Rozmiar Czcionki" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Usuń strony,usuwaj strony", "title": "Usuń", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Usuń" }, - "addPassword": { - "tags": "bezpieczeństwo,ochrona", - "title": "Dodaj hasło", - "header": "Dodaj hasło (zaszyfruj)", - "selectText": { - "1": "Wybierz plik PDF do zaszyfrowania", - "2": "Hasło", - "3": "Długość klucza szyfrowania", - "4": "Wyższe wartości są silniejsze, ale niższe wartości zapewniają lepszą kompatybilność.", - "5": "Uprawnienia do zmian", - "6": "Zablokuj zmiany w dokumencie", - "7": "Zablokuj zmiany w treści", - "8": "Zablokuj zmiany w celu ułatwienia dostępu", - "9": "Zablokuj wypełnianie formularzy", - "10": "Zablokuj modyfikacje", - "11": "Zablokuj modyfikacje adnotacji", - "12": "Zablokuj drukowanie", - "13": "Zablokuj drukowanie różnych formatów", - "14": "Hasło właściciela", - "15": "Ogranicza akcje, które można wykonać na dokumencie, kiedy jest otwarty (nie wspierany przez wszystkie przeglądarki)", - "16": "Ogranicza otwarcie dokumentu" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Zablokuj", "tooltip": { - "permissions": { - "title": "Zmień uprawnienia" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "zabezpieczenie,odszyfrowanie,bezpieczeństwo,odhasłowanie,usunięcie hasła", - "title": "Usuń hasło", - "header": "Usuń hasło (odszyfruj)", - "selectText": { - "1": "Wybierz dokument PDF do odszyfrowania", - "2": "Hasło" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Usuń", - "desc": "Usuń ochronę hasłem z dokumentu PDF.", - "password": { - "stepTitle": "Usuń hasło", - "label": "Obecne hasło" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Tytuł,autor,data,utworzenie,czas,wydawca,producent,statystyki", - "title": "Tytuł:", "header": "Zmień metadane", + "submit": "Zmień", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Tytuł,autor,data,utworzenie,czas,wydawca,producent,statystyki", "selectText": { "1": "Edytuj zmienne, które chcesz zmienić", "2": "Usuń wszystkie metadane", @@ -856,15 +1877,7 @@ "4": "Inne metadane:", "5": "Dodaj niestandardowy wpis w metadanych" }, - "author": "Autor:", - "creationDate": "Data utworzenia (yyyy/MM/dd HH:mm:ss):", - "creator": "Twórca:", - "keywords": "Słowa kluczowe:", - "modDate": "Data modyfikacji (yyyy/MM/dd HH:mm:ss):", - "producer": "Producent:", - "subject": "Temat:", - "trapped": "Zablokowany:", - "submit": "Zmień" + "modDate": "Data modyfikacji (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformacja,format,dokument,obraz,slajd,tekst,konwersja,office,dokumenty,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "rozpoznawanie, tekst, obraz, skanowanie, odczyt, identyfikacja, wykrywanie, edytowalność", "title": "OCR / Zamiana na tekst", + "desc": "OCR skanuje i wykrywa tekst z obrazów w dokumencie PDF i zamienia go na tekst.", "header": "OCR / Zamiana na tekst (optyczne rozpoznawanie znaków)", "selectText": { "1": "Wybierz języki, które mają zostać wykryte w dokumencie PDF (te z listy to języki, które są obecnie wykrywane):", @@ -896,23 +1910,89 @@ "help": "Przeczytaj tę dokumentację, aby dowiedzieć się, jak używać tego w innych językach i/lub nie używać docker", "credit": "Ta usługa używa qpdf i Tesseract do OCR.", "submit": "Przetwarzaj PDF za pomocą OCR", - "desc": "OCR skanuje i wykrywa tekst z obrazów w dokumencie PDF i zamienia go na tekst.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Ustawienia", "ocrMode": { - "label": "Tryb OCR" + "label": "Tryb OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Języki" + "label": "Języki", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Tryb OCR" + "title": "Tryb OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Języki" + "title": "Języki", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Wyodrębnij obrazy", "selectText": "Wybierz format obrazu, na który chcesz przekonwertować wyodrębniony obraz.", "allowDuplicates": "Zapisz zduplikowane obrazy", - "submit": "Wyodrębnij" + "submit": "Wyodrębnij", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "archiwum, długoterminowe, standardowe, konwersja, przechowywanie, konserwacja", @@ -993,17 +2079,53 @@ }, "info": "Python nie został zainstalowany. Jest on wymagany do uruchomienia." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autoryzacja, inicjały, podpis odręczny, podpis tekstowy, podpis graficzny", "title": "Podpis", "header": "Dodaj podpis do dokumentu PDF", "upload": "Wczytaj opbraz", - "draw": "Narysuj podpis", - "text": "Wprowadź tekst", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Wyczyść", "add": "Dodaj", "saved": "Zapisane podpisy", "save": "Zapisany podpis", + "applySignatures": "Apply Signatures", "personalSigs": "Podpisy osobiste", "sharedSigs": "Podpisy współdzielone", "noSavedSigs": "Nie znaleziono zapisanych podpisów", @@ -1015,42 +2137,179 @@ "previous": "Poprzednia strona", "maintainRatio": "Przełącz zachowanie proporcji", "undo": "Cofnij", - "redo": "Ponów" + "redo": "Ponów", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autoryzacja, inicjały, podpis odręczny, podpis tekstowy, podpis graficzny" }, "flatten": { - "tags": "statyczny, dezaktywacja, nieinteraktywny, opływowy, streamline", "title": "Spłaszcz", "header": "Spłaszcz dokument(y) PDF", "flattenOnlyForms": "Spłaszcz tylko formularze", "submit": "Spłaszcz", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Ustawienia" }, "options": { - "flattenOnlyForms": "Spłaszcz tylko formularze" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Spłaszcz tylko formularze", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statyczny, dezaktywacja, nieinteraktywny, opływowy, streamline" }, "repair": { "tags": "naprawianie, naprawa, przywracanie, poprawianie, odzyskiwanie", "title": "Napraw", "header": "Napraw dokument(y) PDF", - "submit": "Napraw" + "submit": "Napraw", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "czyszczenie, usprawnianie, brak treści, organizowanie", "title": "Usuń puste", "header": "Usuń puste strony", - "threshold": "Próg:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Usuń puste", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "czyszczenie, usprawnianie, brak treści, organizowanie", "thresholdDesc": "Próg określający, jak biały musi być biały piksel", - "whitePercent": "Procent białego (%):", - "whitePercentDesc": "Procent strony, która musi być biała, aby została usunięta", - "submit": "Usuń puste" + "whitePercentDesc": "Procent strony, która musi być biała, aby została usunięta" }, "removeAnnotations": { "tags": "komentarze, podświetlanie, notatki, znaczniki, usuwanie", "title": "Usuń notatki", "header": "Usuń notatki", - "submit": "Usuń" + "submit": "Usuń", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "rozróżnienie, kontrast, zmiany, analiza", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "uwierzytelnianie, PEM, P12, oficjalny, szyfrowanie", "title": "Podpisywanie certyfikatem", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Lokalizacja", + "logoTitle": "Logo", + "name": "Nazwa", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Wprowadź hasło do magazynu kluczy lub klucza prywatnego (jeśli istnieje):", + "passwordOptional": "Leave empty if no password", + "reason": "Organizacja", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo", "header": "Podpisz dokument PDF certyfikatem prywatnym (moduł w budowie)", "selectPDF": "Wybierz dokument PDF do podpisania:", "jksNote": "Notka: jeśli twój typ certyfikatu nie jest widoczny na liście, skonwertuj go do formatu Java Keystore (.jks) używając polecenia keytool. Następnie wybierz plik .JKS poniżej z listy.", @@ -1089,13 +2484,7 @@ "selectCert": "Wybierz plik certyfikatu (format X.509, może to być .pem lub .der):", "selectP12": "Wybierz plik magazynu kluczy PKCS#12 (.p12 lub .pfx) (opcjonalnie, jeśli jest podany, powinien zawierać klucz prywatny i certyfikat):", "selectJKS": "Wybierz plik Java Keystore (.jks lub .keystore):", - "certType": "Typ certyfikatu", - "password": "Wprowadź hasło do magazynu kluczy lub klucza prywatnego (jeśli istnieje):", "showSig": "Wyświetl podpis", - "reason": "Organizacja", - "location": "Lokalizacja", - "name": "Nazwa", - "showLogo": "Show Logo", "submit": "Podpisz PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Usuń podpis cyfrowy", "header": "Usuń podpis cyfrowy z dokumentu PDF", "selectPDF": "Wskaż plik PDF:", - "submit": "Usuń podpis cyfrowy" + "submit": "Usuń podpis cyfrowy", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "scalanie, kompozycja, pojedynczy widok, organizowanie, porządkowanie", @@ -1111,16 +2511,157 @@ "header": "Układ wielu stron", "pagesPerSheet": "Stron na jednym arkuszu:", "addBorder": "Dodaj granicę", - "submit": "Wykonaj" + "submit": "Wykonaj", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "zmiana rozmiaru, modyfikacja, rozmiar, dostosowanie", "title": "Dopasuj rozmiar stron", "header": "Dopasuj rozmiar stron", "pageSize": "Rozmiar stron dokumentu:", "keepPageSize": "Original Size", "scaleFactor": "Poziom powiększenia (przycięcia) stron:", - "submit": "Wykonaj" + "submit": "Wykonaj", + "tags": "zmiana rozmiaru, modyfikacja, rozmiar, dostosowanie" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "stronicowanie, etykieta, organizowanie, indeks, index" @@ -1129,16 +2670,83 @@ "tags": "automatyczne wykrywanie, oparte na nagłówkach, organizowanie, ponowne etykietowanie", "title": "Automatyczna zmiana nazwy", "header": "Automatyczna zmiana nazwy dokumentu PDF", - "submit": "Automatyczna zmiana nazwy" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Automatyczna zmiana nazwy", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "Korekcja kolorów, dostrajanie, modyfikacja, ulepszanie" }, "crop": { - "tags": "przycinanie, zmniejszanie, edycja, kształtowanie", "title": "Przytnij", "header": "Przytnij dokument PDF", - "submit": "Wyślij" + "submit": "Wyślij", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "przycinanie, zmniejszanie, edycja, kształtowanie" }, "autoSplitPDF": { "tags": "Oparty na QR, rozdzielanie, skanowanie, organizowanie", @@ -1221,24 +2829,124 @@ "downloadJS": "Pobierz Javascript", "submit": "Pokaż" }, - "autoRedact": { - "tags": "Redagowanie, ukrywanie, zaciemnianie, zaczernianie, zaznaczanie, ukrywanie", - "title": "Automatyczne zaciemnienie", - "header": "Automatyczne zaciemnienie", - "colorLabel": "Kolor", - "textsToRedactLabel": "Tekst do zaciemnienia (podzielony liniami)", - "textsToRedactPlaceholder": "przykład \\n Poufne \\n Ściśle tajne", - "useRegexLabel": "Użyj RegExp", - "wholeWordSearchLabel": "Szukaj całego słowa", - "customPaddingLabel": "Dodatkowe wypełnienie", - "convertPDFToImageLabel": "Przerób PDF na PDF-obrazowy (usuwa tekst w tle)", - "submitButton": "Wyślij" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Redakcja ręczna", - "header": "Redakcja ręczna", "submit": "Redaguj", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Zaawansowane" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Dodaj", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Strony", + "placeholder": "(przykład 1,2,8 lub 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Eksportuj", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Redakcja ręczna", "textBasedRedaction": "Redakcja oparta na tekście", "pageBasedRedaction": "Redakcja oparta na stronach", "convertPDFToImageLabel": "Konwertuj PDF do PDF-Image (służy do usuwania tekstu za polem)", @@ -1264,22 +2972,7 @@ "showLayers": "Pokaż warstwy (kliknij dwukrotnie, aby przywrócić domyślny stan warstw)", "colourPicker": "Selektor kolorów", "findCurrentOutlineItem": "Znajdź bieżący element zarysu", - "applyChanges": "Zastosuj zmiany", - "auto": { - "settings": { - "advancedTitle": "Zaawansowane" - }, - "wordsToRedact": { - "add": "Dodaj" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Strony", - "placeholder": "(przykład 1,2,8 lub 2n-1)" - }, - "export": "Eksportuj" - } + "applyChanges": "Zastosuj zmiany" }, "tableExtraxt": { "tags": "CSV, ekstrakcja tabeli, ekstrakcja, konwersja, wydobywanie" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "Nakładka", "header": "Nałóż pliki PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Wybierz bazowy plik PDF" }, "overlayFiles": { - "label": "Wybierz plik(i) nakładane PDF" + "label": "Wybierz plik(i) nakładane PDF", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Wybierz tryb nakładania", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "Ile potwórzeń", - "placeholder": "Wprowadź numerację rozdzieloną przecinkami (2,3,1)" + "placeholder": "Wprowadź numerację rozdzieloną przecinkami (2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Wybierz miejsce nakładania", "foreground": "Przód", "background": "Tło" }, - "submit": "Wyślij" + "submit": "Wyślij", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Podział sekcji, dzielenie, dostosowywanie", @@ -1332,6 +3068,7 @@ "tags": "Stempel, dodawanie obrazu, wyśrodkowanie obrazu, znak wodny, PDF, osadzanie, dostosowywanie", "header": "Pieczęć PDF", "title": "Pieczęć PDF", + "stampSetup": "Stamp Setup", "stampType": "Typ pieczęci", "stampText": "Tekst w pieczęci", "stampImage": "Obraz w pieczęci", @@ -1344,7 +3081,19 @@ "overrideY": "Nadpisz koordynatę Y", "customMargin": "Własny margines", "customColor": "Własny kolor tekstu", - "submit": "Wyślij" + "submit": "Wyślij", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Usuń obraz, operacje na stronie, back-end, strona serwera" @@ -1362,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Poprawny", - "invalid": "Niepoprawny" + "invalid": "Niepoprawny", + "complete": "Validation complete" }, "signer": "Podpisujący", "date": "Data", @@ -1389,40 +3139,122 @@ "version": "Wersja", "keyUsage": "Zastosowanie klucza", "selfSigned": "Samopodpisany", - "bits": "bity" + "bits": "bity", + "details": "Certificate Details" }, "signature": { "info": "Informacje o podpisie", "_value": "Podpis", "mathValid": "Podpis jest matematycznie poprawny, ALE:" }, - "selectCustomCert": "Niestandardowy plik certyfikatu X.509 (Opcjonalne)" - }, - "replace-color": { - "title": "Zamień-Odwróć-Kolor", - "header": "Zamień-Odwróć kolor PDF", - "selectText": { - "1": "Zastąp lub Odwróć opcje kolorów", - "2": "Domyślnie (domyślne kolory o wysokim kontraście)", - "3": "Niestandardowe (kolory niestandardowe)", - "4": "Całkowita-Odwrotność (Odwrócenie wszystkich kolorów)", - "5": "Wysoki kontrast opcji kolorystycznych", - "6": "biały tekst na czarnym tle", - "7": "Czarny tekst na białym tle", - "8": "Żółty tekst na czarnym tle", - "9": "Zielony tekst na czarnym tle", - "10": "Wybierz Kolor tekstu", - "11": "Wybierz Kolor tła" + "selectCustomCert": "Niestandardowy plik certyfikatu X.509 (Opcjonalne)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Zamień" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Zastąp kolor, operacje na stronach, back-end, strona serwera" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Logowanie", "header": "Logowanie", "signin": "Logowanie", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Zapamiętaj", "invalid": "Nieprawidłowe dane logowania", "locked": "Konto jest zablokowane", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "Jesteś już zalogowany na", "alreadyLoggedIn2": "urządzeniach. Wyloguj się z tych urządzeń i spróbuj ponownie.", "toManySessions": "Masz zbyt wiele aktywnych sesji", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF do pojedyńczej strony", "header": "PDF do pojedyńczej strony", - "submit": "Zapisz dokument jako PDF z jedną stroną" + "submit": "Zapisz dokument jako PDF z jedną stroną", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Wyciągnij stronę", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "Dopasuj kontrast", "header": "Dopasuj kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Jasność:", "saturation": "Nasycenie:", - "download": "Pobierz" + "download": "Pobierz", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Kompresuj", + "desc": "Compress PDFs to reduce their file size.", "header": "Kompresuj PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Rozmiar pliku" + }, "credit": "Ta usługa używa qpdf do kompresji/optymalizacji PDF.", "grayscale": { "label": "Zastosuj skalę szarości do kompresji" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Ustawienia kompresji", @@ -1491,10 +3435,7 @@ "4": "Tryb automatyczny - Automatycznie dostosowuje jakość, aby uzyskać dokładny rozmiar pliku PDF", "5": "Oczekiwany rozmiar pliku PDF (np. 25 MB, 10,8 MB, 25 KB)" }, - "submit": "Kompresuj", - "method": { - "filesize": "Rozmiar pliku" - } + "submit": "Kompresuj" }, "decrypt": { "passwordPrompt": "Ten plik jest chroniony hasłem. Wprowadź hasło:", @@ -1595,7 +3536,13 @@ "title": "Usuń obraz", "header": "Usuń obraz", "removeImage": "Usuń obraz", - "submit": "Usuń obraz" + "submit": "Usuń obraz", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Podziel PDF według Rozdziałów", @@ -1629,6 +3576,12 @@ }, "note": "Informacje o wydaniu są dostępne tylko w języku angielskim" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,54 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Pobierz", - "undo": "Cofnij", - "convert": { - "title": "Konwertuj", - "settings": "Ustawienia", - "color": "kolor", - "greyscale": "Odcień szarości", - "fillPage": "Wypełnij stronę", - "pdfaDigitalSignatureWarning": "Dokument zawiera podpis cyfrowy, nie zostanie on wczytany.", - "grayscale": "Odcień szarości" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Zaznacz wszystko", - "deselectAll": "Odznacz wszystko" + "deselectAll": "Odznacz wszystko", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Podpis" + "read": "Read", + "sign": "Podpis", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Ładowanie...", - "or": "lub" + "or": "lub", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Nazwa", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Wersja", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Zaznacz wszystko", "deselectAll": "Odznacz wszystko", "deleteSelected": "Usuń zaznaczone", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Pobierz", - "delete": "usuń" + "delete": "usuń", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Dezynfekuj PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Ustawienia" + "files": "Files", + "settings": "Ustawienia", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Dodaj hasło", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Zablokuj", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Zmień uprawnienia", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "bezpieczeństwo,ochrona", + "header": "Dodaj hasło (zaszyfruj)", + "selectText": { + "1": "Wybierz plik PDF do zaszyfrowania", + "2": "Hasło", + "3": "Długość klucza szyfrowania", + "4": "Wyższe wartości są silniejsze, ale niższe wartości zapewniają lepszą kompatybilność.", + "5": "Uprawnienia do zmian", + "6": "Zablokuj zmiany w dokumencie", + "7": "Zablokuj zmiany w treści", + "8": "Zablokuj zmiany w celu ułatwienia dostępu", + "9": "Zablokuj wypełnianie formularzy", + "10": "Zablokuj modyfikacje", + "11": "Zablokuj modyfikacje adnotacji", + "12": "Zablokuj drukowanie", + "13": "Zablokuj drukowanie różnych formatów", + "14": "Hasło właściciela", + "15": "Ogranicza akcje, które można wykonać na dokumencie, kiedy jest otwarty (nie wspierany przez wszystkie przeglądarki)", + "16": "Ogranicza otwarcie dokumentu" } }, "changePermissions": { "title": "Zmień uprawnienia", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Zmień uprawnienia", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Zablokuj zmiany w dokumencie" @@ -1738,10 +4580,784 @@ "label": "Zablokuj drukowanie różnych formatów" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Zmień uprawnienia" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Usuń hasło", + "desc": "Usuń ochronę hasłem z dokumentu PDF.", + "tags": "zabezpieczenie,odszyfrowanie,bezpieczeństwo,odhasłowanie,usunięcie hasła", + "password": { + "stepTitle": "Usuń hasło", + "label": "Obecne hasło", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Usuń", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Usuń hasło (odszyfruj)", + "selectText": { + "1": "Wybierz dokument PDF do odszyfrowania", + "2": "Hasło" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Zastąp lub Odwróć opcje kolorów", + "2": "Domyślnie (domyślne kolory o wysokim kontraście)", + "3": "Niestandardowe (kolory niestandardowe)", + "4": "Całkowita-Odwrotność (Odwrócenie wszystkich kolorów)", + "5": "Wysoki kontrast opcji kolorystycznych", + "6": "biały tekst na czarnym tle", + "7": "Czarny tekst na białym tle", + "8": "Żółty tekst na czarnym tle", + "9": "Zielony tekst na czarnym tle", + "10": "Wybierz Kolor tekstu", + "11": "Wybierz Kolor tła", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Zamień", + "title": "Zamień-Odwróć-Kolor", + "header": "Zamień-Odwróć kolor PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Redagowanie, ukrywanie, zaciemnianie, zaczernianie, zaznaczanie, ukrywanie", + "title": "Automatyczne zaciemnienie", + "header": "Automatyczne zaciemnienie", + "colorLabel": "Kolor", + "textsToRedactLabel": "Tekst do zaciemnienia (podzielony liniami)", + "textsToRedactPlaceholder": "przykład \\n Poufne \\n Ściśle tajne", + "useRegexLabel": "Użyj RegExp", + "wholeWordSearchLabel": "Szukaj całego słowa", + "customPaddingLabel": "Dodatkowe wypełnienie", + "convertPDFToImageLabel": "Przerób PDF na PDF-obrazowy (usuwa tekst w tle)", + "submitButton": "Wyślij" + }, + "replaceColorPdf": { + "tags": "Zastąp kolor, operacje na stronach, back-end, strona serwera" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/pt-BR/translation.json b/frontend/public/locales/pt-BR/translation.json index 803f38772..d38d3583b 100644 --- a/frontend/public/locales/pt-BR/translation.json +++ b/frontend/public/locales/pt-BR/translation.json @@ -1,5 +1,35 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, "unsavedChanges": "Você tem alterações não salvas no seu PDF. O que você gostaria de fazer?", + "areYouSure": "Are you sure you want to leave?", "unsavedChangesTitle": "Alterações não salvas", "keepWorking": "Continuar trabalhando", "discardChanges": "Descartar alterações", @@ -24,8 +54,26 @@ "customTextDesc": "Texto personalizado:", "numberPagesDesc": "Quais páginas numerar, padrão 'todas', também aceita 1-5 ou 2,5,9,etc.", "customNumberDesc": "O padrão é {n}, também aceita 'Página {n} de {total}', 'Texto-{n}', '{nome do arquivo}-{n}'", - "submit": "Adicionar Números de Página" + "submit": "Adicionar Números de Página", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Seleção de Página Personalizada (Digite uma lista de números de páginas, separadas por vírgula como 1,5,6 ou funções como 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Selecione o(s) PDF(s)", "multiPdfPrompt": "Selecione os PDFs (2+)", "multiPdfDropPrompt": "Selecione (ou arraste e solte) todos os PDFs desejados:", @@ -36,7 +84,6 @@ "uploadLimitExceededPlural": "estão acima do limite. Tamanho máximo permitido é", "processTimeWarning": "Aviso: Este processo pode levar até um minuto, dependendo do tamanho do arquivo", "pageOrderPrompt": "Ordem de Página Personalizada (Digite uma lista de números de páginas, separadas por vírgula ou funções como 2n+1):", - "pageSelectionPrompt": "Seleção de Página Personalizada (Digite uma lista de números de páginas, separadas por vírgula como 1,5,6 ou funções como 2n+1):", "goToPage": "Ir", "true": "Verdadeiro", "false": "Falso", @@ -47,11 +94,18 @@ "save": "Salvar", "saveToBrowser": "Salvar no Navegador", "download": "Baixar (JSON)", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", "undoOperationTooltip": "Clique para desfazer a última operação e restaurar os arquivos originais", "undo": "Desfazer", "moreOptions": "Mais opções", "editYourNewFiles": "Edite seu(s) novo(s) arquivo(s)", "close": "Fechar", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "Selecionado: {{filename}}", "chooseFile": "Escolher arquivo", "filesSelected": "Arquivos Selecionados", @@ -61,7 +115,9 @@ "uploadFiles": "Fazer upload de arquivos", "addFiles": "Adicionar arquivos", "selectFromWorkbench": "Selecione arquivos da bancada de trabalho ou ", - "selectMultipleFromWorkbench": "Selecione pelo menos {{count}} arquivos da bancada de trabalho ou " + "selectMultipleFromWorkbench": "Selecione pelo menos {{count}} arquivos da bancada de trabalho ou ", + "created": "Created", + "size": "File Size" }, "noFavourites": "Nenhum Favorito Adicionado", "downloadComplete": "Download Completo", @@ -194,6 +250,7 @@ "title": "Você quer melhorar o Stirling PDF?", "paragraph1": "Stirling PDF possui coleta de dados opcional para ajudar a melhorar o produto. Nós não rastreamos nenhuma informação pessoal ou conteúdo dos arquivos.", "paragraph2": "Por favor considere habilitar a coleta de dados para ajudar Stirling PDF a crescer e nos ajudar a entender melhor nossos usuários.", + "learnMore": "Learn more", "enable": "Habilitar coleta de dados", "disable": "Desabilitar coleta de dados", "settings": "Você pode alterar as configurações de coleta de dados no arquivo config/settings.yml" @@ -237,6 +294,54 @@ "cacheInputs": { "name": "Salvar entradas do formulário.", "help": "Habilitar para armazenar entradas usadas anteriormente para execuções futuras" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -308,8 +413,10 @@ "top20": "Top 20", "all": "Todos", "refresh": "Atualizar", - "includeHomepage": "Incluir Página Inicial ('/')", - "includeLoginPage": "Incluir Página de Login ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total de Endpoints", "totalVisits": "Total de Visitas", "showing": "Mostrando", @@ -324,7 +431,9 @@ "top": "Top", "numberOfVisits": "Número de Visitas", "visitsTooltip": "Visitas: {0} ({1}% do total)", - "retry": "Tentar novamente" + "retry": "Tentar novamente", + "includeHomepage": "Incluir Página Inicial ('/')", + "includeLoginPage": "Incluir Página de Login ('/login')" }, "database": { "title": "Importar/Exportar banco de dados", @@ -365,6 +474,16 @@ "alphabetical": "Alfabética", "globalPopularity": "Popularidade Global", "sortBy": "Ordenar por:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { "tags": "múltiplas,ferramentas", "title": "Multiferramentas de PDF", @@ -550,11 +669,6 @@ "title": "Ocultação de Texto Manual", "desc": "Ocultação de texto manual baseada em um texto selecionado, desenho de formas ou/e páginas selecionadas." }, - "overlayPdfs": { - "tags": "sobrepor,combinar,empilhar", - "title": "Sobrepor PDFs", - "desc": "Sobrepõe PDFs sobre outro PDF" - }, "splitBySections": { "tags": "dividir,seções,particionar", "title": "Dividir PDF por seções", @@ -659,6 +773,15 @@ "tags": "fluxo de trabalho,sequência,automação", "title": "Automatizar", "desc": "Crie fluxos de trabalho de várias etapas encadeando ações de PDF. Ideal para tarefas recorrentes." + }, + "overlay-pdfs": { + "desc": "Overlay one PDF on top of another", + "title": "Overlay PDFs" + }, + "overlayPdfs": { + "tags": "sobrepor,combinar,empilhar", + "title": "Sobrepor PDFs", + "desc": "Sobrepõe PDFs sobre outro PDF" } }, "landing": { @@ -698,13 +821,19 @@ "merge": { "tags": "mesclar,Operações de Página,Back-end,lado do servidor", "title": "Mesclar", - "removeDigitalSignature.tooltip": { - "title": "Remover assinatura digital", - "description": "Assinaturas digitais serão invalidadas ao mesclar arquivos. Marque isto para removê-las do PDF final." + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remover assinatura digital", + "description": "Assinaturas digitais serão invalidadas ao mesclar arquivos. Marque isto para removê-las do PDF final." + } }, - "generateTableOfContents.tooltip": { - "title": "Gerar sumário", - "description": "Cria automaticamente um sumário clicável no PDF mesclado com base nos nomes originais dos arquivos e nos números de página." + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Gerar sumário", + "description": "Cria automaticamente um sumário clicável no PDF mesclado com base nos nomes originais dos arquivos e nos números de página." + } }, "submit": "Mesclar", "sortBy": { @@ -842,12 +971,50 @@ "bullet1": "Nível de marcador: em qual nível dividir (1=nível superior)", "bullet2": "Incluir metadados: preservar propriedades do documento", "bullet3": "Permitir duplicados: lidar com nomes de marcador repetidos" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" } - } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method" }, "rotate": { "title": "Girar", "submit": "Girar", + "selectRotation": "Select Rotation Angle (Clockwise)", "error": { "failed": "Ocorreu um erro ao girar o PDF." }, @@ -935,7 +1102,8 @@ "imagesExt": "Imagens (JPG, PNG, etc.)", "markdown": "Markdown", "textRtf": "Texto/RTF", - "grayscale": "Escala de Cinza" + "grayscale": "Escala de Cinza", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversão,img,jpg,imagem,foto" @@ -973,7 +1141,20 @@ "8": "Remover último", "9": "Remover o primeiro e o último", "10": "Mesclagem ímpar-par", - "11": "Duplicar todas as páginas" + "11": "Duplicar todas as páginas", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, "desc": { "CUSTOM": "Use uma sequência personalizada de números de página ou expressões para definir uma nova ordem.", @@ -1039,7 +1220,9 @@ "opacity": "Opacidade (%)", "spacing": { "horizontal": "Espaçamento horizontal", - "vertical": "Espaçamento vertical" + "vertical": "Espaçamento vertical", + "height": "Height Spacing", + "width": "Width Spacing" }, "convertToImage": "Achatar páginas do PDF em imagens" }, @@ -1182,6 +1365,10 @@ "bullet4": "Melhor para conteúdo sensível ou com direitos autorais" } } + }, + "type": { + "1": "Text", + "2": "Image" } }, "permissions": { @@ -1255,6 +1442,26 @@ }, "submit": "Remover Páginas" }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, "pageSelection": { "tooltip": { "header": { @@ -1295,10 +1502,43 @@ }, "examples": { "title": "Exemplos" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", "header": { "title": "Guia de seleção de páginas" }, @@ -1604,6 +1844,9 @@ "text": "Pós-processa o PDF final removendo artefatos de OCR e otimizando a camada de texto para melhor legibilidade e tamanho menor." } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1766,8 +2009,16 @@ "hint": "Envie uma imagem PNG ou JPG da sua assinatura" }, "instructions": { - "title": "Como adicionar assinatura" + "title": "Como adicionar assinatura", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", "activate": "Ativar posicionamento de assinatura", "deactivate": "Parar de posicionar assinaturas", "results": { @@ -1792,7 +2043,10 @@ "options": { "stepTitle": "Opções de achatamento", "title": "Opções de achatamento", - "flattenOnlyForms.desc": "Achatar apenas campos de formulário, mantendo outros elementos interativos", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "Achatar apenas campos de formulário, mantendo outros elementos interativos" + }, "note": "Achatar remove elementos interativos do PDF, tornando-os não editáveis." }, "results": { @@ -1882,7 +2136,13 @@ "bullet3": "Pode ser desativado para reduzir o tamanho do arquivo de saída" } }, - "submit": "Remover Páginas em Branco" + "submit": "Remover Páginas em Branco", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + } }, "removeAnnotations": { "tags": "comentários,destaque,notas,marcação,remover", @@ -1984,7 +2244,12 @@ "bullet3": "Escolha em qual página posicionar a assinatura", "bullet4": "Logo opcional pode ser incluído" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, "sign": { "submit": "Assinar PDF", @@ -2045,7 +2310,22 @@ "text": "Converta seu arquivo para um keystore Java (.jks) com o keytool e, em seguida, escolha JKS." } } - } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Certificate Password", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo" }, "removeCertSign": { "tags": "autenticar,PEM,P12,oficial,descriptografar", @@ -2071,7 +2351,17 @@ "header": "Layout de Múltiplas Páginas", "pagesPerSheet": "Páginas por folha:", "addBorder": "Adicionar bordas.", - "submit": "Enviar" + "submit": "Enviar", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "livreto,imposição,impressão,encadernação,dobra,assinatura", @@ -2257,10 +2547,22 @@ "reset": "Redefinir para o PDF completo", "coordinates": { "title": "Posição e tamanho", - "x": "Posição X", - "y": "Posição Y", - "width": "Largura", - "height": "Altura" + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } }, "error": { "invalidArea": "A área de corte se estende além dos limites do PDF", @@ -2278,6 +2580,10 @@ }, "results": { "title": "Resultados do corte" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." } }, "autoSplitPDF": { @@ -2488,11 +2794,15 @@ "overlay-pdfs": { "tags": "Sobreposição", "header": "Sobrepor PDFs", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Selecione o arquivo PDF base:" }, "overlayFiles": { - "label": "Selecione os arquivos PDF para sobreposição:" + "label": "Selecione os arquivos PDF para sobreposição:", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Selecione o modo de sobreposição:", @@ -2502,14 +2812,53 @@ }, "counts": { "label": "Contagens de sobreposição (para modo de repetição fixa)", - "placeholder": "Insira contagens separadas por vírgula (por exemplo, 2,3,1)" + "placeholder": "Insira contagens separadas por vírgula (por exemplo, 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Selecione a posição de sobreposição", "foreground": "Primeiro plano", "background": "Plano de fundo" }, - "submit": "Enviar" + "submit": "Enviar", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Seção Dividir, Dividir, Personalizar", @@ -2544,7 +2893,18 @@ "customMargin": "Margem personalizada:", "customColor": "Cor de texto personalizada:", "submit": "Enviar", - "noStampSelected": "Nenhum carimbo selecionado. Volte para a Etapa 1." + "noStampSelected": "Nenhum carimbo selecionado. Volte para a Etapa 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Remover imagem,operações de página,back-end,lado do servidor" @@ -2562,7 +2922,8 @@ "status": { "_value": "Situação", "valid": "Valido", - "invalid": "Inválido" + "invalid": "Inválido", + "complete": "Validation complete" }, "signer": "Signatário", "date": "Data", @@ -2589,17 +2950,115 @@ "version": "Versão", "keyUsage": "Uso da chave", "selfSigned": "Autoassinados", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Informações da assinatura", "_value": "Assinatura", "mathValid": "Assinatura é matematicamente valida PORÉM:" }, - "selectCustomCert": "Arquivo customizado de certificado X.509 (Opcional)" + "selectCustomCert": "Arquivo customizado de certificado X.509 (Opcional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" + }, + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, "replaceColor": { - "tags": "Substituir cor,Operações de página,Back end,server side" + "tags": "Substituir cor,Operações de página,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Iniciar sessão", @@ -2632,6 +3091,11 @@ "enterEmail": "Insira seu e-mail", "enterPassword": "Insira sua senha", "loggingIn": "Entrando...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", "signingIn": "Fazendo login...", "login": "Login", "or": "Ou", @@ -2649,7 +3113,10 @@ "magicLinkSent": "Link mágico enviado para {{email}}! Verifique seu e-mail e clique no link para entrar.", "passwordResetSent": "Link de redefinição de senha enviado para {{email}}! Verifique seu e-mail e siga as instruções.", "failedToSignIn": "Falha ao entrar com {{provider}}: {{message}}", - "unexpectedError": "Erro inesperado: {{message}}" + "unexpectedError": "Erro inesperado: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." }, "signup": { "title": "Criar uma conta", @@ -2672,7 +3139,12 @@ "invalidEmail": "Insira um endereço de e-mail válido", "checkEmailConfirmation": "Verifique seu e-mail para um link de confirmação e conclua seu cadastro.", "accountCreatedSuccessfully": "Conta criada com sucesso! Agora você pode entrar.", - "unexpectedError": "Erro inesperado: {{message}}" + "unexpectedError": "Erro inesperado: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF para Página Única", @@ -2712,10 +3184,23 @@ "adjustContrast": { "title": "Ajuste Visual do PDF", "header": "Ajuste Visual do PDF", + "basic": "Basic Adjustments", "contrast": "Contraste:", "brightness": "Brilho:", "saturation": "Saturação:", - "download": "Baixar" + "download": "Baixar", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Comprimir", @@ -2862,7 +3347,13 @@ "title": "Remover Imagem", "header": "Remover Imagem", "removeImage": "Remover Imagem", - "submit": "Remover Imagem" + "submit": "Remover Imagem", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Divide PDF por Capítulos", @@ -2937,6 +3428,10 @@ "title": "Cookies Analíticos", "description": "Estes cookies nos ajudam a entender como nossas ferramentas estão sendo utilizadas, para que possamos nos concentrar na construção dos recursos que nossa comunidade mais valoriza. Fique tranquilo: o Stirling PDF não pode e nunca rastreará o conteúdo dos documentos com os quais você manipula." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, "removeMetadata": { @@ -2998,11 +3493,18 @@ "panMode": "Modo de panorâmica", "rotateLeft": "Girar à esquerda", "rotateRight": "Girar à direita", - "toggleSidebar": "Alternar barra lateral" + "toggleSidebar": "Alternar barra lateral", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" }, "search": { "title": "Pesquisar PDF", - "placeholder": "Digite o termo de busca..." + "placeholder": "Digite o termo de busca...", + "noResults": "No results found", + "searching": "Searching..." }, "guestBanner": { "title": "Você está usando o Stirling PDF como convidado!", @@ -3040,9 +3542,597 @@ "automate": "Automatizar", "files": "Arquivos", "activity": "Atividade", + "help": "Help", + "account": "Account", "config": "Config", + "adminSettings": "Admin Settings", "allTools": "Todas as ferramentas" }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, "fileUpload": { "selectFile": "Selecionar um arquivo", "selectFiles": "Selecionar arquivos", @@ -3067,6 +4157,9 @@ "addFiles": "Adicionar arquivos", "dragFilesInOrClick": "Arraste arquivos ou clique em \"Adicionar arquivos\" para procurar" }, + "fileEditor": { + "addFiles": "Add Files" + }, "fileManager": { "title": "Fazer upload de arquivos PDF", "subtitle": "Adicione arquivos ao seu armazenamento para fácil acesso entre as ferramentas", @@ -3086,6 +4179,7 @@ "filesStored": "arquivos armazenados", "storageError": "Ocorreu um erro de armazenamento", "storageLow": "O armazenamento está acabando. Considere remover arquivos antigos.", + "supportMessage": "Powered by browser database storage for unlimited capacity", "noFileSelected": "Nenhum arquivo selecionado", "showHistory": "Mostrar histórico", "hideHistory": "Ocultar histórico", @@ -3094,6 +4188,7 @@ "lastModified": "Última modificação", "toolChain": "Ferramentas aplicadas", "restore": "Restaurar", + "unzip": "Unzip", "searchFiles": "Pesquisar arquivos...", "recent": "Recentes", "localFiles": "Arquivos locais", @@ -3101,7 +4196,6 @@ "googleDriveShort": "Drive", "myFiles": "Meus arquivos", "noRecentFiles": "Nenhum arquivo recente encontrado", - "dropFilesHint": "Solte os arquivos aqui para fazer upload", "googleDriveNotAvailable": "Integração com Google Drive indisponível", "openFiles": "Abrir arquivos", "openFile": "Abrir arquivo", @@ -3119,7 +4213,18 @@ "selectedCount": "{{count}} selecionado(s)", "download": "Baixar (JSON)", "delete": "Apagar", - "unsupported": "Não suportado" + "unsupported": "Não suportado", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "Solte os arquivos aqui para fazer upload" }, "storage": { "temporaryNotice": "Os arquivos são armazenados temporariamente no seu navegador e podem ser limpos automaticamente", @@ -3135,8 +4240,10 @@ "desc": "Remova elementos potencialmente nocivos de arquivos PDF.", "submit": "Higienizar", "completed": "Sanitização concluída com sucesso", - "error.generic": "Falha na sanitização", - "error.failed": "Ocorreu um erro ao sanitizar o PDF.", + "error": { + "generic": "Falha na sanitização", + "failed": "Ocorreu um erro ao sanitizar o PDF." + }, "filenamePrefix": "sanitizado", "sanitizationResults": "Resultados da sanitização", "steps": { @@ -3150,12 +4257,30 @@ "options": { "title": "Opções de sanitização", "note": "Selecione os elementos que deseja remover do PDF. Pelo menos uma opção deve ser selecionada.", - "removeJavaScript.desc": "Remover ações e scripts JavaScript do PDF", - "removeEmbeddedFiles.desc": "Remover quaisquer arquivos incorporados no PDF", - "removeXMPMetadata.desc": "Remover metadados XMP do PDF", - "removeMetadata.desc": "Remover metadados de informações do documento (título, autor etc.)", - "removeLinks.desc": "Remover links externos e ações de lançamento do PDF", - "removeFonts.desc": "Remover fontes incorporadas do PDF" + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remover ações e scripts JavaScript do PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remover quaisquer arquivos incorporados no PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remover metadados XMP do PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remover metadados de informações do documento (título, autor etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remover links externos e ações de lançamento do PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remover fontes incorporadas do PDF" + } } }, "addPassword": { @@ -3376,9 +4501,14 @@ "remaining": "restante", "used": "usado", "available": "disponível", - "cancel": "Cancelar" + "cancel": "Cancelar", + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { "title": "Configurações da conta", @@ -3434,8 +4564,570 @@ "submit": "Adicionar anexos", "results": { "title": "Resultados dos anexos" + }, + "error": { + "failed": "Add attachments operation failed" } }, "termsAndConditions": "Termos e Condições", - "logOut": "Sair" -} \ No newline at end of file + "logOut": "Sair", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or invert colour options", + "2": "Default (preset high contrast colours)", + "3": "Custom (choose your own colours)", + "4": "Full invert (invert all colours)", + "5": "High contrast color options", + "6": "White text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + } +} diff --git a/frontend/public/locales/pt-PT/translation.json b/frontend/public/locales/pt-PT/translation.json index 1b9518e07..0026bb8a7 100644 --- a/frontend/public/locales/pt-PT/translation.json +++ b/frontend/public/locales/pt-PT/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Texto Personalizado", "numberPagesDesc": "Quais páginas a numerar, predefinição 'todas', também aceita 1-5 ou 2,5,9 etc", "customNumberDesc": "Predefinição {n}, também aceita 'Página {n} de {total}', 'Texto-{n}', '{filename}-{n}", - "submit": "Adicionar Números de Página" + "submit": "Adicionar Números de Página", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Seleção Personalizada de Páginas (Insira uma lista de números de página separados por vírgulas 1,5,6 ou Funções como 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Selecione PDF(s)", "multiPdfPrompt": "Selecione PDFs (2+)", "multiPdfDropPrompt": "Selecione (ou arraste e solte) todos os PDFs necessários", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "são muito grandes. O tamanho máximo permitido é", "processTimeWarning": "Aviso: Este processo pode demorar até um minuto dependendo do tamanho do ficheiro", "pageOrderPrompt": "Ordem Personalizada de Páginas (Insira uma lista de números de página separados por vírgulas ou Funções como 2n+1):", - "pageSelectionPrompt": "Seleção Personalizada de Páginas (Insira uma lista de números de página separados por vírgulas 1,5,6 ou Funções como 2n+1):", "goToPage": "Ir", "true": "Verdadeiro", "false": "Falso", "unknown": "Desconhecido", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Guardar", "saveToBrowser": "Guardar no Navegador", + "download": "Transferir", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Fechar", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "ficheiros selecionados", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Nenhum favorito adicionado", "downloadComplete": "Download Concluído", "bored": "Entediado à espera?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "O documento PDF está protegido por palavra-passe e ou não foi fornecida ou está incorreta", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Erro", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Pedimos desculpa pelo inconveniente!", "needHelp": "Precisa de ajuda / Encontrou um problema?", "contactTip": "Se ainda estiver com problemas, não hesite em contactar-nos para obter ajuda. Pode submeter um ticket na nossa página GitHub ou contactar-nos através do Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Submeter um ticket", "discordSubmit": "Discord - Submeter Publicação de Suporte" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Eliminar", "username": "Nome de utilizador", "password": "Palavra-passe", @@ -82,6 +169,7 @@ "green": "Verde", "blue": "Azul", "custom": "Personalizar...", + "comingSoon": "Coming soon", "WorkInProgess": "Trabalho em progresso, pode não funcionar ou ter erros, Por favor reporte quaisquer problemas!", "poweredBy": "Desenvolvido por", "yes": "Sim", @@ -115,12 +203,14 @@ "page": "Página", "pages": "Páginas", "loading": "A carregar...", + "review": "Review", "addToDoc": "Adicionar ao Documento", "reset": "Repor", "apply": "Aplicar", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Política de Privacidade", + "iAgreeToThe": "I agree to all of the", "terms": "Termos e Condições", "accessibility": "Acessibilidade", "cookie": "Política de Cookies", @@ -160,6 +250,7 @@ "title": "Quer tornar o Stirling PDF melhor?", "paragraph1": "O Stirling PDF tem análises opcionais para nos ajudar a melhorar o produto. Não rastreamos qualquer informação pessoal ou conteúdo de ficheiros.", "paragraph2": "Por favor considere ativar as análises para ajudar o Stirling-PDF a crescer e permitir-nos compreender melhor os nossos utilizadores.", + "learnMore": "Learn more", "enable": "Ativar análises", "disable": "Desativar análises", "settings": "Pode alterar as definições para análises no ficheiro config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Guardar inputs do formulário", "help": "Ativar para guardar inputs previamente usados para futuras utilizações" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Importar/Exportar Base de Dados", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Multi Ferramenta PDF", "desc": "Juntar, Rodar, Reorganizar, Dividir e Remover páginas" }, "merge": { + "tags": "combine,join,unite", "title": "Juntar", "desc": "Junte facilmente vários PDFs num só." }, "split": { + "tags": "divide,separate,break", "title": "Dividir", "desc": "Dividir PDFs em vários documentos" }, "rotate": { + "tags": "turn,flip,orient", "title": "Rodar", "desc": "Rode facilmente os seus PDFs." }, + "convert": { + "tags": "transform,change", + "title": "Converter", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organizar", + "desc": "Remover/Reorganizar páginas em qualquer ordem" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Adicionar imagem", + "desc": "Adiciona uma imagem numa localização definida no PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Adicionar Marca de Água", + "desc": "Adicionar uma marca de água personalizada ao seu documento PDF." + }, + "removePassword": { + "tags": "unlock", + "title": "Remover Palavra-passe", + "desc": "Remover proteção por palavra-passe do seu documento PDF." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Comprimir", + "desc": "Comprimir PDFs para reduzir o seu tamanho." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Desbloquear Formulários do PDF", + "desc": "Remover propriedades de apenas leitura dos formulários de um PDF" + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Alterar Metadados", + "desc": "Alterar/Remover/Adicionar metadados de um documento PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Limpeza de digitalizações", + "desc": "Limpa digitalizações e deteta texto de imagens dentro de um PDF e readiciona-o como texto." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Extrair Imagens", + "desc": "Extrai todas as imagens de um PDF e guarda-as num zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Assinar", + "desc": "Adiciona assinatura ao PDF por desenho, texto ou imagem" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Achatar", + "desc": "Remover todos os elementos interativos e formulários de um PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Assinar com Certificado", + "desc": "Assina um PDF com um Certificado/Chave (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Reparar", + "desc": "Tenta reparar um PDF corrompido/danificado" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Remover Páginas em Branco", + "desc": "Deteta e remove páginas em branco de um documento" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Remover Anotações", + "desc": "Remove todos os comentários/anotações de um PDF" + }, + "compare": { + "tags": "difference", + "title": "Comparar", + "desc": "Compara e mostra as diferenças entre 2 Documentos PDF" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Remover Assinatura de Certificado", + "desc": "Remove assinatura de certificado do PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Layout Multi-Página", + "desc": "Juntar múltiplas páginas de um documento PDF numa única página" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Ajustar tamanho/escala de página", + "desc": "Alterar o tamanho/escala de uma página e/ou os seus conteúdos." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Adicionar Números de Página", + "desc": "Adicionar números de página ao longo de um documento numa localização definida" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Ajustar Cores/Contraste", + "desc": "Ajustar Contraste, Saturação e Brilho de um PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Recortar PDF", + "desc": "Recortar um PDF para reduzir o seu tamanho (mantém o texto!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Divisão Automática de Páginas", + "desc": "Dividir automaticamente PDF digitalizado com separador de páginas físico com Código QR" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Obter TODA Informação sobre PDF", + "desc": "Obtém qualquer e toda informação possível sobre PDFs" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "Página Única Grande", + "desc": "Junta todas as páginas do PDF numa única página grande" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Mostrar Javascript", + "desc": "Procura e mostra qualquer JS injetado num PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Redação Manual", + "desc": "Redacta um PDF baseado em texto selecionado, formas desenhadas e/ou página(s) selecionada(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Remover imagem", + "desc": "Remover imagem do PDF para reduzir tamanho do ficheiro" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Dividir PDF por Capítulos", + "desc": "Dividir um PDF em múltiplos ficheiros baseado na sua estrutura de capítulos." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validar Assinatura PDF", + "desc": "Verificar assinaturas digitais e certificados em documentos PDF" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extrair Páginas", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Remover", + "desc": "Eliminar páginas indesejadas do seu documento PDF." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Divisão Automática por Tamanho/Contagem", + "desc": "Dividir um único PDF em múltiplos documentos baseado em tamanho, contagem de páginas, ou contagem de documentos" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Adicionar Palavra-passe", + "desc": "Encriptar o seu documento PDF com uma palavra-passe." + }, + "changePermissions": { + "title": "Alterar Permissões", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Sobrepõe PDFs em cima de outro PDF", + "title": "Sobrepor PDFs" + }, "imageToPDF": { "title": "Imagem para PDF", "desc": "Converter uma imagem (PNG, JPEG, GIF) para PDF." @@ -355,18 +786,6 @@ "title": "PDF para Imagem", "desc": "Converter um PDF para uma imagem. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organizar", - "desc": "Remover/Reorganizar páginas em qualquer ordem" - }, - "addImage": { - "title": "Adicionar imagem", - "desc": "Adiciona uma imagem numa localização definida no PDF" - }, - "watermark": { - "title": "Adicionar Marca de Água", - "desc": "Adicionar uma marca de água personalizada ao seu documento PDF." - }, "permissions": { "title": "Alterar Permissões", "desc": "Alterar as permissões do seu documento PDF" @@ -375,38 +794,10 @@ "title": "Remover", "desc": "Eliminar páginas indesejadas do seu documento PDF." }, - "addPassword": { - "title": "Adicionar Palavra-passe", - "desc": "Encriptar o seu documento PDF com uma palavra-passe." - }, - "removePassword": { - "title": "Remover Palavra-passe", - "desc": "Remover proteção por palavra-passe do seu documento PDF." - }, - "compress": { - "title": "Comprimir", - "desc": "Comprimir PDFs para reduzir o seu tamanho." - }, - "unlockPDFForms": { - "title": "Desbloquear Formulários do PDF", - "desc": "Remover propriedades de apenas leitura dos formulários de um PDF" - }, - "changeMetadata": { - "title": "Alterar Metadados", - "desc": "Alterar/Remover/Adicionar metadados de um documento PDF" - }, "fileToPDF": { "title": "Converter ficheiro para PDF", "desc": "Converter quase qualquer ficheiro para PDF (DOCX, PNG, XLS, PPT, TXT e mais)" }, - "ocr": { - "title": "OCR / Limpeza de digitalizações", - "desc": "Limpa digitalizações e deteta texto de imagens dentro de um PDF e readiciona-o como texto." - }, - "extractImages": { - "title": "Extrair Imagens", - "desc": "Extrai todas as imagens de um PDF e guarda-as num zip" - }, "pdfToPDFA": { "title": "PDF para PDF/A", "desc": "Converter PDF para PDF/A para armazenamento a longo prazo" @@ -435,70 +826,14 @@ "title": "Detetar/Dividir fotos digitalizadas", "desc": "Divide múltiplas fotos de dentro de uma foto/PDF" }, - "sign": { - "title": "Assinar", - "desc": "Adiciona assinatura ao PDF por desenho, texto ou imagem" - }, - "flatten": { - "title": "Achatar", - "desc": "Remover todos os elementos interativos e formulários de um PDF" - }, - "repair": { - "title": "Reparar", - "desc": "Tenta reparar um PDF corrompido/danificado" - }, - "removeBlanks": { - "title": "Remover Páginas em Branco", - "desc": "Deteta e remove páginas em branco de um documento" - }, - "removeAnnotations": { - "title": "Remover Anotações", - "desc": "Remove todos os comentários/anotações de um PDF" - }, - "compare": { - "title": "Comparar", - "desc": "Compara e mostra as diferenças entre 2 Documentos PDF" - }, - "certSign": { - "title": "Assinar com Certificado", - "desc": "Assina um PDF com um Certificado/Chave (PEM/P12)" - }, - "removeCertSign": { - "title": "Remover Assinatura de Certificado", - "desc": "Remove assinatura de certificado do PDF" - }, - "pageLayout": { - "title": "Layout Multi-Página", - "desc": "Juntar múltiplas páginas de um documento PDF numa única página" - }, - "scalePages": { - "title": "Ajustar tamanho/escala de página", - "desc": "Alterar o tamanho/escala de uma página e/ou os seus conteúdos." - }, "pipeline": { "title": "Pipeline", "desc": "Executar múltiplas ações em PDFs definindo scripts pipeline" }, - "addPageNumbers": { - "title": "Adicionar Números de Página", - "desc": "Adicionar números de página ao longo de um documento numa localização definida" - }, "auto-rename": { "title": "Renomear Automaticamente Ficheiro PDF", "desc": "Renomeia automaticamente um ficheiro PDF baseado no cabeçalho detetado" }, - "adjustContrast": { - "title": "Ajustar Cores/Contraste", - "desc": "Ajustar Contraste, Saturação e Brilho de um PDF" - }, - "crop": { - "title": "Recortar PDF", - "desc": "Recortar um PDF para reduzir o seu tamanho (mantém o texto!)" - }, - "autoSplitPDF": { - "title": "Divisão Automática de Páginas", - "desc": "Dividir automaticamente PDF digitalizado com separador de páginas físico com Código QR" - }, "sanitizePDF": { "title": "Sanitizar", "desc": "Remover scripts e outros elementos de ficheiros PDF" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Obter TODA Informação sobre PDF", - "desc": "Obtém qualquer e toda informação possível sobre PDFs" - }, "pageExtracter": { "title": "Extrair página(s)", "desc": "Extrai páginas selecionadas do PDF" }, - "pdfToSinglePage": { - "title": "Página Única Grande", - "desc": "Junta todas as páginas do PDF numa única página grande" - }, - "showJS": { - "title": "Mostrar Javascript", - "desc": "Procura e mostra qualquer JS injetado num PDF" - }, "autoRedact": { "title": "Redação Automática", "desc": "Redação Automática (Oculta) texto num PDF baseado em texto de entrada" }, - "redact": { - "title": "Redação Manual", - "desc": "Redacta um PDF baseado em texto selecionado, formas desenhadas e/ou página(s) selecionada(s)" - }, "PDFToCSV": { "title": "PDF para CSV", "desc": "Extrai Tabelas de um PDF convertendo para CSV" @@ -551,10 +870,6 @@ "title": "Divisão Automática por Tamanho/Contagem", "desc": "Dividir um único PDF em múltiplos documentos baseado em tamanho, contagem de páginas, ou contagem de documentos" }, - "overlay-pdfs": { - "title": "Sobrepor PDFs", - "desc": "Sobrepõe PDFs em cima de outro PDF" - }, "split-by-sections": { "title": "Dividir PDF por Secções", "desc": "Divide cada página de um PDF em secções horizontais e verticais mais pequenas" @@ -563,43 +878,17 @@ "title": "Adicionar Carimbo a PDF", "desc": "Adicionar carimbos de texto ou adicionar carimbos de imagem em localizações definidas" }, - "removeImage": { - "title": "Remover imagem", - "desc": "Remover imagem do PDF para reduzir tamanho do ficheiro" - }, - "splitByChapters": { - "title": "Dividir PDF por Capítulos", - "desc": "Dividir um PDF em múltiplos ficheiros baseado na sua estrutura de capítulos." - }, - "validateSignature": { - "title": "Validar Assinatura PDF", - "desc": "Verificar assinaturas digitais e certificados em documentos PDF" - }, "replace-color": { "title": "Substituir e Inverter Cor", "desc": "Substituir cor para texto e fundo em PDF e inverter cor completa do pdf para reduzir tamanho do ficheiro" }, - "convert": { - "title": "Converter" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Extrair Páginas" - }, - "removePages": { - "title": "Remover", - "desc": "Eliminar páginas indesejadas do seu documento PDF." - }, "removeImagePdf": { "title": "Remover imagem", "desc": "Remover imagem do PDF para reduzir tamanho do ficheiro" }, - "autoSizeSplitPDF": { - "title": "Divisão Automática por Tamanho/Contagem", - "desc": "Dividir um único PDF em múltiplos documentos baseado em tamanho, contagem de páginas, ou contagem de documentos" - }, "adjust-contrast": { "title": "Ajustar Cores/Contraste", "desc": "Ajustar Contraste, Saturação e Brilho de um PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Substituir e Inverter Cor", "desc": "Substituir cor para texto e fundo em PDF e inverter cor completa do pdf para reduzir tamanho do ficheiro" - }, - "changePermissions": { - "title": "Alterar Permissões" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "ver,ler,anotar,texto,imagem", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "juntar,Operações de página,Back end,lado servidor", "title": "Juntar", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Juntar", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Nome do Ficheiro", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Juntar múltiplos PDFs (2+)", "sortByName": "Ordenar por nome", "sortByDate": "Ordenar por data", - "removeCertSign": "Remover assinatura digital no ficheiro junto?", - "submit": "Juntar", - "sortBy": { - "filename": "Nome do Ficheiro" - } + "removeCertSign": "Remover assinatura digital no ficheiro junto?" }, "split": { - "tags": "Operações de página,dividir,Multi Página,cortar,lado servidor", "title": "Dividir PDF", "header": "Dividir PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Introduza páginas para dividir:", "submit": "Dividir", "steps": { + "chooseMethod": "Choose Method", "settings": "Definições" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Tamanho do Ficheiro" + "name": "Tamanho do Ficheiro", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Tamanho do Ficheiro" + "label": "Tamanho do Ficheiro", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operações de página,dividir,Multi Página,cortar,lado servidor" }, "rotate": { - "tags": "lado servidor", "title": "Rodar PDF", + "submit": "Rodar", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "lado servidor", "header": "Rodar PDF", - "selectAngle": "Selecione ângulo de rotação (em múltiplos de 90 graus):", - "submit": "Rodar" + "selectAngle": "Selecione ângulo de rotação (em múltiplos de 90 graus):" + }, + "convert": { + "title": "Converter", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Definições", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Cor", + "greyscale": "Escala de Cinza", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Preencher Página", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "O PDF contém uma assinatura digital. Esta será removida no próximo passo.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Escala de Cinza", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversão,img,jpg,imagem,foto" @@ -727,7 +1263,33 @@ "8": "Remover Última", "9": "Remover Primeira e Última", "10": "Junção Par-Ímpar", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(ex. 1,3,2 ou 4-8,2,10-12 ou 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Adicionar imagem", "submit": "Adicionar imagem" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Texto,repetindo,etiqueta,próprio,copyright,marca registada,img,jpg,imagem,foto", "title": "Adicionar Marca de Água", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Adicionar Marca de Água", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Texto", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Tamanho da Fonte", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Texto", + "2": "Imagem" + }, + "tags": "Texto,repetindo,etiqueta,próprio,copyright,marca registada,img,jpg,imagem,foto", "header": "Adicionar Marca de Água", "customColor": "Cor de Texto Personalizada", "selectText": { @@ -755,17 +1506,6 @@ "8": "Tipo de Marca de Água:", "9": "Imagem da Marca de Água:", "10": "Converter PDF para PDF-Imagem" - }, - "submit": "Adicionar Marca de Água", - "type": { - "1": "Texto", - "2": "Imagem" - }, - "watermarkType": { - "text": "Texto" - }, - "settings": { - "fontSize": "Tamanho da Fonte" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Remover páginas,eliminar páginas", "title": "Remover", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Remover" }, - "addPassword": { - "tags": "seguro,segurança", - "title": "Adicionar Palavra-passe", - "header": "Adicionar palavra-passe (Encriptar)", - "selectText": { - "1": "Selecione PDF para encriptar", - "2": "Palavra-passe de Utilizador", - "3": "Comprimento da Chave de Encriptação", - "4": "Valores mais altos são mais fortes, mas valores mais baixos têm melhor compatibilidade.", - "5": "Permissões a definir (Recomendado usar junto com palavra-passe de Proprietário)", - "6": "Impedir montagem do documento", - "7": "Impedir extração de conteúdo", - "8": "Impedir extração para acessibilidade", - "9": "Impedir preenchimento de formulário", - "10": "Impedir modificação", - "11": "Impedir modificação de anotação", - "12": "Impedir impressão", - "13": "Impedir impressão em diferentes formatos", - "14": "Palavra-passe de Proprietário", - "15": "Restringe o que pode ser feito com o documento uma vez aberto (Não suportado por todos os leitores)", - "16": "Restringe a abertura do próprio documento" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Encriptar", "tooltip": { - "permissions": { - "title": "Alterar Permissões" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "seguro,Desencriptar,segurança,sem palavra-passe,eliminar palavra-passe", - "title": "Remover palavra-passe", - "header": "Remover palavra-passe (Desencriptar)", - "selectText": { - "1": "Selecione PDF para Desencriptar", - "2": "Palavra-passe" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Remover", - "desc": "Remover proteção por palavra-passe do seu documento PDF.", - "password": { - "stepTitle": "Remover Palavra-passe", - "label": "Palavra-passe Atual" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remover,apagar,formulário,campo,apenas leitura", "title": "Desbloquear Formulários do PDF", "header": "Desbloquear Formulários do PDF", - "submit": "Remover" + "submit": "Remover", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Título,autor,data,criação,tempo,editor,produtor,estatísticas", - "title": "Título:", "header": "Alterar Metadados", + "submit": "Alterar", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Título,autor,data,criação,tempo,editor,produtor,estatísticas", "selectText": { "1": "Por favor edite as variáveis que deseja alterar", "2": "Eliminar todos os metadados", @@ -856,15 +1877,7 @@ "4": "Outros Metadados:", "5": "Adicionar Entrada de Metadados Personalizada" }, - "author": "Autor:", - "creationDate": "Data de Criação (aaaa/MM/dd HH:mm:ss):", - "creator": "Criador:", - "keywords": "Palavras-chave:", - "modDate": "Data de Modificação (aaaa/MM/dd HH:mm:ss):", - "producer": "Produtor:", - "subject": "Assunto:", - "trapped": "Capturado:", - "submit": "Alterar" + "modDate": "Data de Modificação (aaaa/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformação,formato,documento,imagem,slide,texto,conversão,escritório,docs,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "reconhecimento,texto,imagem,digitalização,ler,identificar,deteção,editável", "title": "OCR / Limpeza de digitalizações", + "desc": "Limpa digitalizações e deteta texto de imagens dentro de um PDF e readiciona-o como texto.", "header": "Limpeza de Digitalizações / OCR (Reconhecimento Ótico de Caracteres)", "selectText": { "1": "Selecione idiomas que devem ser detetados dentro do PDF (Os listados são os atualmente detetados):", @@ -896,23 +1910,89 @@ "help": "Por favor leia esta documentação sobre como usar isto para outros idiomas e/ou usar fora do docker", "credit": "Este serviço usa qpdf e Tesseract para OCR.", "submit": "Processar PDF com OCR", - "desc": "Limpa digitalizações e deteta texto de imagens dentro de um PDF e readiciona-o como texto.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Definições", "ocrMode": { - "label": "Modo OCR" + "label": "Modo OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Idiomas" + "label": "Idiomas", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Modo OCR" + "title": "Modo OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Idiomas" + "title": "Idiomas", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Extrair Imagens", "selectText": "Selecione formato de imagem para converter imagens extraídas", "allowDuplicates": "Guardar imagens duplicadas", - "submit": "Extrair" + "submit": "Extrair", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arquivo,longo prazo,padrão,conversão,armazenamento,preservação", @@ -993,17 +2079,53 @@ }, "info": "Python não está instalado. É necessário para executar." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autorizar,iniciais,assinatura-desenhada,assinatura-texto,assinatura-imagem", "title": "Assinar", "header": "Assinar PDFs", "upload": "Carregar Imagem", - "draw": "Desenhar Assinatura", - "text": "Entrada de Texto", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Limpar", "add": "Adicionar", "saved": "Assinaturas Guardadas", "save": "Guardar Assinatura", + "applySignatures": "Apply Signatures", "personalSigs": "Assinaturas Pessoais", "sharedSigs": "Assinaturas Partilhadas", "noSavedSigs": "Nenhuma assinatura guardada encontrada", @@ -1015,42 +2137,179 @@ "previous": "Página anterior", "maintainRatio": "Alternar manter proporção", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autorizar,iniciais,assinatura-desenhada,assinatura-texto,assinatura-imagem" }, "flatten": { - "tags": "estático,desativar,não-interativo,otimizar", "title": "Achatar", "header": "Achatar PDFs", "flattenOnlyForms": "Achatar apenas formulários", "submit": "Achatar", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Definições" }, "options": { - "flattenOnlyForms": "Achatar apenas formulários" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Achatar apenas formulários", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "estático,desativar,não-interativo,otimizar" }, "repair": { "tags": "corrigir,restaurar,correção,recuperar", "title": "Reparar", "header": "Reparar PDFs", - "submit": "Reparar" + "submit": "Reparar", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "limpeza,otimizar,sem-conteúdo,organizar", "title": "Remover Páginas em Branco", "header": "Remover Páginas em Branco", - "threshold": "Limiar de Brancura de Pixel:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Remover Páginas em Branco", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "limpeza,otimizar,sem-conteúdo,organizar", "thresholdDesc": "Limiar para determinar quão branco um pixel branco deve ser para ser classificado como 'Branco'. 0 = Preto, 255 branco puro.", - "whitePercent": "Percentagem de Branco (%):", - "whitePercentDesc": "Percentagem da página que deve ser pixels 'brancos' para ser removida", - "submit": "Remover Páginas em Branco" + "whitePercentDesc": "Percentagem da página que deve ser pixels 'brancos' para ser removida" }, "removeAnnotations": { "tags": "comentários,destaque,notas,marcação,remover", "title": "Remover Anotações", "header": "Remover Anotações", - "submit": "Remover" + "submit": "Remover", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "diferenciar,contrastar,alterações,análise", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "autenticar,PEM,P12,oficial,encriptar", "title": "Assinatura de Certificado", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Localização", + "logoTitle": "Logo", + "name": "Nome", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Introduza a Sua Palavra-passe de Keystore ou Chave Privada (Se Existir):", + "passwordOptional": "Leave empty if no password", + "reason": "Razão", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Mostrar Logo", "header": "Assinar um PDF com o seu certificado (Trabalho em progresso)", "selectPDF": "Selecione um Ficheiro PDF para Assinar:", "jksNote": "Nota: Se o seu tipo de certificado não estiver listado abaixo, por favor converta-o para um ficheiro Java Keystore (.jks) usando a ferramenta de linha de comando keytool. Depois, escolha a opção de ficheiro .jks abaixo.", @@ -1089,13 +2484,7 @@ "selectCert": "Selecione o Seu Ficheiro de Certificado (formato X.509, pode ser .pem ou .der):", "selectP12": "Selecione o Seu Ficheiro Keystore PKCS#12 (.p12 ou .pfx) (Opcional, Se fornecido, deve conter a sua chave privada e certificado):", "selectJKS": "Selecione o Seu Ficheiro Java Keystore (.jks ou .keystore):", - "certType": "Tipo de Certificado", - "password": "Introduza a Sua Palavra-passe de Keystore ou Chave Privada (Se Existir):", "showSig": "Mostrar Assinatura", - "reason": "Razão", - "location": "Localização", - "name": "Nome", - "showLogo": "Mostrar Logo", "submit": "Assinar PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Remover Assinatura de Certificado", "header": "Remover o certificado digital do PDF", "selectPDF": "Selecione um ficheiro PDF:", - "submit": "Remover Assinatura" + "submit": "Remover Assinatura", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "juntar,composto,vista-única,organizar", @@ -1111,16 +2511,157 @@ "header": "Layout Multi-Página", "pagesPerSheet": "Páginas por folha:", "addBorder": "Adicionar Bordas", - "submit": "Submeter" + "submit": "Submeter", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "redimensionar,modificar,dimensão,adaptar", "title": "Ajustar escala de página", "header": "Ajustar escala de página", "pageSize": "Tamanho de uma página do documento.", "keepPageSize": "Tamanho Original", "scaleFactor": "Nível de zoom (recorte) de uma página.", - "submit": "Submeter" + "submit": "Submeter", + "tags": "redimensionar,modificar,dimensão,adaptar" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginar,etiqueta,organizar,índice" @@ -1129,16 +2670,83 @@ "tags": "auto-deteção,baseado-cabeçalho,organizar,reetiquetar", "title": "Renomear Automático", "header": "Renomear PDF Automaticamente", - "submit": "Renomear Automático" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Renomear Automático", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "correção-cor,afinar,modificar,melhorar" }, "crop": { - "tags": "aparar,encolher,editar,forma", "title": "Recortar", "header": "Recortar PDF", - "submit": "Submeter" + "submit": "Submeter", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "aparar,encolher,editar,forma" }, "autoSplitPDF": { "tags": "baseado-QR,separar,segmento-digitalização,organizar", @@ -1221,24 +2829,124 @@ "downloadJS": "Transferir Javascript", "submit": "Mostrar" }, - "autoRedact": { - "tags": "Redação,Ocultar,ocultar,preto,marcador,oculto", - "title": "Redação Automática", - "header": "Redação Automática", - "colorLabel": "Cor", - "textsToRedactLabel": "Texto a redactar (separado por linhas)", - "textsToRedactPlaceholder": "ex. \\nConfidencial \\nTop-Secret", - "useRegexLabel": "Usar Regex", - "wholeWordSearchLabel": "Pesquisa de Palavra Completa", - "customPaddingLabel": "Preenchimento Extra Personalizado", - "convertPDFToImageLabel": "Converter PDF para PDF-Imagem (Usado para remover texto por trás da caixa)", - "submitButton": "Submeter" - }, "redact": { "tags": "Redação,Ocultar,ocultar,preto,marcador,oculto,manual", "title": "Redação Manual", - "header": "Redação Manual", "submit": "Redactar", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Avançado" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Adicionar", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Páginas", + "placeholder": "(ex. 1,2,8 ou 4,7,12-16 ou 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Exportar", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Redação Manual", "textBasedRedaction": "Redação baseada em Texto", "pageBasedRedaction": "Redação baseada em Página", "convertPDFToImageLabel": "Converter PDF para PDF-Imagem (Usado para remover texto por trás da caixa)", @@ -1264,22 +2972,7 @@ "showLayers": "Mostrar Camadas (duplo clique para repor todas as camadas para o estado predefinido)", "colourPicker": "Seletor de Cor", "findCurrentOutlineItem": "Encontrar item atual do esquema", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Avançado" - }, - "wordsToRedact": { - "add": "Adicionar" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Páginas", - "placeholder": "(ex. 1,2,8 ou 4,7,12-16 ou 2n-1)" - }, - "export": "Exportar" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Extração de Tabela,extrair,converter" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "Sobrepor", "header": "Sobrepor Ficheiros PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Selecione Ficheiro PDF Base" }, "overlayFiles": { - "label": "Selecione Ficheiros PDF de Sobreposição" + "label": "Selecione Ficheiros PDF de Sobreposição", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Selecione Modo de Sobreposição", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "Contagens de Sobreposição (para Modo de Repetição Fixa)", - "placeholder": "Introduza contagens separadas por vírgulas (ex., 2,3,1)" + "placeholder": "Introduza contagens separadas por vírgulas (ex., 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Selecione Posição de Sobreposição", "foreground": "Primeiro Plano", "background": "Plano de Fundo" }, - "submit": "Submeter" + "submit": "Submeter", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Dividir Secção, Dividir, Personalizar", @@ -1332,6 +3068,7 @@ "tags": "Carimbo, Adicionar imagem, imagem central, Marca de água, PDF, Incorporar, Personalizar", "header": "Carimbar PDF", "title": "Carimbar PDF", + "stampSetup": "Stamp Setup", "stampType": "Tipo de Carimbo", "stampText": "Texto do Carimbo", "stampImage": "Imagem do Carimbo", @@ -1344,7 +3081,19 @@ "overrideY": "Sobrepor Coordenada Y", "customMargin": "Margem Personalizada", "customColor": "Cor de Texto Personalizada", - "submit": "Submeter" + "submit": "Submeter", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Remover Imagem,operações de página,lado servidor" @@ -1362,7 +3111,8 @@ "status": { "_value": "Estado", "valid": "Válida", - "invalid": "Inválida" + "invalid": "Inválida", + "complete": "Validation complete" }, "signer": "Assinante", "date": "Data", @@ -1389,40 +3139,122 @@ "version": "Versão", "keyUsage": "Utilização da Chave", "selfSigned": "Auto-Assinado", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Informação da Assinatura", "_value": "Assinatura", "mathValid": "A assinatura é matematicamente válida MAS:" }, - "selectCustomCert": "Ficheiro de Certificado Personalizado X.509 (Opcional)" - }, - "replace-color": { - "title": "Substituir-Inverter-Cor", - "header": "Substituir-Inverter Cor PDF", - "selectText": { - "1": "Opções de Substituir ou Inverter cor", - "2": "Predefinição(Cores de alto contraste predefinidas)", - "3": "Personalizado(Cores personalizadas)", - "4": "Inversão Total(Inverter todas as cores)", - "5": "Opções de cor de alto contraste", - "6": "texto branco em fundo preto", - "7": "Texto preto em fundo branco", - "8": "Texto amarelo em fundo preto", - "9": "Texto verde em fundo preto", - "10": "Escolher cor do texto", - "11": "Escolher cor do fundo" + "selectCustomCert": "Ficheiro de Certificado Personalizado X.509 (Opcional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Substituir" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Substituir Cor,operações de página,Back end,lado servidor" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Iniciar sessão", "header": "Iniciar sessão", "signin": "Iniciar sessão", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Lembrar-me", "invalid": "Nome de utilizador ou palavra-passe inválidos.", "locked": "A sua conta foi bloqueada.", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "Já tem sessão iniciada em", "alreadyLoggedIn2": "dispositivos. Por favor termine sessão nesses dispositivos e tente novamente.", "toManySessions": "Tem demasiadas sessões ativas", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF Para Página Única", "header": "PDF Para Página Única", - "submit": "Converter Para Página Única" + "submit": "Converter Para Página Única", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Extrair Páginas", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "Ajustar Contraste", "header": "Ajustar Contraste", + "basic": "Basic Adjustments", "contrast": "Contraste:", "brightness": "Brilho:", "saturation": "Saturação:", - "download": "Transferir" + "download": "Transferir", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Comprimir", + "desc": "Compress PDFs to reduce their file size.", "header": "Comprimir PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Tamanho do Ficheiro" + }, "credit": "Este serviço usa qpdf para Compressão/Otimização de PDF.", "grayscale": { "label": "Aplicar escala de cinzentos para compressão" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1491,10 +3435,7 @@ "4": "Modo automático - Ajusta automaticamente a qualidade para obter o PDF com o tamanho exato", "5": "Tamanho esperado do PDF (ex. 25MB, 10.8MB, 25KB)" }, - "submit": "Comprimir", - "method": { - "filesize": "Tamanho do Ficheiro" - } + "submit": "Comprimir" }, "decrypt": { "passwordPrompt": "Este ficheiro está protegido por palavra-passe. Por favor introduza a palavra-passe:", @@ -1595,7 +3536,13 @@ "title": "Remover imagem", "header": "Remover imagem", "removeImage": "Remover imagem", - "submit": "Remover imagem" + "submit": "Remover imagem", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Dividir PDF por Capítulos", @@ -1629,6 +3576,12 @@ }, "note": "Notas de lançamento apenas disponíveis em Inglês" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Transferir", - "convert": { - "title": "Converter", - "settings": "Definições", - "color": "Cor", - "greyscale": "Escala de Cinza", - "fillPage": "Preencher Página", - "pdfaDigitalSignatureWarning": "O PDF contém uma assinatura digital. Esta será removida no próximo passo.", - "grayscale": "Escala de Cinza" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Selecionar Tudo", - "deselectAll": "Desselecionar Tudo" + "deselectAll": "Desselecionar Tudo", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Assinar" + "read": "Read", + "sign": "Assinar", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "A carregar...", - "or": "ou" + "or": "ou", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Nome", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Versão", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Selecionar Tudo", "deselectAll": "Desselecionar Tudo", "deleteSelected": "Eliminar Selecionadas", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Transferir", - "delete": "Eliminar" + "delete": "Eliminar", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Sanitizar PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Definições" + "files": "Files", + "settings": "Definições", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Adicionar Palavra-passe", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Encriptar", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Alterar Permissões", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "seguro,segurança", + "header": "Adicionar palavra-passe (Encriptar)", + "selectText": { + "1": "Selecione PDF para encriptar", + "2": "Palavra-passe de Utilizador", + "3": "Comprimento da Chave de Encriptação", + "4": "Valores mais altos são mais fortes, mas valores mais baixos têm melhor compatibilidade.", + "5": "Permissões a definir (Recomendado usar junto com palavra-passe de Proprietário)", + "6": "Impedir montagem do documento", + "7": "Impedir extração de conteúdo", + "8": "Impedir extração para acessibilidade", + "9": "Impedir preenchimento de formulário", + "10": "Impedir modificação", + "11": "Impedir modificação de anotação", + "12": "Impedir impressão", + "13": "Impedir impressão em diferentes formatos", + "14": "Palavra-passe de Proprietário", + "15": "Restringe o que pode ser feito com o documento uma vez aberto (Não suportado por todos os leitores)", + "16": "Restringe a abertura do próprio documento" } }, "changePermissions": { "title": "Alterar Permissões", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Alterar Permissões", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Impedir montagem do documento" @@ -1737,10 +4580,784 @@ "label": "Impedir impressão em diferentes formatos" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Alterar Permissões" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Remover palavra-passe", + "desc": "Remover proteção por palavra-passe do seu documento PDF.", + "tags": "seguro,Desencriptar,segurança,sem palavra-passe,eliminar palavra-passe", + "password": { + "stepTitle": "Remover Palavra-passe", + "label": "Palavra-passe Atual", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Remover", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Remover palavra-passe (Desencriptar)", + "selectText": { + "1": "Selecione PDF para Desencriptar", + "2": "Palavra-passe" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Opções de Substituir ou Inverter cor", + "2": "Predefinição(Cores de alto contraste predefinidas)", + "3": "Personalizado(Cores personalizadas)", + "4": "Inversão Total(Inverter todas as cores)", + "5": "Opções de cor de alto contraste", + "6": "texto branco em fundo preto", + "7": "Texto preto em fundo branco", + "8": "Texto amarelo em fundo preto", + "9": "Texto verde em fundo preto", + "10": "Escolher cor do texto", + "11": "Escolher cor do fundo", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Substituir", + "title": "Substituir-Inverter-Cor", + "header": "Substituir-Inverter Cor PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Redação,Ocultar,ocultar,preto,marcador,oculto", + "title": "Redação Automática", + "header": "Redação Automática", + "colorLabel": "Cor", + "textsToRedactLabel": "Texto a redactar (separado por linhas)", + "textsToRedactPlaceholder": "ex. \\nConfidencial \\nTop-Secret", + "useRegexLabel": "Usar Regex", + "wholeWordSearchLabel": "Pesquisa de Palavra Completa", + "customPaddingLabel": "Preenchimento Extra Personalizado", + "convertPDFToImageLabel": "Converter PDF para PDF-Imagem (Usado para remover texto por trás da caixa)", + "submitButton": "Submeter" + }, + "replaceColorPdf": { + "tags": "Substituir Cor,operações de página,Back end,lado servidor" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/ro-RO/translation.json b/frontend/public/locales/ro-RO/translation.json index d2668c18d..8949a7be1 100644 --- a/frontend/public/locales/ro-RO/translation.json +++ b/frontend/public/locales/ro-RO/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Text Personalizat", "numberPagesDesc": "Ce pagini să numeroteze, implicit 'toate', acceptă și 1-5 sau 2,5,9 etc", "customNumberDesc": "Implicit la {n}, acceptă și 'Pagina {n} din {total}', 'Text-{n}', '{nume_fisier}-{n}", - "submit": "Adaugă Numere de Pagină" + "submit": "Adaugă Numere de Pagină", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Selecție Personalizată de Pagini (Introduceți o listă separată prin virgule a numerelor de pagini 1,5,6 sau funcții precum 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Selectează fișiere PDF", "multiPdfPrompt": "Selectează mai multe fișiere PDF (2+)", "multiPdfDropPrompt": "Selectează (sau trage și plasează) toate fișierele PDF de care ai nevoie", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Avertisment: Acest proces poate dura până la un minut în funcție de dimensiunea fișierului", "pageOrderPrompt": "Ordinea paginilor (Introdu o listă separată prin virgulă de numere de pagină):", - "pageSelectionPrompt": "Selecție Personalizată de Pagini (Introduceți o listă separată prin virgule a numerelor de pagini 1,5,6 sau funcții precum 2n+1) :", "goToPage": "Mergi la pagină", "true": "Adevărat", "false": "Fals", "unknown": "Necunoscut", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Salvează", "saveToBrowser": "Salvează în Browser", + "download": "Descarcă", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Închide", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "fișiere selectate", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Niciun favorit adăugat", "downloadComplete": "Descărcare Completă", "bored": "Plictisit așteptând?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "Documentul PDF este protejat cu parolă și fie parola nu a fost furnizată, fie a fost incorectă", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Eroare", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Ne pare rău pentru problemă!", "needHelp": "Ai nevoie de ajutor / Ai găsit o problemă?", "contactTip": "Dacă întâmpini în continuare dificultăți, nu ezita să ne contactezi pentru ajutor. Poți deschide un tichet pe pagina noastră GitHub sau ne poți contacta prin Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Deschide un tichet", "discordSubmit": "Discord - Trimite o postare de Suport" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Șterge", "username": "Nume de utilizator", "password": "Parolă", @@ -82,6 +169,7 @@ "green": "Verde", "blue": "Albastru", "custom": "Personalizat...", + "comingSoon": "Coming soon", "WorkInProgess": "Lucru în curs, S-ar putea să nu funcționeze sau să aibă erori, Vă rugăm să raportați orice probleme!", "poweredBy": "Propulsat de", "yes": "Da", @@ -115,12 +203,14 @@ "page": "Page", "pages": "Pages", "loading": "Loading...", + "review": "Review", "addToDoc": "Add to Document", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Privacy Policy", + "iAgreeToThe": "I agree to all of the", "terms": "Terms and Conditions", "accessibility": "Accessibility", "cookie": "Cookie Policy", @@ -160,6 +250,7 @@ "title": "Do you want make Stirling PDF better?", "paragraph1": "Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.", "paragraph2": "Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.", + "learnMore": "Learn more", "enable": "Enable analytics", "disable": "Disable analytics", "settings": "You can change the settings for analytics in the config/settings.yml file" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Salvează intrările formularului", "help": "Activează pentru a stoca intrările utilizate anterior pentru rulări viitoare" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Import/Export Bază de Date", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Instrument multiplu PDF", "desc": "Unifică, rotește, rearanjează și elimină pagini" }, "merge": { + "tags": "combine,join,unite", "title": "Unifică", "desc": "Unifică cu ușurință mai multe fișiere PDF într-unul singur." }, "split": { + "tags": "divide,separate,break", "title": "Desparte", "desc": "Desparte fișierele PDF în mai multe documente." }, "rotate": { + "tags": "turn,flip,orient", "title": "Rotește", "desc": "Rotește cu ușurință fișierele PDF." }, + "convert": { + "tags": "transform,change", + "title": "Convertește", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organizează", + "desc": "Elimină/rearanjează pagini în orice ordine" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Adaugă imagine", + "desc": "Adaugă o imagine într-o locație specifică pe PDF (în curs de dezvoltare)" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Adaugă Filigran", + "desc": "Adaugă un filigran personalizat la documentul PDF." + }, + "removePassword": { + "tags": "unlock", + "title": "Elimină Parola", + "desc": "Elimină protecția cu parolă din documentul PDF." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Comprimă", + "desc": "Comprimă fișierele PDF pentru a reduce dimensiunea lor." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Schimbă Metadatele", + "desc": "Schimbă/Elimină/Adaugă metadate într-un document PDF." + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Curățare scanări", + "desc": "Curăță scanările și detectează textul din imaginile dintr-un PDF și îl adaugă ca text." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Extrage Imagini", + "desc": "Extrage toate imaginile dintr-un PDF și le salvează într-un fișier zip." + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Semnează", + "desc": "Adaugă o semnătură la documentul PDF prin desenare, text sau imagine." + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Nivelare", + "desc": "Elimină toate elementele interactive și formularele dintr-un PDF." + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Semnare cu certificat", + "desc": "Semnează un PDF cu un certificat/cheie (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Repară", + "desc": "Încearcă să repare un document PDF corupt/defect." + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Elimină pagini goale", + "desc": "Detectează și elimină paginile goale dintr-un document." + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Elimină Adnotările", + "desc": "Elimină toate comentariile/adnotările dintr-un PDF" + }, + "compare": { + "tags": "difference", + "title": "Compară", + "desc": "Compară și arată diferențele dintre 2 documente PDF." + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Elimină Semnătura cu Certificat", + "desc": "Elimină semnătura cu certificat din PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Aspect Multi-Pagină", + "desc": "Îmbină mai multe pagini ale unui document PDF într-o singură pagină" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Ajustează dimensiunea/scala paginii", + "desc": "Modifică dimensiunea/scala paginii și/sau a conținutului său." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Adaugă Numere de Pagină", + "desc": "Adaugă numere de pagină în tot documentul într-o locație setată" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Ajustează Culorile/Contrastul", + "desc": "Ajustează Contrastul, Saturația și Luminozitatea unui PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Decupează PDF", + "desc": "Decupează un PDF pentru a-i reduce dimensiunea (menține textul!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Desparte Automat Paginile", + "desc": "Desparte Automat PDF-ul Scanat cu separator fizic de pagini scanate cu Cod QR" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Obține TOATE Informațiile despre PDF", + "desc": "Extrage orice și toate informațiile posibile despre PDF-uri" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF într-o Singură Pagină Mare", + "desc": "Îmbină toate paginile PDF într-o singură pagină mare" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Arată Javascript", + "desc": "Caută și afișează orice JS injectat într-un PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Elimină imagine", + "desc": "Elimină imaginea din PDF pentru a reduce dimensiunea fișierului" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Split PDF by Chapters", + "desc": "Split a PDF into multiple files based on its chapter structure." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extrage Pagini", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Elimină", + "desc": "Șterge paginile nedorite din documentul PDF." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Despărțire Automată după Dimensiune/Număr", + "desc": "Împarte un singur PDF în mai multe documente bazat pe dimensiune, număr de pagini sau număr de documente" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Adaugă Parolă", + "desc": "Criptează documentul PDF cu o parolă." + }, + "changePermissions": { + "title": "Schimbă Permisiunile", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Suprapune PDF-uri peste alt PDF", + "title": "Suprapune PDF-uri" + }, "imageToPDF": { "title": "Imagine în PDF", "desc": "Convertește o imagine (PNG, JPEG, GIF) în PDF." @@ -355,18 +786,6 @@ "title": "PDF în Imagine", "desc": "Convertește un fișier PDF în imagine (PNG, JPEG, GIF)." }, - "pdfOrganiser": { - "title": "Organizează", - "desc": "Elimină/rearanjează pagini în orice ordine" - }, - "addImage": { - "title": "Adaugă imagine", - "desc": "Adaugă o imagine într-o locație specifică pe PDF (în curs de dezvoltare)" - }, - "watermark": { - "title": "Adaugă Filigran", - "desc": "Adaugă un filigran personalizat la documentul PDF." - }, "permissions": { "title": "Schimbă permisiuni", "desc": "Schimbă permisiunile documentului PDF" @@ -375,38 +794,10 @@ "title": "Elimină", "desc": "Șterge paginile nedorite din documentul PDF." }, - "addPassword": { - "title": "Adaugă Parolă", - "desc": "Criptează documentul PDF cu o parolă." - }, - "removePassword": { - "title": "Elimină Parola", - "desc": "Elimină protecția cu parolă din documentul PDF." - }, - "compress": { - "title": "Comprimă", - "desc": "Comprimă fișierele PDF pentru a reduce dimensiunea lor." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Schimbă Metadatele", - "desc": "Schimbă/Elimină/Adaugă metadate într-un document PDF." - }, "fileToPDF": { "title": "Convertește fișierul în PDF", "desc": "Convertește aproape orice fișier în format PDF (DOCX, PNG, XLS, PPT, TXT și altele)." }, - "ocr": { - "title": "OCR / Curățare scanări", - "desc": "Curăță scanările și detectează textul din imaginile dintr-un PDF și îl adaugă ca text." - }, - "extractImages": { - "title": "Extrage Imagini", - "desc": "Extrage toate imaginile dintr-un PDF și le salvează într-un fișier zip." - }, "pdfToPDFA": { "title": "PDF în PDF/A", "desc": "Convertește un document PDF în format PDF/A pentru stocare pe termen lung." @@ -435,70 +826,14 @@ "title": "Detectează/Împarte poze scanate", "desc": "Împarte mai multe poze dintr-o poză/PDF." }, - "sign": { - "title": "Semnează", - "desc": "Adaugă o semnătură la documentul PDF prin desenare, text sau imagine." - }, - "flatten": { - "title": "Nivelare", - "desc": "Elimină toate elementele interactive și formularele dintr-un PDF." - }, - "repair": { - "title": "Repară", - "desc": "Încearcă să repare un document PDF corupt/defect." - }, - "removeBlanks": { - "title": "Elimină pagini goale", - "desc": "Detectează și elimină paginile goale dintr-un document." - }, - "removeAnnotations": { - "title": "Elimină Adnotările", - "desc": "Elimină toate comentariile/adnotările dintr-un PDF" - }, - "compare": { - "title": "Compară", - "desc": "Compară și arată diferențele dintre 2 documente PDF." - }, - "certSign": { - "title": "Semnare cu certificat", - "desc": "Semnează un PDF cu un certificat/cheie (PEM/P12)" - }, - "removeCertSign": { - "title": "Elimină Semnătura cu Certificat", - "desc": "Elimină semnătura cu certificat din PDF" - }, - "pageLayout": { - "title": "Aspect Multi-Pagină", - "desc": "Îmbină mai multe pagini ale unui document PDF într-o singură pagină" - }, - "scalePages": { - "title": "Ajustează dimensiunea/scala paginii", - "desc": "Modifică dimensiunea/scala paginii și/sau a conținutului său." - }, "pipeline": { "title": "Pipeline (Avansat)", "desc": "Rulează multiple acțiuni pe PDF-uri definind scripturi pipeline" }, - "addPageNumbers": { - "title": "Adaugă Numere de Pagină", - "desc": "Adaugă numere de pagină în tot documentul într-o locație setată" - }, "auto-rename": { "title": "Redenumire Automată Fișier PDF", "desc": "Redenumește automat un fișier PDF bazat pe antetul detectat" }, - "adjustContrast": { - "title": "Ajustează Culorile/Contrastul", - "desc": "Ajustează Contrastul, Saturația și Luminozitatea unui PDF" - }, - "crop": { - "title": "Decupează PDF", - "desc": "Decupează un PDF pentru a-i reduce dimensiunea (menține textul!)" - }, - "autoSplitPDF": { - "title": "Desparte Automat Paginile", - "desc": "Desparte Automat PDF-ul Scanat cu separator fizic de pagini scanate cu Cod QR" - }, "sanitizePDF": { "title": "Igienizează", "desc": "Elimină scripturile și alte elemente din fișierele PDF" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Obține TOATE Informațiile despre PDF", - "desc": "Extrage orice și toate informațiile posibile despre PDF-uri" - }, "pageExtracter": { "title": "Extrage pagină(i)", "desc": "Extrage paginile selectate din PDF" }, - "pdfToSinglePage": { - "title": "PDF într-o Singură Pagină Mare", - "desc": "Îmbină toate paginile PDF într-o singură pagină mare" - }, - "showJS": { - "title": "Arată Javascript", - "desc": "Caută și afișează orice JS injectat într-un PDF" - }, "autoRedact": { "title": "Redactare Automată", "desc": "Redactează automat (înnegrește) text într-un PDF bazat pe textul de intrare" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF în CSV", "desc": "Extrage Tabelele dintr-un PDF convertindu-l în CSV" @@ -551,10 +870,6 @@ "title": "Despărțire Automată după Dimensiune/Număr", "desc": "Împarte un singur PDF în mai multe documente bazat pe dimensiune, număr de pagini sau număr de documente" }, - "overlay-pdfs": { - "title": "Suprapune PDF-uri", - "desc": "Suprapune PDF-uri peste alt PDF" - }, "split-by-sections": { "title": "Împarte PDF pe Secțiuni", "desc": "Împarte fiecare pagină a unui PDF în secțiuni mai mici orizontale și verticale" @@ -563,43 +878,17 @@ "title": "Adaugă Ștampilă la PDF", "desc": "Adaugă text sau adaugă ștampile imagine în locații setate" }, - "removeImage": { - "title": "Elimină imagine", - "desc": "Elimină imaginea din PDF pentru a reduce dimensiunea fișierului" - }, - "splitByChapters": { - "title": "Split PDF by Chapters", - "desc": "Split a PDF into multiple files based on its chapter structure." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" }, - "convert": { - "title": "Convertește" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Extrage Pagini" - }, - "removePages": { - "title": "Elimină", - "desc": "Șterge paginile nedorite din documentul PDF." - }, "removeImagePdf": { "title": "Elimină imagine", "desc": "Elimină imaginea din PDF pentru a reduce dimensiunea fișierului" }, - "autoSizeSplitPDF": { - "title": "Despărțire Automată după Dimensiune/Număr", - "desc": "Împarte un singur PDF în mai multe documente bazat pe dimensiune, număr de pagini sau număr de documente" - }, "adjust-contrast": { "title": "Ajustează Culorile/Contrastul", "desc": "Ajustează Contrastul, Saturația și Luminozitatea unui PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" - }, - "changePermissions": { - "title": "Schimbă Permisiunile" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "vizualizare,citește,adnotează,text,imagine", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "unificare,Operații pagină,Back end,server side", "title": "Unire", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Unire", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Nume Fișier", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Unirea mai multor PDF-uri (2+)", "sortByName": "Sortează după nume", "sortByDate": "Sortează după dată", - "removeCertSign": "Elimină semnătura digitală în fișierul unificat?", - "submit": "Unire", - "sortBy": { - "filename": "Nume Fișier" - } + "removeCertSign": "Elimină semnătura digitală în fișierul unificat?" }, "split": { - "tags": "Operații pagină,divizare,Pagină Multiplă,tăiere,server side", "title": "Împarte PDF", "header": "Împarte PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Introduceți paginile pe care să le împărțiți:", "submit": "Împarte", "steps": { + "chooseMethod": "Choose Method", "settings": "Setări" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Dimensiune Fișier" + "name": "Dimensiune Fișier", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Dimensiune Fișier" + "label": "Dimensiune Fișier", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operații pagină,divizare,Pagină Multiplă,tăiere,server side" }, "rotate": { - "tags": "server side", "title": "Rotește PDF", + "submit": "Rotește", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "server side", "header": "Rotește PDF", - "selectAngle": "Selectați un unghi de rotație (în multiplicate de 90 de grade):", - "submit": "Rotește" + "selectAngle": "Selectați un unghi de rotație (în multiplicate de 90 de grade):" + }, + "convert": { + "title": "Convertește", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Setări", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Culoare", + "greyscale": "Scală de gri", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Umple Pagina", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF-ul conține o semnătură digitală. Aceasta va fi eliminată în pasul următor.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Scală de gri", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversie,img,jpg,poză,fotografie" @@ -727,7 +1263,33 @@ "8": "Elimină Ultima", "9": "Elimină Prima și Ultima", "10": "Îmbinare Impar-Par", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(ex. 1,3,2 sau 4-8,2,10-12 sau 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Adăugare imagine", "submit": "Adăugare imagine" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Text,repetitiv,etichetă,propriu,drepturi de autor,marcă comercială,img,jpg,poză,fotografie", "title": "Adaugă Filigran", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Adaugă Filigran", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Text", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Dimensiune Font", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Text", + "2": "Imagine" + }, + "tags": "Text,repetitiv,etichetă,propriu,drepturi de autor,marcă comercială,img,jpg,poză,fotografie", "header": "Adaugă Filigran", "customColor": "Culoare Text Personalizată", "selectText": { @@ -755,14 +1506,6 @@ "8": "Tip Filigran:", "9": "Imagine Filigran:", "10": "Convertește PDF în PDF-Imagine" - }, - "submit": "Adaugă Filigran", - "type": { - "1": "Text", - "2": "Imagine" - }, - "settings": { - "fontSize": "Dimensiune Font" } }, "permissions": { @@ -787,50 +1530,201 @@ "removePages": { "tags": "Elimină pagini,șterge pagini", "title": "Elimină", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Elimină" }, - "addPassword": { - "tags": "securizează,securitate", - "title": "Adaugă parolă", - "header": "Adaugă o parolă (Criptare)", - "selectText": { - "1": "Selectează PDF-ul pentru criptare", - "2": "Parolă", - "3": "Lungime cheie de criptare", - "4": "Valori mai mari sunt mai puternice, dar valorile mai mici au o compatibilitate mai bună.", - "5": "Permisiuni de setare", - "6": "Previne asamblarea documentului", - "7": "Previne extragerea conținutului", - "8": "Previne extragerea pentru accesibilitate", - "9": "Previne completarea formularului", - "10": "Previne modificarea", - "11": "Previne modificarea adnotărilor", - "12": "Previne tipărirea", - "13": "Previne tipărirea în formate diferite", - "14": "Parolă Proprietar", - "15": "Restricționează ce se poate face cu documentul odată ce este deschis (Nu este suportat de toate programele de citire)", - "16": "Restricționează deschiderea documentului în sine" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Criptează", "tooltip": { - "permissions": { - "title": "Schimbă Permisiunile" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "securizează,Decriptează,securitate,elimină parola,șterge parola", - "title": "Elimină parola", - "header": "Elimină parola (Decodifică)", - "selectText": { - "1": "Selectează PDF-ul pentru decodificare", - "2": "Parolă" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Elimină", - "desc": "Elimină protecția cu parolă din documentul PDF.", - "password": { - "stepTitle": "Elimină Parola", - "label": "Parola Curentă" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -840,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Titlu,autor,dată,creare,timp,editor", - "title": "Titlu:", "header": "Schimbă Metadatele", + "submit": "Schimbă", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Titlu,autor,dată,creare,timp,editor", "selectText": { "1": "Te rugăm să editezi variabilele pe care dorești să le schimbi", "2": "Șterge toate metadatele", @@ -853,15 +1877,7 @@ "4": "Alte Metadate:", "5": "Adaugă Intrare Metadate Personalizate" }, - "author": "Autor:", - "creationDate": "Data creării (aaaa/LL/zz OO:mm:ss):", - "creator": "Creator:", - "keywords": "Cuvinte cheie:", - "modDate": "Data modificării (aaaa/LL/zz OO:mm:ss):", - "producer": "Producător:", - "subject": "Subiect:", - "trapped": "Blocat:", - "submit": "Schimbă" + "modDate": "Data modificării (aaaa/LL/zz OO:mm:ss):" }, "fileToPDF": { "tags": "transformare,format,document,poză,diapozitiv,text,conversie,office,docs,word,excel,powerpoint", @@ -875,6 +1891,7 @@ "ocr": { "tags": "recunoaștere,text,imagine,scanare,citește,identifică,detectare,editabil", "title": "OCR / Curățare scanare", + "desc": "Curăță scanările și detectează textul din imaginile dintr-un PDF și îl adaugă ca text.", "header": "Curățare scanări / OCR (Recunoaștere optică a caracterelor)", "selectText": { "1": "Selectați limbile care trebuie detectate în PDF (Cele listate sunt cele detectate în prezent):", @@ -893,23 +1910,89 @@ "help": "Citiți documentația pentru a afla cum să utilizați acest serviciu pentru alte limbi și/sau în afara mediului Docker", "credit": "Acest serviciu utilizează qpdf și Tesseract pentru OCR.", "submit": "Procesează PDF-ul cu OCR", - "desc": "Curăță scanările și detectează textul din imaginile dintr-un PDF și îl adaugă ca text.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Setări", "ocrMode": { - "label": "Mod OCR" + "label": "Mod OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Limbi" + "label": "Limbi", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Mod OCR" + "title": "Mod OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Limbi" + "title": "Limbi", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -918,7 +2001,13 @@ "header": "Extrage Imagini", "selectText": "Selectați formatul imaginii în care să se convertească imaginile extrase", "allowDuplicates": "Salvează imaginile duplicate", - "submit": "Extrage" + "submit": "Extrage", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arhivă,termen-lung,standard,conversie,stocare,conservare", @@ -990,17 +2079,53 @@ }, "info": "Python nu este instalat. Este necesar pentru a rula." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autorizează,inițiale,semnătură-desenată,semnătură-text,semnătură-imagine", "title": "Semnează", "header": "Semnează documente PDF", "upload": "Încarcă Imaginea", - "draw": "Desenează Semnătura", - "text": "Introdu Textul", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Curăță", "add": "Adaugă", "saved": "Saved Signatures", "save": "Save Signature", + "applySignatures": "Apply Signatures", "personalSigs": "Personal Signatures", "sharedSigs": "Shared Signatures", "noSavedSigs": "No saved signatures found", @@ -1012,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autorizează,inițiale,semnătură-desenată,semnătură-text,semnătură-imagine" }, "flatten": { - "tags": "static,dezactivează,non-interactiv,simplifică", "title": "Nivelare", "header": "Nivelează documente PDF", "flattenOnlyForms": "Nivelează doar formularele", "submit": "Nivelează", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Setări" }, "options": { - "flattenOnlyForms": "Nivelează doar formularele" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Nivelează doar formularele", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "static,dezactivează,non-interactiv,simplifică" }, "repair": { "tags": "repară,restaurează,corectare,recuperează", "title": "Repară", "header": "Repară documente PDF", - "submit": "Repară" + "submit": "Repară", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "curățare,simplificare,fără-conținut,organizează", "title": "Elimină pagini goale", "header": "Elimină pagini goale", - "threshold": "Prag:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Elimină pagini goale", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "curățare,simplificare,fără-conținut,organizează", "thresholdDesc": "Prag pentru determinarea cât de alb trebuie să fie un pixel alb", - "whitePercent": "Procent alb (%):", - "whitePercentDesc": "Procentul paginii care trebuie să fie alb pentru a fi eliminată", - "submit": "Elimină pagini goale" + "whitePercentDesc": "Procentul paginii care trebuie să fie alb pentru a fi eliminată" }, "removeAnnotations": { "tags": "comentarii,evidențiere,note,marcaje,elimină", "title": "Elimină Adnotările", "header": "Elimină Adnotările", - "submit": "Elimină" + "submit": "Elimină", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "diferențiază,contrastează,modificări,analiză", @@ -1079,6 +2341,142 @@ "certSign": { "tags": "autentifică,PEM,P12,oficial,criptează", "title": "Semnare certificat", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Locația", + "logoTitle": "Logo", + "name": "Numele", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Introdu parola pentru stocarea cheie sau cheia privată (dacă există):", + "passwordOptional": "Leave empty if no password", + "reason": "Motivul", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo", "header": "Semnează un fișier PDF cu certificatul tău (În curs de desfășurare)", "selectPDF": "Selectează un fișier PDF pentru semnare:", "jksNote": "Notă: Dacă tipul certificatului tău nu este listat mai jos, te rugăm să-l convertești într-un fișier Java Keystore (.jks) folosind instrumentul de linie de comandă keytool. Apoi, alege opțiunea fișier .jks de mai jos.", @@ -1086,13 +2484,7 @@ "selectCert": "Selectează fișierul de certificat (format X.509, poate fi .pem sau .der):", "selectP12": "Selectează fișierul de stocare cheie PKCS#12 (.p12 sau .pfx) (Opțional, dacă este furnizat, ar trebui să conțină cheia privată și certificatul tău):", "selectJKS": "Selectează Fișierul Java Keystore (.jks sau .keystore):", - "certType": "Tipul certificatului", - "password": "Introdu parola pentru stocarea cheie sau cheia privată (dacă există):", "showSig": "Afișează semnătura", - "reason": "Motivul", - "location": "Locația", - "name": "Numele", - "showLogo": "Show Logo", "submit": "Semnează PDF" }, "removeCertSign": { @@ -1100,7 +2492,18 @@ "title": "Elimină Semnătura cu Certificat", "header": "Elimină certificatul digital din PDF", "selectPDF": "Selectează un fișier PDF:", - "submit": "Elimină Semnătura" + "submit": "Elimină Semnătura", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "îmbină,compozit,vizualizare-unică,organizează", @@ -1108,16 +2511,157 @@ "header": "Aspect Multi-Pagină", "pagesPerSheet": "Pagini per foaie:", "addBorder": "Adaugă Borduri", - "submit": "Trimite" + "submit": "Trimite", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "redimensionează,modifică,dimensiune,adaptează", "title": "Ajustează scala paginii", "header": "Ajustează scala paginii", "pageSize": "Dimensiunea unei pagini a documentului.", "keepPageSize": "Original Size", "scaleFactor": "Nivel de zoom (decupare) al unei pagini.", - "submit": "Trimite" + "submit": "Trimite", + "tags": "redimensionează,modifică,dimensiune,adaptează" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginează,etichetează,organizează,indexează" @@ -1126,16 +2670,83 @@ "tags": "auto-detectare,bazat-pe-antet,organizează,reetichetează", "title": "Redenumire Automată", "header": "Redenumire Automată PDF", - "submit": "Redenumire Automată" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Redenumire Automată", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "corectare-culoare,reglează,modifică,îmbunătățește" }, "crop": { - "tags": "taie,micșorează,editează,formă", "title": "Decupează", "header": "Decupează PDF", - "submit": "Trimite" + "submit": "Trimite", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "taie,micșorează,editează,formă" }, "autoSplitPDF": { "tags": "bazat-pe-QR,separă,segment-scanat,organizează", @@ -1218,24 +2829,124 @@ "downloadJS": "Descarcă Javascript", "submit": "Arată" }, - "autoRedact": { - "tags": "Redactează,Ascunde,înnegrește,negru,marker,ascuns", - "title": "Redactare Automată", - "header": "Redactare Automată", - "colorLabel": "Culoare", - "textsToRedactLabel": "Text de Redactat (separat pe linii)", - "textsToRedactPlaceholder": "ex. \\nConfidențial \\nSecret de Serviciu", - "useRegexLabel": "Folosește Regex", - "wholeWordSearchLabel": "Căutare Cuvânt Întreg", - "customPaddingLabel": "Spațiere Suplimentară Personalizată", - "convertPDFToImageLabel": "Convertește PDF în PDF-Imagine (Folosit pentru a elimina textul din spatele casetei)", - "submitButton": "Trimite" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Avansat" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Adaugă", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pages", + "placeholder": "(ex. 1,2,8 sau 4,7,12-16 sau 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1261,20 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Avansat" - }, - "wordsToRedact": { - "add": "Adaugă" - } - }, - "manual": { - "pageRedactionNumbers": { - "placeholder": "(ex. 1,2,8 sau 4,7,12-16 sau 2n-1)" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Extragere Tabel,extrage,convertește" @@ -1285,11 +2983,15 @@ "overlay-pdfs": { "tags": "Suprapune", "header": "Suprapune Fișiere PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Selectează Fișierul PDF de Bază" }, "overlayFiles": { - "label": "Selectează Fișierele PDF de Suprapus" + "label": "Selectează Fișierele PDF de Suprapus", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Selectează Modul de Suprapunere", @@ -1299,14 +3001,53 @@ }, "counts": { "label": "Numere de Suprapunere (pentru Modul de Repetare Fixă)", - "placeholder": "Introdu numere separate prin virgulă (ex. 2,3,1)" + "placeholder": "Introdu numere separate prin virgulă (ex. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Selectează Poziția de Suprapunere", "foreground": "Prim-plan", "background": "Fundal" }, - "submit": "Trimite" + "submit": "Trimite", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Împărțire pe Secțiuni, Divizează, Personalizează", @@ -1327,6 +3068,7 @@ "tags": "Ștampilă, Adaugă imagine, centrează imagine, Filigran, PDF, Încorporează, Personalizează", "header": "Ștampilează PDF", "title": "Ștampilează PDF", + "stampSetup": "Stamp Setup", "stampType": "Tip Ștampilă", "stampText": "Text Ștampilă", "stampImage": "Imagine Ștampilă", @@ -1339,7 +3081,19 @@ "overrideY": "Suprascrie Coordonata Y", "customMargin": "Margine Personalizată", "customColor": "Culoare Text Personalizată", - "submit": "Trimite" + "submit": "Trimite", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Elimină Imagine,Operații pagină,Back end,server side" @@ -1357,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1384,40 +3139,122 @@ "version": "Versiune", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Replace-Invert Color PDF", - "selectText": { - "1": "Replace or Invert color Options", - "2": "Default(Default high contrast colors)", - "3": "Custom(Customized colors)", - "4": "Full-Invert(Invert all colors)", - "5": "High contrast color options", - "6": "white text on black background", - "7": "Black text on white background", - "8": "Yellow text on black background", - "9": "Green text on black background", - "10": "Choose text Color", - "11": "Choose background Color" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Replace" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Replace Color,Page operations,Back end,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Autentificare", "header": "Autentificare", "signin": "Autentificare", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Ține-mă minte", "invalid": "Nume de utilizator sau parolă invalidă.", "locked": "Contul tău a fost blocat.", @@ -1436,12 +3273,83 @@ "alreadyLoggedIn": "You are already logged in to", "alreadyLoggedIn2": "devices. Please log out of the devices and try again.", "toManySessions": "You have too many active sessions", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF într-o Singură Pagină", "header": "PDF într-o Singură Pagină", - "submit": "Convertește într-o Singură Pagină" + "submit": "Convertește într-o Singură Pagină", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Extrage Pagini", @@ -1465,18 +3373,59 @@ "adjustContrast": { "title": "Ajustează Contrastul", "header": "Ajustează Contrastul", + "basic": "Basic Adjustments", "contrast": "Contrast:", "brightness": "Luminozitate:", "saturation": "Saturație:", - "download": "Descarcă" + "download": "Descarcă", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Comprimare", + "desc": "Compress PDFs to reduce their file size.", "header": "Comprimare PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Dimensiune Fișier" + }, "credit": "Acest serviciu utilizează qpdf pentru comprimarea/optimizarea PDF-urilor.", "grayscale": { "label": "Aplicare scală de gri pentru compresie" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1486,10 +3435,7 @@ "4": "Mod automat - ajustează automat calitatea pentru a aduce PDF-ul la dimensiunea exactă", "5": "Dimensiunea PDF așteptată (de ex. 25MB, 10.8MB, 25KB)" }, - "submit": "Comprimare", - "method": { - "filesize": "Dimensiune Fișier" - } + "submit": "Comprimare" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1590,7 +3536,13 @@ "title": "Elimină imagine", "header": "Elimină imagine", "removeImage": "Elimină imagine", - "submit": "Elimină imagine" + "submit": "Elimină imagine", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Split PDF by Chapters", @@ -1624,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1659,42 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Descarcă", - "convert": { - "title": "Convertește", - "settings": "Setări", - "color": "Culoare", - "greyscale": "Scală de gri", - "fillPage": "Umple Pagina", - "pdfaDigitalSignatureWarning": "PDF-ul conține o semnătură digitală. Aceasta va fi eliminată în pasul următor.", - "grayscale": "Scală de gri" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Semnează" + "read": "Read", + "sign": "Semnează", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, + "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Loading...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Numele", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Versiune", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Descarcă", - "delete": "Șterge" + "delete": "Șterge", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Igienizează PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Setări" + "files": "Files", + "settings": "Setări", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Adaugă parolă", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Criptează", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Schimbă Permisiunile", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "securizează,securitate", + "header": "Adaugă o parolă (Criptare)", + "selectText": { + "1": "Selectează PDF-ul pentru criptare", + "2": "Parolă", + "3": "Lungime cheie de criptare", + "4": "Valori mai mari sunt mai puternice, dar valorile mai mici au o compatibilitate mai bună.", + "5": "Permisiuni de setare", + "6": "Previne asamblarea documentului", + "7": "Previne extragerea conținutului", + "8": "Previne extragerea pentru accesibilitate", + "9": "Previne completarea formularului", + "10": "Previne modificarea", + "11": "Previne modificarea adnotărilor", + "12": "Previne tipărirea", + "13": "Previne tipărirea în formate diferite", + "14": "Parolă Proprietar", + "15": "Restricționează ce se poate face cu documentul odată ce este deschis (Nu este suportat de toate programele de citire)", + "16": "Restricționează deschiderea documentului în sine" } }, "changePermissions": { "title": "Schimbă Permisiunile", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Schimbă Permisiunile", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Previne asamblarea documentului" @@ -1721,10 +4580,784 @@ "label": "Previne tipărirea în formate diferite" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Schimbă Permisiunile" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Elimină parola", + "desc": "Elimină protecția cu parolă din documentul PDF.", + "tags": "securizează,Decriptează,securitate,elimină parola,șterge parola", + "password": { + "stepTitle": "Elimină Parola", + "label": "Parola Curentă", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Elimină", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Elimină parola (Decodifică)", + "selectText": { + "1": "Selectează PDF-ul pentru decodificare", + "2": "Parolă" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or Invert color Options", + "2": "Default(Default high contrast colors)", + "3": "Custom(Customized colors)", + "4": "Full-Invert(Invert all colors)", + "5": "High contrast color options", + "6": "white text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color", + "header": "Replace-Invert Color PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Redactează,Ascunde,înnegrește,negru,marker,ascuns", + "title": "Redactare Automată", + "header": "Redactare Automată", + "colorLabel": "Culoare", + "textsToRedactLabel": "Text de Redactat (separat pe linii)", + "textsToRedactPlaceholder": "ex. \\nConfidențial \\nSecret de Serviciu", + "useRegexLabel": "Folosește Regex", + "wholeWordSearchLabel": "Căutare Cuvânt Întreg", + "customPaddingLabel": "Spațiere Suplimentară Personalizată", + "convertPDFToImageLabel": "Convertește PDF în PDF-Imagine (Folosit pentru a elimina textul din spatele casetei)", + "submitButton": "Trimite" + }, + "replaceColorPdf": { + "tags": "Replace Color,Page operations,Back end,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/ru-RU/translation.json b/frontend/public/locales/ru-RU/translation.json index bf27a8a05..e54b8df30 100644 --- a/frontend/public/locales/ru-RU/translation.json +++ b/frontend/public/locales/ru-RU/translation.json @@ -1,5 +1,35 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, "unsavedChanges": "У вас есть несохранённые изменения в вашем PDF. Что вы хотите сделать?", + "areYouSure": "Are you sure you want to leave?", "unsavedChangesTitle": "Несохранённые изменения", "keepWorking": "Продолжить работу", "discardChanges": "Отменить изменения", @@ -24,8 +54,26 @@ "customTextDesc": "Пользовательский текст", "numberPagesDesc": "Какие страницы нумеровать, по умолчанию 'все', также принимает 1-5 или 2,5,9 и т.д.", "customNumberDesc": "По умолчанию {n}, также принимает 'Страница {n} из {total}', 'Текст-{n}', '{filename}-{n}'", - "submit": "Добавить номера страниц" + "submit": "Добавить номера страниц", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Выбор страниц (Введите список номеров страниц через запятую 1,5,6 или функции типа 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Выберите PDF-файл(ы)", "multiPdfPrompt": "Выберите PDF-файлы (2+)", "multiPdfDropPrompt": "Выберите (или перетащите) все необходимые PDF-файлы", @@ -36,7 +84,6 @@ "uploadLimitExceededPlural": "слишком большой. Максимально допустимый размер", "processTimeWarning": "Внимание: Данный процесс может занять до минуты в зависимости от размера файла", "pageOrderPrompt": "Пользовательский порядок страниц (Введите список номеров страниц через запятую или функции типа 2n+1):", - "pageSelectionPrompt": "Выбор страниц (Введите список номеров страниц через запятую 1,5,6 или функции типа 2n+1):", "goToPage": "Перейти", "true": "Да", "false": "Нет", @@ -47,11 +94,18 @@ "save": "Сохранить", "saveToBrowser": "Сохранить в браузере", "download": "Скачать", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", "undoOperationTooltip": "Нажмите, чтобы отменить последнюю операцию и восстановить исходные файлы", "undo": "Отменить", "moreOptions": "Больше параметров", "editYourNewFiles": "Отредактируйте ваши новые файлы", "close": "Закрыть", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "Выбрано: {{filename}}", "chooseFile": "Выбрать файл", "filesSelected": "файлов выбрано", @@ -61,7 +115,9 @@ "uploadFiles": "Загрузить файлы", "addFiles": "Добавить файлы", "selectFromWorkbench": "Выберите файлы из рабочей области или ", - "selectMultipleFromWorkbench": "Выберите не менее {{count}} файлов из рабочей области или " + "selectMultipleFromWorkbench": "Выберите не менее {{count}} файлов из рабочей области или ", + "created": "Created", + "size": "File Size" }, "noFavourites": "Нет избранного", "downloadComplete": "Загрузка завершена", @@ -194,6 +250,7 @@ "title": "Хотите улучшить Stirling PDF?", "paragraph1": "В Stirling PDF есть опциональная аналитика для улучшения продукта. Мы не отслеживаем личную информацию или содержимое файлов.", "paragraph2": "Пожалуйста, рассмотрите возможность включения аналитики, чтобы помочь развитию Stirling-PDF и позволить нам лучше понимать наших пользователей.", + "learnMore": "Learn more", "enable": "Включить аналитику", "disable": "Отключить аналитику", "settings": "Вы можете изменить настройки аналитики в файле config/settings.yml" @@ -237,6 +294,54 @@ "cacheInputs": { "name": "Сохранять данные форм", "help": "Включите для сохранения ранее использованных данных для будущих запусков" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -308,8 +413,10 @@ "top20": "Топ 20", "all": "Все", "refresh": "Обновить", - "includeHomepage": "Включить главную страницу ('/')", - "includeLoginPage": "Включить страницу входа ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Всего конечных точек", "totalVisits": "Всего посещений", "showing": "Показано", @@ -324,7 +431,9 @@ "top": "Топ", "numberOfVisits": "Количество посещений", "visitsTooltip": "Посещения: {0} ({1}% от общего числа)", - "retry": "Повторить" + "retry": "Повторить", + "includeHomepage": "Включить главную страницу ('/')", + "includeLoginPage": "Включить страницу входа ('/login')" }, "database": { "title": "Импорт/экспорт базы данных", @@ -365,6 +474,16 @@ "alphabetical": "Алфавиту", "globalPopularity": "Популярности", "sortBy": "Сортировать по:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { "tags": "несколько,инструменты", "title": "Мультиинструмент PDF", @@ -550,11 +669,6 @@ "title": "Ручное редактирование", "desc": "Редактирует PDF на основе выбранного текста, нарисованных форм и/или выбранных страниц" }, - "overlayPdfs": { - "tags": "оверлей,объединить,сложить", - "title": "Наложить PDF", - "desc": "Наложение одного PDF поверх другого" - }, "splitBySections": { "tags": "разделить,секции,делить", "title": "Разделить PDF по секциям", @@ -659,6 +773,15 @@ "tags": "рабочий процесс,последовательность,автоматизация", "title": "Автоматизация", "desc": "Создавайте многошаговые процессы, связывая PDF-действия. Идеально для повторяющихся задач." + }, + "overlay-pdfs": { + "desc": "Overlay one PDF on top of another", + "title": "Overlay PDFs" + }, + "overlayPdfs": { + "tags": "оверлей,объединить,сложить", + "title": "Наложить PDF", + "desc": "Наложение одного PDF поверх другого" } }, "landing": { @@ -698,13 +821,19 @@ "merge": { "tags": "объединение,операции со страницами,серверная часть", "title": "Объединить", - "removeDigitalSignature.tooltip": { - "title": "Удалить цифровую подпись", - "description": "Цифровые подписи становятся недействительными при объединении. Отметьте, чтобы удалить их из итогового PDF." + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Удалить цифровую подпись", + "description": "Цифровые подписи становятся недействительными при объединении. Отметьте, чтобы удалить их из итогового PDF." + } }, - "generateTableOfContents.tooltip": { - "title": "Сгенерировать оглавление", - "description": "Автоматически создаёт кликабельное оглавление в объединённом PDF на основе исходных имён файлов и номеров страниц." + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Сгенерировать оглавление", + "description": "Автоматически создаёт кликабельное оглавление в объединённом PDF на основе исходных имён файлов и номеров страниц." + } }, "submit": "Объединить", "sortBy": { @@ -842,12 +971,50 @@ "bullet1": "Уровень закладок: по какому уровню делить (1 = верхний)", "bullet2": "Включить метаданные: сохранять свойства документа", "bullet3": "Разрешить дубликаты: обрабатывать повторяющиеся названия закладок" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" } - } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method" }, "rotate": { "title": "Повернуть PDF", "submit": "Повернуть", + "selectRotation": "Select Rotation Angle (Clockwise)", "error": { "failed": "Произошла ошибка при повороте PDF." }, @@ -935,7 +1102,8 @@ "imagesExt": "Изображения (JPG, PNG и т. д.)", "markdown": "Markdown", "textRtf": "Текст/RTF", - "grayscale": "Оттенки серого" + "grayscale": "Оттенки серого", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "конвертация,изображение,jpg,картинка,фото" @@ -973,7 +1141,20 @@ "8": "Удалить последнюю", "9": "Удалить первую и последнюю", "10": "Объединение четных-нечетных", - "11": "Дублировать все страницы" + "11": "Дублировать все страницы", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, "desc": { "CUSTOM": "Используйте собственную последовательность номеров страниц или выражения для задания нового порядка.", @@ -1039,7 +1220,9 @@ "opacity": "Непрозрачность (%)", "spacing": { "horizontal": "Горизонтальный интервал", - "vertical": "Вертикальный интервал" + "vertical": "Вертикальный интервал", + "height": "Height Spacing", + "width": "Width Spacing" }, "convertToImage": "Превратить страницы PDF в изображения" }, @@ -1182,6 +1365,10 @@ "bullet4": "Лучше для чувствительного или защищённого авторским правом контента" } } + }, + "type": { + "1": "Text", + "2": "Image" } }, "permissions": { @@ -1255,6 +1442,26 @@ }, "submit": "Удалить" }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, "pageSelection": { "tooltip": { "header": { @@ -1295,10 +1502,43 @@ }, "examples": { "title": "Примеры" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", "header": { "title": "Памятка по выбору страниц" }, @@ -1604,6 +1844,9 @@ "text": "Постобработка итогового PDF: удаление артефактов OCR и оптимизация текстового слоя для лучшей читаемости и меньшего размера." } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1766,8 +2009,16 @@ "hint": "Загрузите PNG или JPG с вашей подписью" }, "instructions": { - "title": "Как добавить подпись" + "title": "Как добавить подпись", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", "activate": "Активировать размещение подписи", "deactivate": "Остановить размещение подписей", "results": { @@ -1792,7 +2043,10 @@ "options": { "stepTitle": "Параметры уплощения", "title": "Параметры уплощения", - "flattenOnlyForms.desc": "Уплощать только поля форм, оставляя прочие интерактивные элементы", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "Уплощать только поля форм, оставляя прочие интерактивные элементы" + }, "note": "Уплощение удаляет интерактивные элементы из PDF, делая их нередактируемыми." }, "results": { @@ -1882,7 +2136,13 @@ "bullet3": "Можно отключить для уменьшения размера файла" } }, - "submit": "Удалить пустые" + "submit": "Удалить пустые", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + } }, "removeAnnotations": { "tags": "комментарии,выделение,заметки,разметка,удаление", @@ -1984,7 +2244,12 @@ "bullet3": "Выберите страницу для размещения подписи", "bullet4": "Можно добавить логотип" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, "sign": { "submit": "Подписать PDF", @@ -2045,7 +2310,22 @@ "text": "Преобразуйте файл в Java-хранилище ключей (.jks) с помощью keytool, затем выберите JKS." } } - } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Certificate Password", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo" }, "removeCertSign": { "tags": "аутентификация,PEM,P12,официальный,расшифровка", @@ -2071,7 +2351,17 @@ "header": "Многостраничная компоновка", "pagesPerSheet": "Страниц на лист:", "addBorder": "Добавить границы", - "submit": "Отправить" + "submit": "Отправить", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "буклет,импозиция,печать,переплёт,сгиб,сигнатура", @@ -2257,10 +2547,22 @@ "reset": "Сбросить к полному PDF", "coordinates": { "title": "Положение и размер", - "x": "Положение X", - "y": "Положение Y", - "width": "Ширина", - "height": "Высота" + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } }, "error": { "invalidArea": "Область обрезки выходит за границы PDF", @@ -2278,6 +2580,10 @@ }, "results": { "title": "Результаты обрезки" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." } }, "autoSplitPDF": { @@ -2488,11 +2794,15 @@ "overlay-pdfs": { "tags": "Наложение", "header": "Наложение PDF-файлов", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Выберите базовый PDF-файл" }, "overlayFiles": { - "label": "Выберите накладываемые PDF-файлы" + "label": "Выберите накладываемые PDF-файлы", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Выберите режим наложения", @@ -2502,14 +2812,53 @@ }, "counts": { "label": "Количество наложений (для режима фиксированного повторения)", - "placeholder": "Введите количество через запятую (например, 2,3,1)" + "placeholder": "Введите количество через запятую (например, 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Выберите позицию наложения", "foreground": "На переднем плане", "background": "На заднем плане" }, - "submit": "Отправить" + "submit": "Отправить", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Разделение по секциям,Разделить,Настроить", @@ -2544,7 +2893,18 @@ "customMargin": "Пользовательские поля", "customColor": "Пользовательский цвет текста", "submit": "Отправить", - "noStampSelected": "Штамп не выбран. Вернитесь к Шагу 1." + "noStampSelected": "Штамп не выбран. Вернитесь к Шагу 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Удаление изображения,операции со страницами,Серверная часть" @@ -2562,7 +2922,8 @@ "status": { "_value": "Статус", "valid": "Действительна", - "invalid": "Недействительна" + "invalid": "Недействительна", + "complete": "Validation complete" }, "signer": "Подписант", "date": "Дата", @@ -2589,17 +2950,115 @@ "version": "Версия", "keyUsage": "Использование ключа", "selfSigned": "Самоподписанный", - "bits": "бит" + "bits": "бит", + "details": "Certificate Details" }, "signature": { "info": "Информация о подписи", "_value": "Подпись", "mathValid": "Подпись математически корректна, НО:" }, - "selectCustomCert": "Пользовательский файл сертификата X.509 (Необязательно)" + "selectCustomCert": "Пользовательский файл сертификата X.509 (Необязательно)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" + }, + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, "replaceColor": { - "tags": "Замена цвета,Операции со страницами,Back end,на стороне сервера" + "tags": "Замена цвета,Операции со страницами,Back end,на стороне сервера", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Вход", @@ -2632,6 +3091,11 @@ "enterEmail": "Введите ваш email", "enterPassword": "Введите ваш пароль", "loggingIn": "Вход...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", "signingIn": "Входим...", "login": "Войти", "or": "Или", @@ -2649,7 +3113,10 @@ "magicLinkSent": "Магическая ссылка отправлена на {{email}}! Проверьте почту и перейдите по ссылке для входа.", "passwordResetSent": "Ссылка для сброса пароля отправлена на {{email}}! Проверьте почту и следуйте инструкциям.", "failedToSignIn": "Не удалось войти через {{provider}}: {{message}}", - "unexpectedError": "Непредвиденная ошибка: {{message}}" + "unexpectedError": "Непредвиденная ошибка: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." }, "signup": { "title": "Создать аккаунт", @@ -2672,7 +3139,12 @@ "invalidEmail": "Пожалуйста, введите корректный адрес email", "checkEmailConfirmation": "Проверьте почту и перейдите по ссылке для завершения регистрации.", "accountCreatedSuccessfully": "Аккаунт успешно создан! Теперь вы можете войти.", - "unexpectedError": "Непредвиденная ошибка: {{message}}" + "unexpectedError": "Непредвиденная ошибка: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF в одну страницу", @@ -2712,10 +3184,23 @@ "adjustContrast": { "title": "Настройка контраста", "header": "Настройка контраста", + "basic": "Basic Adjustments", "contrast": "Контраст:", "brightness": "Яркость:", "saturation": "Насыщенность:", - "download": "Скачать" + "download": "Скачать", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Сжать", @@ -2862,7 +3347,13 @@ "title": "Удалить изображение", "header": "Удалить изображение", "removeImage": "Удалить изображение", - "submit": "Удалить изображение" + "submit": "Удалить изображение", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Разделить PDF по главам", @@ -2937,6 +3428,10 @@ "title": "Аналитика", "description": "Эти файлы cookie помогают нам понять, как используются наши инструменты, чтобы мы могли сосредоточиться на создании функций, которые больше всего ценятся нашим сообществом. Будьте уверены — Stirling PDF не может и никогда не будет отслеживать содержание документов, с которыми вы работаете." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, "removeMetadata": { @@ -2998,11 +3493,18 @@ "panMode": "Режим панорамирования", "rotateLeft": "Повернуть влево", "rotateRight": "Повернуть вправо", - "toggleSidebar": "Показать/скрыть боковую панель" + "toggleSidebar": "Показать/скрыть боковую панель", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" }, "search": { "title": "Поиск по PDF", - "placeholder": "Введите поисковый запрос..." + "placeholder": "Введите поисковый запрос...", + "noResults": "No results found", + "searching": "Searching..." }, "guestBanner": { "title": "Вы используете Stirling PDF как гость!", @@ -3040,9 +3542,597 @@ "automate": "Автоматизация", "files": "Файлы", "activity": "Активность", + "help": "Help", + "account": "Account", "config": "Конфигурация", + "adminSettings": "Admin Settings", "allTools": "Все инструменты" }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, "fileUpload": { "selectFile": "Выберите файл", "selectFiles": "Выберите файлы", @@ -3067,6 +4157,9 @@ "addFiles": "Добавить файлы", "dragFilesInOrClick": "Перетащите файлы или нажмите «Добавить файлы», чтобы выбрать" }, + "fileEditor": { + "addFiles": "Add Files" + }, "fileManager": { "title": "Загрузить PDF-файлы", "subtitle": "Добавляйте файлы в хранилище для удобного доступа во всех инструментах", @@ -3095,6 +4188,7 @@ "lastModified": "Дата изменения", "toolChain": "Применённые инструменты", "restore": "Восстановить", + "unzip": "Unzip", "searchFiles": "Поиск файлов...", "recent": "Недавние", "localFiles": "Локальные файлы", @@ -3102,7 +4196,6 @@ "googleDriveShort": "Drive", "myFiles": "Мои файлы", "noRecentFiles": "Недавние файлы не найдены", - "dropFilesHint": "Перетащите файлы сюда, чтобы загрузить", "googleDriveNotAvailable": "Интеграция с Google Drive недоступна", "openFiles": "Открыть файлы", "openFile": "Открыть файл", @@ -3120,7 +4213,18 @@ "selectedCount": "{{count}} выбрано", "download": "Скачать", "delete": "Удалить", - "unsupported": "Не поддерживается" + "unsupported": "Не поддерживается", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "Перетащите файлы сюда, чтобы загрузить" }, "storage": { "temporaryNotice": "Файлы временно сохраняются в вашем браузере и могут быть автоматически удалены", @@ -3136,8 +4240,10 @@ "desc": "Удаление потенциально вредных элементов из PDF-файлов.", "submit": "Очистить PDF", "completed": "Санитизация успешно завершена", - "error.generic": "Сбой санитизации", - "error.failed": "Произошла ошибка при санитизации PDF.", + "error": { + "generic": "Сбой санитизации", + "failed": "Произошла ошибка при санитизации PDF." + }, "filenamePrefix": "sanitised", "sanitizationResults": "Результаты санитизации", "steps": { @@ -3151,12 +4257,30 @@ "options": { "title": "Параметры санитизации", "note": "Выберите элементы, которые хотите удалить из PDF. Должен быть выбран хотя бы один вариант.", - "removeJavaScript.desc": "Удалить действия и скрипты JavaScript из PDF", - "removeEmbeddedFiles.desc": "Удалить любые файлы, встроенные в PDF", - "removeXMPMetadata.desc": "Удалить XMP-метаданные из PDF", - "removeMetadata.desc": "Удалить информацию о документе (название, автор и т. д.)", - "removeLinks.desc": "Удалить внешние ссылки и действия запуска из PDF", - "removeFonts.desc": "Удалить встроенные шрифты из PDF" + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Удалить действия и скрипты JavaScript из PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Удалить любые файлы, встроенные в PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Удалить XMP-метаданные из PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Удалить информацию о документе (название, автор и т. д.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Удалить внешние ссылки и действия запуска из PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Удалить встроенные шрифты из PDF" + } } }, "addPassword": { @@ -3377,9 +4501,14 @@ "remaining": "осталось", "used": "использовано", "available": "доступно", - "cancel": "Отмена" + "cancel": "Отмена", + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { "title": "Настройки аккаунта", @@ -3435,8 +4564,570 @@ "submit": "Добавить вложения", "results": { "title": "Результаты вложений" + }, + "error": { + "failed": "Add attachments operation failed" } }, "termsAndConditions": "Условия и положения", - "logOut": "Выйти" -} \ No newline at end of file + "logOut": "Выйти", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or invert colour options", + "2": "Default (preset high contrast colours)", + "3": "Custom (choose your own colours)", + "4": "Full invert (invert all colours)", + "5": "High contrast color options", + "6": "White text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + } +} diff --git a/frontend/public/locales/sk-SK/translation.json b/frontend/public/locales/sk-SK/translation.json index d8a117cd8..318c2b71b 100644 --- a/frontend/public/locales/sk-SK/translation.json +++ b/frontend/public/locales/sk-SK/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Vlastný text", "numberPagesDesc": "Ktoré stránky číslovať, predvolené 'všetky', tiež akceptuje 1-5 alebo 2,5,9 atď.", "customNumberDesc": "Predvolené {n}, tiež akceptuje 'Strana {n} z {total}', 'Text-{n}', '{filename}-{n}", - "submit": "Pridať čísla stránok" + "submit": "Pridať čísla stránok", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Vlastný výber stránok (Zadajte zoznam čísel stránok oddelených čiarkou 1,5,6 alebo funkcie ako 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Vyberte PDF súbor(y)", "multiPdfPrompt": "Vyberte PDF súbory (2+)", "multiPdfDropPrompt": "Vyberte (alebo pretiahnite) všetky požadované PDF súbory", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Varovanie: Tento proces môže trvať až minútu v závislosti od veľkosti súboru", "pageOrderPrompt": "Vlastné poradie stránok (Zadajte zoznam čísel stránok oddelených čiarkou alebo funkcie ako 2n+1):", - "pageSelectionPrompt": "Vlastný výber stránok (Zadajte zoznam čísel stránok oddelených čiarkou 1,5,6 alebo funkcie ako 2n+1):", "goToPage": "Choď", "true": "Áno", "false": "Nie", "unknown": "Neznáme", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Uložiť", "saveToBrowser": "Uložiť do prehliadača", + "download": "Stiahnuť", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Zatvoriť", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "vybrané súbory", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Žiadne obľúbené položky", "downloadComplete": "Stiahnutie dokončené", "bored": "Nudíte sa pri čakaní?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF dokument je chránený heslom a buď heslo nebolo zadané, alebo bolo nesprávne", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Chyba", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Ospravedlňujeme sa za problém!", "needHelp": "Potrebujete pomoc / Našli ste problém?", "contactTip": "Ak máte stále problémy, neváhajte nás kontaktovať pre pomoc. Môžete podať tiket na našej stránke GitHub alebo nás kontaktovať cez Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Podajte tiket", "discordSubmit": "Discord - Podajte príspevok na podporu" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Vymazať", "username": "Používateľské meno", "password": "Heslo", @@ -82,6 +169,7 @@ "green": "Zelená", "blue": "Modrá", "custom": "Vlastné...", + "comingSoon": "Coming soon", "WorkInProgess": "Práca prebieha, nemusí fungovať alebo môže byť chybová, prosím nahláste akékoľvek problémy!", "poweredBy": "Poskytované", "yes": "Áno", @@ -115,12 +203,14 @@ "page": "Page", "pages": "Pages", "loading": "Loading...", + "review": "Review", "addToDoc": "Add to Document", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Privacy Policy", + "iAgreeToThe": "I agree to all of the", "terms": "Terms and Conditions", "accessibility": "Accessibility", "cookie": "Cookie Policy", @@ -160,6 +250,7 @@ "title": "Do you want make Stirling PDF better?", "paragraph1": "Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.", "paragraph2": "Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.", + "learnMore": "Learn more", "enable": "Enable analytics", "disable": "Disable analytics", "settings": "You can change the settings for analytics in the config/settings.yml file" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Uložiť vstupy formulára", "help": "Umožňuje uložiť predtým použité vstupy na budúce použitie" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Database Import/Export", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Multi Nástroj", "desc": "Zlúčiť, otočiť, preusporiadať a odstrániť stránky" }, "merge": { + "tags": "combine,join,unite", "title": "Zlúčiť", "desc": "Jednoducho zlúčte viacero PDF súborov do jedného." }, "split": { + "tags": "divide,separate,break", "title": "Rozdeliť", "desc": "Rozdeľte PDF súbory na viacero dokumentov" }, "rotate": { + "tags": "turn,flip,orient", "title": "Otočiť", "desc": "Jednoducho otáčajte svoje PDF súbory." }, + "convert": { + "tags": "transform,change", + "title": "Konvertovať", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organizovať", + "desc": "Odstráňte/preusporiadajte stránky v ľubovoľnom poradí" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Pridať obrázok", + "desc": "Pridať obrázok na zadané miesto v PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Pridať vodotlač", + "desc": "Pridať vlastnú vodotlač do vášho PDF dokumentu." + }, + "removePassword": { + "tags": "unlock", + "title": "Odstrániť heslo", + "desc": "Odstrániť ochranu heslom z vášho PDF dokumentu." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Komprimovať", + "desc": "Komprimujte PDF na zmenšenie jeho veľkosti." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Zmeniť metadáta", + "desc": "Zmena/Odstránenie/Pridanie metadát z PDF dokumentu" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Čistenie skenov", + "desc": "Čistenie skenov a rozpoznanie textu z obrázkov v PDF a opätovné pridanie ako text." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Extrahovať obrázky", + "desc": "Extrahuje všetky obrázky z PDF a uloží ich do zipu" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Podpísať", + "desc": "Pridáva podpis do PDF kreslením, textom alebo obrázkom" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Zploštiť", + "desc": "Odstrániť všetky interaktívne prvky a formuláre z PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Podpísať s certifikátom", + "desc": "Podpísať PDF s certifikátom/kľúčom (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Opraviť", + "desc": "Skúša opraviť poškodené/rozbité PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Odstrániť prázdne stránky", + "desc": "Detekuje a odstraňuje prázdne stránky z dokumentu" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Odstrániť anotácie", + "desc": "Odstraňuje všetky komentáre/anotácie z PDF" + }, + "compare": { + "tags": "difference", + "title": "Porovnať", + "desc": "Porovnáva a zobrazuje rozdiely medzi 2 PDF dokumentmi" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Remove Certificate Sign", + "desc": "Remove certificate signature from PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Viacstranové usporiadanie", + "desc": "Zlúčte viacero stránok PDF dokumentu do jednej stránky" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Prispôsobiť veľkosť/škálovanie stránok", + "desc": "Zmeniť veľkosť/škálovanie stránky a/alebo jej obsahu." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Pridať čísla stránok", + "desc": "Pridať čísla stránok po celom dokumente na určenom mieste" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Upraviť farby/kontrast", + "desc": "Upravte kontrast, sýtosť a jas PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Orezať PDF", + "desc": "Orezať PDF na zmenšenie jeho veľkosti (zachováva text!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Automatické rozdelenie stránok", + "desc": "Automatické rozdelenie skenovaného PDF pomocou fyzického skenovaného rozdeľovača stránok QR kódom" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Získať všetky informácie o PDF", + "desc": "Získava všetky dostupné informácie o PDF" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF na jednu veľkú stránku", + "desc": "Zlúči všetky stránky PDF do jednej veľkej stránky" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Zobraziť JavaScript", + "desc": "Vyhľadá a zobrazuje akýkoľvek JS vložený do PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Remove image", + "desc": "Remove image from PDF to reduce file size" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Split PDF by Chapters", + "desc": "Split a PDF into multiple files based on its chapter structure." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extrahovať stránky", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Odstrániť", + "desc": "Odstrániť nechcené stránky z vášho PDF dokumentu." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Automatické rozdelenie podľa veľkosti/počtu", + "desc": "Rozdelí jeden PDF na viacero dokumentov na základe veľkosti, počtu stránok alebo počtu dokumentov" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Pridať heslo", + "desc": "Šifrovať váš PDF dokument heslom." + }, + "changePermissions": { + "title": "Zmeniť povolenia", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Prekrýva PDF súbory na iný PDF", + "title": "Prekrývanie PDF" + }, "imageToPDF": { "title": "Obrázok na PDF", "desc": "Konvertujte obrázok (PNG, JPEG, GIF) na PDF." @@ -355,18 +786,6 @@ "title": "PDF na obrázok", "desc": "Konvertujte PDF na obrázok. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organizovať", - "desc": "Odstráňte/preusporiadajte stránky v ľubovoľnom poradí" - }, - "addImage": { - "title": "Pridať obrázok", - "desc": "Pridať obrázok na zadané miesto v PDF" - }, - "watermark": { - "title": "Pridať vodotlač", - "desc": "Pridať vlastnú vodotlač do vášho PDF dokumentu." - }, "permissions": { "title": "Zmeniť povolenia", "desc": "Zmena povolení vášho PDF dokumentu" @@ -375,38 +794,10 @@ "title": "Odstrániť", "desc": "Odstrániť nechcené stránky z vášho PDF dokumentu." }, - "addPassword": { - "title": "Pridať heslo", - "desc": "Šifrovať váš PDF dokument heslom." - }, - "removePassword": { - "title": "Odstrániť heslo", - "desc": "Odstrániť ochranu heslom z vášho PDF dokumentu." - }, - "compress": { - "title": "Komprimovať", - "desc": "Komprimujte PDF na zmenšenie jeho veľkosti." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Zmeniť metadáta", - "desc": "Zmena/Odstránenie/Pridanie metadát z PDF dokumentu" - }, "fileToPDF": { "title": "Konvertovať súbor na PDF", "desc": "Konvertujte takmer akýkoľvek súbor na PDF (DOCX, PNG, XLS, PPT, TXT a ďalšie)" }, - "ocr": { - "title": "OCR / Čistenie skenov", - "desc": "Čistenie skenov a rozpoznanie textu z obrázkov v PDF a opätovné pridanie ako text." - }, - "extractImages": { - "title": "Extrahovať obrázky", - "desc": "Extrahuje všetky obrázky z PDF a uloží ich do zipu" - }, "pdfToPDFA": { "title": "PDF na PDF/A", "desc": "Konvertujte PDF na PDF/A pre dlhodobé uchovávanie" @@ -435,70 +826,14 @@ "title": "Detekcia/Rozdelenie skenovaných fotografií", "desc": "Rozdelí viacero fotografií v rámci fotografie/PDF" }, - "sign": { - "title": "Podpísať", - "desc": "Pridáva podpis do PDF kreslením, textom alebo obrázkom" - }, - "flatten": { - "title": "Zploštiť", - "desc": "Odstrániť všetky interaktívne prvky a formuláre z PDF" - }, - "repair": { - "title": "Opraviť", - "desc": "Skúša opraviť poškodené/rozbité PDF" - }, - "removeBlanks": { - "title": "Odstrániť prázdne stránky", - "desc": "Detekuje a odstraňuje prázdne stránky z dokumentu" - }, - "removeAnnotations": { - "title": "Odstrániť anotácie", - "desc": "Odstraňuje všetky komentáre/anotácie z PDF" - }, - "compare": { - "title": "Porovnať", - "desc": "Porovnáva a zobrazuje rozdiely medzi 2 PDF dokumentmi" - }, - "certSign": { - "title": "Podpísať s certifikátom", - "desc": "Podpísať PDF s certifikátom/kľúčom (PEM/P12)" - }, - "removeCertSign": { - "title": "Remove Certificate Sign", - "desc": "Remove certificate signature from PDF" - }, - "pageLayout": { - "title": "Viacstranové usporiadanie", - "desc": "Zlúčte viacero stránok PDF dokumentu do jednej stránky" - }, - "scalePages": { - "title": "Prispôsobiť veľkosť/škálovanie stránok", - "desc": "Zmeniť veľkosť/škálovanie stránky a/alebo jej obsahu." - }, "pipeline": { "title": "Pipeline", "desc": "Spustiť viacero akcií na PDF definovaním pipeline skriptov" }, - "addPageNumbers": { - "title": "Pridať čísla stránok", - "desc": "Pridať čísla stránok po celom dokumente na určenom mieste" - }, "auto-rename": { "title": "Automatické premenovanie PDF súboru", "desc": "Automaticky premenuje PDF súbor na základe zisteného záhlavia" }, - "adjustContrast": { - "title": "Upraviť farby/kontrast", - "desc": "Upravte kontrast, sýtosť a jas PDF" - }, - "crop": { - "title": "Orezať PDF", - "desc": "Orezať PDF na zmenšenie jeho veľkosti (zachováva text!)" - }, - "autoSplitPDF": { - "title": "Automatické rozdelenie stránok", - "desc": "Automatické rozdelenie skenovaného PDF pomocou fyzického skenovaného rozdeľovača stránok QR kódom" - }, "sanitizePDF": { "title": "Vyčistiť", "desc": "Odstrániť skripty a ďalšie prvky z PDF súborov" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Získať všetky informácie o PDF", - "desc": "Získava všetky dostupné informácie o PDF" - }, "pageExtracter": { "title": "Extrahovať stránku(y)", "desc": "Extrahuje vybrané stránky z PDF" }, - "pdfToSinglePage": { - "title": "PDF na jednu veľkú stránku", - "desc": "Zlúči všetky stránky PDF do jednej veľkej stránky" - }, - "showJS": { - "title": "Zobraziť JavaScript", - "desc": "Vyhľadá a zobrazuje akýkoľvek JS vložený do PDF" - }, "autoRedact": { "title": "Automatické redigovanie", "desc": "Automaticky rediguje (zatieni) text v PDF na základe zadaného textu" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF do CSV", "desc": "Extrahuje tabuľky z PDF a konvertuje ich do CSV" @@ -551,10 +870,6 @@ "title": "Automatické rozdelenie podľa veľkosti/počtu", "desc": "Rozdelí jeden PDF na viacero dokumentov na základe veľkosti, počtu stránok alebo počtu dokumentov" }, - "overlay-pdfs": { - "title": "Prekrývanie PDF", - "desc": "Prekrýva PDF súbory na iný PDF" - }, "split-by-sections": { "title": "Rozdelenie PDF podľa sekcií", "desc": "Rozdelí každú stránku PDF na menšie horizontálne a vertikálne sekcie" @@ -563,43 +878,17 @@ "title": "Pridať pečiatku do PDF", "desc": "Pridať text alebo obrázkové pečiatky na určené miesta" }, - "removeImage": { - "title": "Remove image", - "desc": "Remove image from PDF to reduce file size" - }, - "splitByChapters": { - "title": "Split PDF by Chapters", - "desc": "Split a PDF into multiple files based on its chapter structure." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" }, - "convert": { - "title": "Konvertovať" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Extrahovať stránky" - }, - "removePages": { - "title": "Odstrániť", - "desc": "Odstrániť nechcené stránky z vášho PDF dokumentu." - }, "removeImagePdf": { "title": "Remove image", "desc": "Remove image from PDF to reduce file size" }, - "autoSizeSplitPDF": { - "title": "Automatické rozdelenie podľa veľkosti/počtu", - "desc": "Rozdelí jeden PDF na viacero dokumentov na základe veľkosti, počtu stránok alebo počtu dokumentov" - }, "adjust-contrast": { "title": "Upraviť farby/kontrast", "desc": "Upravte kontrast, sýtosť a jas PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" - }, - "changePermissions": { - "title": "Zmeniť povolenia" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "zobraziť,čítať,anotovať,text,obrázok", "title": "View/Edit PDF", @@ -645,14 +935,39 @@ "merge": { "tags": "zlúčenie,operácie so stránkami,back end,beží na serveri", "title": "Zlúčiť", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Zlúčiť", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "File Name", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Zlúčiť viacero PDF (2+)", "sortByName": "Zoradiť podľa názvu", "sortByDate": "Zoradiť podľa dátumu", - "removeCertSign": "Remove digital signature in the merged file?", - "submit": "Zlúčiť" + "removeCertSign": "Remove digital signature in the merged file?" }, "split": { - "tags": "operácie so stránkami,rozdelenie,viacstranové,rozrezať,beží na serveri", "title": "Rozdeliť PDF", "header": "Rozdeliť PDF", "desc": { @@ -668,15 +983,249 @@ "splitPages": "Zadajte stránky na rozdelenie:", "submit": "Rozdeliť", "steps": { + "chooseMethod": "Choose Method", "settings": "Nastavenia" - } + }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, + "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, + "bySize": { + "name": "File Size", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" + } + }, + "value": { + "fileSize": { + "label": "File Size", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" + } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "operácie so stránkami,rozdelenie,viacstranové,rozrezať,beží na serveri" }, "rotate": { - "tags": "beží na serveri", "title": "Otočiť PDF", + "submit": "Otočiť", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "beží na serveri", "header": "Otočiť PDF", - "selectAngle": "Vyberte uhol otočenia (v násobkoch 90 stupňov):", - "submit": "Otočiť" + "selectAngle": "Vyberte uhol otočenia (v násobkoch 90 stupňov):" + }, + "convert": { + "title": "Konvertovať", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Nastavenia", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Farba", + "greyscale": "Odtiene šedej", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Vyplniť stránku", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "The PDF contains a digital signature. This will be removed in the next step.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Odtiene šedej", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konverzia,img,jpg,obrázok,fotografia" @@ -714,7 +1263,33 @@ "8": "Odstrániť poslednú", "9": "Odstrániť prvú aj poslednú", "10": "Odd-Even Merge", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(napr. 1,3,2 alebo 4-8,2,10-12 alebo 2n-1)" }, @@ -726,9 +1301,198 @@ "upload": "Pridať obrázok", "submit": "Pridať obrázok" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Text,opakujúci sa,označenie,vlastné,autorské práva,ochranná známka,img,jpg,obrázok,fotografia", "title": "Pridať vodotlač", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Pridať vodotlač", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Text", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Font Size", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Text", + "2": "Obrázok" + }, + "tags": "Text,opakujúci sa,označenie,vlastné,autorské práva,ochranná známka,img,jpg,obrázok,fotografia", "header": "Pridať vodotlač", "customColor": "Vlastná farba textu", "selectText": { @@ -742,11 +1506,6 @@ "8": "Typ vodotlače:", "9": "Obrázok vodotlače:", "10": "Convert PDF to PDF-Image" - }, - "submit": "Pridať vodotlač", - "type": { - "1": "Text", - "2": "Obrázok" } }, "permissions": { @@ -771,50 +1530,201 @@ "removePages": { "tags": "Odstrániť stránky,vymazať stránky", "title": "Odstrániť", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Odstrániť" }, - "addPassword": { - "tags": "zaistiť,bezpečnosť", - "title": "Pridať heslo", - "header": "Pridať heslo (Zašifrovať)", - "selectText": { - "1": "Vyberte PDF na zašifrovanie", - "2": "Používateľské heslo", - "3": "Dĺžka šifrovacieho kľúča", - "4": "Vyššie hodnoty sú silnejšie, ale nižšie hodnoty majú lepšiu kompatibilitu.", - "5": "Nastavenia povolení (Odporúča sa používať spolu s heslom vlastníka)", - "6": "Zakázať zostavovanie dokumentu", - "7": "Zakázať extrakciu obsahu", - "8": "Zakázať extrakciu pre prístupnosť", - "9": "Zakázať vypĺňanie formulárov", - "10": "Zakázať úpravy", - "11": "Zakázať úpravu anotácií", - "12": "Zakázať tlač", - "13": "Zakázať tlač rôznych formátov", - "14": "Heslo vlastníka", - "15": "Obmedzuje, čo môže byť vykonané s dokumentom po jeho otvorení (Nepodporované všetkými čítačmi)", - "16": "Obmedzuje samotné otvorenie dokumentu" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Zašifrovať", "tooltip": { - "permissions": { - "title": "Zmeniť povolenia" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "zaistiť,Dešifrovať,bezpečnosť,odheslovať,vymazať heslo", - "title": "Odstrániť heslo", - "header": "Odstrániť heslo (Dešifrovať)", - "selectText": { - "1": "Vyberte PDF na dešifrovanie", - "2": "Heslo" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Odstrániť", - "desc": "Odstrániť ochranu heslom z vášho PDF dokumentu.", - "password": { - "stepTitle": "Odstrániť heslo", - "label": "Aktuálne heslo" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -824,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Názov,autor,dátum,vytvorenie,čas,vydavateľ,producent,štatistiky", - "title": "Zmeniť metadáta", "header": "Zmeniť metadáta", + "submit": "Zmeniť", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Názov,autor,dátum,vytvorenie,čas,vydavateľ,producent,štatistiky", "selectText": { "1": "Prosím, upravte premenné, ktoré chcete zmeniť", "2": "Vymazať všetky metadáta", @@ -837,15 +1877,7 @@ "4": "Iné metadáta:", "5": "Pridať vlastný záznam metadát" }, - "author": "Autor:", - "creationDate": "Dátum vytvorenia (yyyy/MM/dd HH:mm:ss):", - "creator": "Tvorca:", - "keywords": "Kľúčové slová:", - "modDate": "Dátum úpravy (yyyy/MM/dd HH:mm:ss):", - "producer": "Producent:", - "subject": "Predmet:", - "trapped": "Zachytené:", - "submit": "Zmeniť" + "modDate": "Dátum úpravy (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformácia,formát,dokument,obrázok,prezentácia,text,konverzia,kancelária,dokumenty,word,excel,powerpoint", @@ -859,6 +1891,7 @@ "ocr": { "tags": "rozpoznanie,text,obrázok,scan,čítať,identifikovať,detekcia,upraviteľné", "title": "OCR / Čistenie skenov", + "desc": "Čistenie skenov a rozpoznanie textu z obrázkov v PDF a opätovné pridanie ako text.", "header": "Čistenie skenov / OCR (Optické rozpoznávanie znakov)", "selectText": { "1": "Vyberte jazyky, ktoré majú byť detekované v PDF (Uvedené sú tie, ktoré sú aktuálne detekované):", @@ -877,17 +1910,89 @@ "help": "Prosím, prečítajte si túto dokumentáciu o tom, ako používať OCR pre iné jazyky a/alebo použitie mimo docker", "credit": "Táto služba používa qpdf a Tesseract pre OCR.", "submit": "Spracovať PDF s OCR", - "desc": "Čistenie skenov a rozpoznanie textu z obrázkov v PDF a opätovné pridanie ako text.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Nastavenia", "ocrMode": { - "label": "OCR režim" + "label": "OCR režim", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" + }, + "languages": { + "label": "Languages", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR režim" + "title": "OCR režim", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." + }, + "languages": { + "title": "Languages", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -896,7 +2001,13 @@ "header": "Extrahovať obrázky", "selectText": "Vyberte formát obrázka na konverziu extrahovaných obrázkov", "allowDuplicates": "Save duplicate images", - "submit": "Extrahovať" + "submit": "Extrahovať", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "archív,dĺhodobé,štandard,konverzia,uchovanie", @@ -968,17 +2079,53 @@ }, "info": "Python is not installed. It is required to run." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autorizovať,iniciály,kreslený podpis,textový podpis,obrázkový podpis", "title": "Podpísať", "header": "Podpísať PDF", "upload": "Nahrať obrázok", - "draw": "Kresliť podpis", - "text": "Textový vstup", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Vymazať", "add": "Pridať", "saved": "Saved Signatures", "save": "Save Signature", + "applySignatures": "Apply Signatures", "personalSigs": "Personal Signatures", "sharedSigs": "Shared Signatures", "noSavedSigs": "No saved signatures found", @@ -990,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autorizovať,iniciály,kreslený podpis,textový podpis,obrázkový podpis" }, "flatten": { - "tags": "statické,deaktivovať,neinteraktívne,zjednodušiť", "title": "Zploštiť", "header": "Zploštiť PDF", "flattenOnlyForms": "Zploštiť iba formuláre", "submit": "Zploštiť", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Nastavenia" }, "options": { - "flattenOnlyForms": "Zploštiť iba formuláre" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Zploštiť iba formuláre", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statické,deaktivovať,neinteraktívne,zjednodušiť" }, "repair": { "tags": "opraviť,obnoviť,oprava,obnovenie", "title": "Opraviť", "header": "Opraviť PDF", - "submit": "Opraviť" + "submit": "Opraviť", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "čistenie,zjednodušiť,neobsah,organizovať", "title": "Odstrániť prázdne stránky", "header": "Odstrániť prázdne stránky", - "threshold": "Prahová hodnota bielych pixelov:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Odstrániť prázdne stránky", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "čistenie,zjednodušiť,neobsah,organizovať", "thresholdDesc": "Prahová hodnota pre určenie, ako biely musí byť biely pixel, aby bol klasifikovaný ako 'biely'. 0 = čierny, 255 = čistá biela.", - "whitePercent": "Percento bielych pixelov (%):", - "whitePercentDesc": "Percento stránky, ktoré musí byť 'biele' pixely, aby bola odstránená", - "submit": "Odstrániť prázdne stránky" + "whitePercentDesc": "Percento stránky, ktoré musí byť 'biele' pixely, aby bola odstránená" }, "removeAnnotations": { "tags": "komentáre,zdôraznenie,poznámky,označenie,odstrániť", "title": "Odstrániť anotácie", "header": "Odstrániť anotácie", - "submit": "Odstrániť" + "submit": "Odstrániť", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "odlišovať,kontrast,zmeny,analýza", @@ -1057,6 +2341,142 @@ "certSign": { "tags": "autentifikovať,PEM,P12,oficiálne,šifrovať", "title": "Podpis certifikátom", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Miesto", + "logoTitle": "Logo", + "name": "Meno", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Zadajte heslo pre Keystore alebo súkromný kľúč (ak existuje):", + "passwordOptional": "Leave empty if no password", + "reason": "Dôvod", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo", "header": "Podpísať PDF certifikátom (Práca prebieha)", "selectPDF": "Vyberte PDF súbor na podpis:", "jksNote": "Poznámka: Ak váš typ certifikátu nie je uvedený nižšie, prosím, konvertujte ho na Java Keystore (.jks) súbor pomocou nástroja keytool. Potom vyberte možnosť .jks súbor nižšie.", @@ -1064,13 +2484,7 @@ "selectCert": "Vyberte váš certifikátový súbor (formát X.509, môže byť .pem alebo .der):", "selectP12": "Vyberte váš PKCS#12 Keystore súbor (.p12 alebo .pfx) (Voliteľné, ak je poskytnuté, malo by obsahovať váš súkromný kľúč a certifikát):", "selectJKS": "Vyberte váš Java Keystore súbor (.jks alebo .keystore):", - "certType": "Typ certifikátu", - "password": "Zadajte heslo pre Keystore alebo súkromný kľúč (ak existuje):", "showSig": "Zobraziť podpis", - "reason": "Dôvod", - "location": "Miesto", - "name": "Meno", - "showLogo": "Show Logo", "submit": "Podpísať PDF" }, "removeCertSign": { @@ -1078,7 +2492,18 @@ "title": "Remove Certificate Signature", "header": "Remove the digital certificate from the PDF", "selectPDF": "Select a PDF file:", - "submit": "Remove Signature" + "submit": "Remove Signature", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "zlúčiť,zjednotiť,jednostranový pohľad,organizovať", @@ -1086,16 +2511,157 @@ "header": "Viacstranové usporiadanie", "pagesPerSheet": "Stránky na list:", "addBorder": "Pridať okraje", - "submit": "Odoslať" + "submit": "Odoslať", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "veľkosť,modifikovať,rozmery,prispôsobiť", "title": "Upraviť mierku stránky", "header": "Upraviť mierku stránky", "pageSize": "Veľkosť stránky dokumentu.", "keepPageSize": "Original Size", "scaleFactor": "Úroveň priblíženia (orezania) stránky.", - "submit": "Odoslať" + "submit": "Odoslať", + "tags": "veľkosť,modifikovať,rozmery,prispôsobiť" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "číslovať,označiť,organizovať,indexovať" @@ -1104,16 +2670,83 @@ "tags": "auto-detekcia, založené na záhlaví, organizovať, premenovať", "title": "Automatické premenovanie", "header": "Automatické premenovanie PDF", - "submit": "Automaticky premenovať" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Automaticky premenovať", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "farbová korekcia, doladenie, upraviť, zlepšiť" }, "crop": { - "tags": "orezať, zmenšiť, upraviť, tvarovať", "title": "Orezať", "header": "Orezať PDF", - "submit": "Odoslať" + "submit": "Odoslať", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "orezať, zmenšiť, upraviť, tvarovať" }, "autoSplitPDF": { "tags": "QR-založené, rozdeľ, skenovanie-segment, organizovať", @@ -1196,24 +2829,124 @@ "downloadJS": "Stiahnuť JavaScript", "submit": "Zobraziť" }, - "autoRedact": { - "tags": "redigovať, skryť, zatieniť, čierne, marker, skryté", - "title": "Automatické redigovanie", - "header": "Automatické redigovanie", - "colorLabel": "Farba", - "textsToRedactLabel": "Text na redigovanie (oddelený riadkami)", - "textsToRedactPlaceholder": "napr. \\nDôverné \\nPrísne tajné", - "useRegexLabel": "Použiť Regex", - "wholeWordSearchLabel": "Vyhľadávanie celých slov", - "customPaddingLabel": "Vlastné odsadenie", - "convertPDFToImageLabel": "Konvertovať PDF na PDF-Obrázok (Používa sa na odstránenie textu za boxom)", - "submitButton": "Odoslať" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Advanced" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Pridať", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pages", + "placeholder": "(napr. 1,2,8 alebo 4,7,12-16 alebo 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1239,17 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "wordsToRedact": { - "add": "Pridať" - } - }, - "manual": { - "pageRedactionNumbers": { - "placeholder": "(napr. 1,2,8 alebo 4,7,12-16 alebo 2n-1)" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV, extrakcia tabuliek, extrahovať, konvertovať" @@ -1260,11 +2983,15 @@ "overlay-pdfs": { "tags": "prekrývanie", "header": "Prekrytie PDF súborov", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Vyberte základný PDF súbor" }, "overlayFiles": { - "label": "Vyberte prekryvné PDF súbory" + "label": "Vyberte prekryvné PDF súbory", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Vyberte režim prekrytia", @@ -1274,14 +3001,53 @@ }, "counts": { "label": "Počty prekrytí (pre režim pevného opakovania)", - "placeholder": "Zadajte počty oddelené čiarkami (napr. 2,3,1)" + "placeholder": "Zadajte počty oddelené čiarkami (napr. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Vyberte pozíciu prekrytia", "foreground": "Popredie", "background": "Pozadie" }, - "submit": "Odoslať" + "submit": "Odoslať", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "rozdelenie sekcií, rozdeliť, prispôsobiť", @@ -1302,6 +3068,7 @@ "tags": "pečiatka, pridať obrázok, stred obrázka, vodotlač, PDF, vložiť, prispôsobiť", "header": "Pečiatka PDF", "title": "Pečiatka PDF", + "stampSetup": "Stamp Setup", "stampType": "Typ pečiatky", "stampText": "Text pečiatky", "stampImage": "Obrázok pečiatky", @@ -1314,7 +3081,19 @@ "overrideY": "Nahradiť súradnicu Y", "customMargin": "Vlastný okraj", "customColor": "Vlastná farba textu", - "submit": "Odoslať" + "submit": "Odoslať", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Remove Image,Page operations,Back end,server side" @@ -1332,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1359,40 +3139,122 @@ "version": "Verzia", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Replace-Invert Color PDF", - "selectText": { - "1": "Replace or Invert color Options", - "2": "Default(Default high contrast colors)", - "3": "Custom(Customized colors)", - "4": "Full-Invert(Invert all colors)", - "5": "High contrast color options", - "6": "white text on black background", - "7": "Black text on white background", - "8": "Yellow text on black background", - "9": "Green text on black background", - "10": "Choose text Color", - "11": "Choose background Color" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Replace" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Replace Color,Page operations,Back end,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Prihlásenie", "header": "Prihlásenie", "signin": "Prihlásiť sa", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Zapamätať si ma", "invalid": "Neplatné používateľské meno alebo heslo.", "locked": "Váš účet bol uzamknutý.", @@ -1411,12 +3273,83 @@ "alreadyLoggedIn": "You are already logged in to", "alreadyLoggedIn2": "devices. Please log out of the devices and try again.", "toManySessions": "You have too many active sessions", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF na jednu stránku", "header": "PDF na jednu stránku", - "submit": "Konvertovať na jednu stránku" + "submit": "Konvertovať na jednu stránku", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Extrahovať stránky", @@ -1440,18 +3373,59 @@ "adjustContrast": { "title": "Upraviť kontrast", "header": "Upraviť kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Jas:", "saturation": "Sýtosť:", - "download": "Stiahnuť" + "download": "Stiahnuť", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Komprimovať", + "desc": "Compress PDFs to reduce their file size.", "header": "Komprimovať PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "File Size" + }, "credit": "Táto služba používa qpdf pre kompresiu/optimalizáciu PDF.", "grayscale": { "label": "Použiť odtiene šedej na kompresiu" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1562,7 +3536,13 @@ "title": "Remove image", "header": "Remove image", "removeImage": "Remove image", - "submit": "Remove image" + "submit": "Remove image", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Split PDF by Chapters", @@ -1596,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1631,41 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Stiahnuť", - "convert": { - "title": "Konvertovať", - "settings": "Nastavenia", - "color": "Farba", - "greyscale": "Odtiene šedej", - "fillPage": "Vyplniť stránku", - "grayscale": "Odtiene šedej" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Podpísať" + "read": "Read", + "sign": "Podpísať", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, + "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Loading...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Meno", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Verzia", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Stiahnuť", - "delete": "Vymazať" + "delete": "Vymazať", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Vyčistiť PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Nastavenia" + "files": "Files", + "settings": "Nastavenia", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Pridať heslo", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Zašifrovať", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Zmeniť povolenia", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "zaistiť,bezpečnosť", + "header": "Pridať heslo (Zašifrovať)", + "selectText": { + "1": "Vyberte PDF na zašifrovanie", + "2": "Používateľské heslo", + "3": "Dĺžka šifrovacieho kľúča", + "4": "Vyššie hodnoty sú silnejšie, ale nižšie hodnoty majú lepšiu kompatibilitu.", + "5": "Nastavenia povolení (Odporúča sa používať spolu s heslom vlastníka)", + "6": "Zakázať zostavovanie dokumentu", + "7": "Zakázať extrakciu obsahu", + "8": "Zakázať extrakciu pre prístupnosť", + "9": "Zakázať vypĺňanie formulárov", + "10": "Zakázať úpravy", + "11": "Zakázať úpravu anotácií", + "12": "Zakázať tlač", + "13": "Zakázať tlač rôznych formátov", + "14": "Heslo vlastníka", + "15": "Obmedzuje, čo môže byť vykonané s dokumentom po jeho otvorení (Nepodporované všetkými čítačmi)", + "16": "Obmedzuje samotné otvorenie dokumentu" } }, "changePermissions": { "title": "Zmeniť povolenia", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Zmeniť povolenia", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Zakázať zostavovanie dokumentu" @@ -1692,10 +4580,784 @@ "label": "Zakázať tlač rôznych formátov" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Zmeniť povolenia" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Odstrániť heslo", + "desc": "Odstrániť ochranu heslom z vášho PDF dokumentu.", + "tags": "zaistiť,Dešifrovať,bezpečnosť,odheslovať,vymazať heslo", + "password": { + "stepTitle": "Odstrániť heslo", + "label": "Aktuálne heslo", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Odstrániť", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Odstrániť heslo (Dešifrovať)", + "selectText": { + "1": "Vyberte PDF na dešifrovanie", + "2": "Heslo" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or Invert color Options", + "2": "Default(Default high contrast colors)", + "3": "Custom(Customized colors)", + "4": "Full-Invert(Invert all colors)", + "5": "High contrast color options", + "6": "white text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color", + "header": "Replace-Invert Color PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "redigovať, skryť, zatieniť, čierne, marker, skryté", + "title": "Automatické redigovanie", + "header": "Automatické redigovanie", + "colorLabel": "Farba", + "textsToRedactLabel": "Text na redigovanie (oddelený riadkami)", + "textsToRedactPlaceholder": "napr. \\nDôverné \\nPrísne tajné", + "useRegexLabel": "Použiť Regex", + "wholeWordSearchLabel": "Vyhľadávanie celých slov", + "customPaddingLabel": "Vlastné odsadenie", + "convertPDFToImageLabel": "Konvertovať PDF na PDF-Obrázok (Používa sa na odstránenie textu za boxom)", + "submitButton": "Odoslať" + }, + "replaceColorPdf": { + "tags": "Replace Color,Page operations,Back end,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/sl-SI/translation.json b/frontend/public/locales/sl-SI/translation.json index 6eab0f7b6..b9ada4f0b 100644 --- a/frontend/public/locales/sl-SI/translation.json +++ b/frontend/public/locales/sl-SI/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Besedilo po meri", "numberPagesDesc": "Katere strani oštevilčiti, privzeto 'vse', sprejema tudi 1-5 ali 2,5,9 itd.", "customNumberDesc": "Privzeto na {n}, sprejema tudi 'Stran {n} od {total}', 'Besedilo-{n}', '{filename}-{n}", - "submit": "Dodaj številke strani" + "submit": "Dodaj številke strani", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Izbira strani po meri (Vnesite z vejicami ločen seznam številk strani 1,5,6 ali funkcije, kot je 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Izberi PDF(e)", "multiPdfPrompt": "Izberi PDF (2+)", "multiPdfDropPrompt": "Izberite (ali povlecite in spustite) vse datoteke PDF, ki jih potrebujete", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Opozorilo: ta postopek lahko traja do minute, odvisno od velikosti datoteke", "pageOrderPrompt": "Vrstni red strani po meri (Vnesite z vejicami ločen seznam številk strani ali funkcij, kot je 2n+1) :", - "pageSelectionPrompt": "Izbira strani po meri (Vnesite z vejicami ločen seznam številk strani 1,5,6 ali funkcije, kot je 2n+1) :", "goToPage": "Pojdi", "true": "Res", "false": "Napačno", "unknown": "Neznano", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Shrani", "saveToBrowser": "Shrani v brskalnik", + "download": "Prenos", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Razveljavi", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Zapri", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "izbrane datoteke", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Ni dodanih priljubljenih", "downloadComplete": "Prenos končan", "bored": "dolgočaseno čakanje?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "Dokument PDF je zaščiten z geslom in geslo ni bilo vneseno ali pa je bilo napačno", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Napaka", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Oprostite za težavo!", "needHelp": "Potrebujete pomoč / Ste našli težavo?", "contactTip": "Če imate še vedno težave, ne oklevajte in se obrnite na nas za pomoč. Vstopnico lahko oddate na naši strani GitHub ali nas kontaktirate prek Discorda:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Predloži vstopnico", "discordSubmit": "Discord - Pošlji objavo podpori" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Izbriši", "username": "Uporabniško ime", "password": "Geslo", @@ -82,6 +169,7 @@ "green": "zelena", "blue": "modra", "custom": "Po meri...", + "comingSoon": "Coming soon", "WorkInProgess": "Delo je v teku, morda ne bo delovalo ali bo hroščalo, prosimo, prijavite morebitne težave!", "poweredBy": "Poganja", "yes": "Da", @@ -115,12 +203,14 @@ "page": "Stran", "pages": "Strani", "loading": "Nalaganje...", + "review": "Review", "addToDoc": "Dodaj v dokument", "reset": "Ponastavi", "apply": "Uporabi", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Politika zasebnosti", + "iAgreeToThe": "I agree to all of the", "terms": "Določila in pogoji", "accessibility": "Dostopnost", "cookie": "Pravilnik o piškotkih", @@ -160,6 +250,7 @@ "title": "Ali želite izboljšati Stirling PDF?", "paragraph1": "Stirling PDF se je odločil za analitiko, ki nam pomaga izboljšati izdelek. Ne sledimo nobenim osebnim podatkom ali vsebini datotek.", "paragraph2": "Prosimo, razmislite o omogočanju analitike, ki bo pomagala rasti Stirling-PDF in nam bo omogočila boljše razumevanje naših uporabnikov.", + "learnMore": "Learn more", "enable": "Omogoči analitiko", "disable": "Onemogoči analitiko", "settings": "Nastavitve za analitiko lahko spremenite v datoteki config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Shrani vnose obrazca", "help": "Omogoči shranjevanje predhodno uporabljenih vnosov za prihodnje zagone" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "20 najboljših", "all": "Vse", "refresh": "Osveži", - "includeHomepage": "Vključi domačo stran ('/')", - "includeLoginPage": "Vključi prijavno stran ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Skupno končnih točk", "totalVisits": "Skupno število obiskov", "showing": "Prikaz", @@ -290,7 +431,9 @@ "top": "Na vrh", "numberOfVisits": "Število obiskov", "visitsTooltip": "Obiski: {0} ({1}% vseh)", - "retry": "Poskusi znova" + "retry": "Poskusi znova", + "includeHomepage": "Vključi domačo stran ('/')", + "includeLoginPage": "Vključi prijavno stran ('/login')" }, "database": { "title": "Uvoz/izvoz baze podatkov", @@ -331,22 +474,310 @@ "alphabetical": "Abecedno", "globalPopularity": "Globalna priljubljenost", "sortBy": "Razvrsti po:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF večnamensko orodje", "desc": "Spoji, zavrti, prerazporedi, razdeli in odstrani strani" }, "merge": { + "tags": "combine,join,unite", "title": "Združi", "desc": "Enostavno združite več PDF-jev v enega." }, "split": { + "tags": "divide,separate,break", "title": "Razdeli se", "desc": "Razdeli PDF-je v več dokumentov" }, "rotate": { + "tags": "turn,flip,orient", "title": "Zavrti", "desc": "Preprosto zavrtite svoje PDF-je." }, + "convert": { + "tags": "transform,change", + "title": "Pretvori", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organiziraj", + "desc": "Odstrani/Prerazporedi strani v poljubnem vrstnem redu" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Dodaj sliko", + "desc": "Doda sliko na določeno mesto v PDF-ju" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Dodaj vodni žig", + "desc": "V dokument PDF dodajte vodni žig po meri." + }, + "removePassword": { + "tags": "unlock", + "title": "Odstrani geslo", + "desc": "Odstranite zaščito z geslom iz vašega dokumenta PDF." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Stisni", + "desc": "Stisnite PDF-je, da zmanjšate njihovo velikost." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Spremeni metapodatke", + "desc": "Spremeni/Odstrani/Dodaj metapodatke iz dokumenta PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Čistilni pregledi", + "desc": "Cleanup skenira in zazna besedilo iz slik znotraj PDF-ja in ga ponovno doda kot besedilo." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Izvleči slike", + "desc": "Izvleče vse slike iz PDF-ja in jih shrani v zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Podpiši", + "desc": "Doda podpis v PDF z risbo, besedilom ali sliko" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Zravnaj", + "desc": "Odstrani vse interaktivne elemente in obrazce iz PDF-ja" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Podpiši s potrdilom", + "desc": "Podpiše PDF s potrdilom/ključem (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Popravilo", + "desc": "Poskuša popraviti poškodovan/pokvarjen PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Odstrani prazne strani", + "desc": "Zazna in odstrani prazne strani iz dokumenta" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Odstrani opombe", + "desc": "Odstrani vse komentarje/opombe iz PDF-ja" + }, + "compare": { + "tags": "difference", + "title": "Primerjaj", + "desc": "Primerja in prikazuje razlike med 2 dokumentoma PDF" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Odstrani znak potrdila", + "desc": "Odstrani podpis potrdila iz PDF-ja" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Večstranska postavitev", + "desc": "Združi več strani dokumenta PDF v eno stran" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Prilagodi velikost/merilo strani", + "desc": "Spremenite velikost/merilo strani in/ali njeno vsebino." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Dodaj številke strani", + "desc": "Dodaj številke strani skozi dokument na določeno mesto" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Prilagodi barve/kontrast", + "desc": "Prilagodi kontrast, nasičenost in svetlost PDF-ja" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Obreži PDF", + "desc": "Obrežite PDF, da zmanjšate njegovo velikost (ohranja besedilo!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Samodejno razdeli strani", + "desc": "Samodejno razdeli optično prebrane PDF-je s fizično QR kodo razdelilnika optično prebranih strani" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Pridobite VSE informacije o PDF-ju", + "desc": "Zgrabi vse možne informacije o PDF-jih" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF na eno veliko stran", + "desc": "Združi vse strani PDF v eno samo veliko stran" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Prikaži Javascript", + "desc": "Išče in prikaže vse JS, vstavljene v PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Ročna redakcija", + "desc": "Preredi PDF na podlagi izbranega besedila, narisanih oblik in/ali izbranih strani(-e)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Odstrani sliko", + "desc": "Odstranite sliko iz PDF-ja, da zmanjšate velikost datoteke" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Razdeli PDF po poglavjih", + "desc": "Razdeli PDF na več datotek glede na strukturo poglavij." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Preveri podpis PDF", + "desc": "Preveri digitalne podpise in potrdila v dokumentih PDF" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Izvleči strani", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Odstrani", + "desc": "Izbrišite neželene strani iz dokumenta PDF." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Samodejna razdelitev po velikosti/številu", + "desc": "Razdeli en PDF na več dokumentov glede na velikost, število strani ali število dokumentov" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Dodaj geslo", + "desc": "Šifrirajte svoj dokument PDF z geslom." + }, + "changePermissions": { + "title": "Spremeni dovoljenja", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Prekriva PDF-je na vrhu drugega PDF-ja", + "title": "Prekrivanje PDF-jev" + }, "imageToPDF": { "title": "Slika v PDF", "desc": "Pretvori sliko (PNG, JPEG, GIF) v PDF." @@ -355,18 +786,6 @@ "title": "PDF v sliko", "desc": "Pretvori PDF v sliko. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organiziraj", - "desc": "Odstrani/Prerazporedi strani v poljubnem vrstnem redu" - }, - "addImage": { - "title": "Dodaj sliko", - "desc": "Doda sliko na določeno mesto v PDF-ju" - }, - "watermark": { - "title": "Dodaj vodni žig", - "desc": "V dokument PDF dodajte vodni žig po meri." - }, "permissions": { "title": "Spremeni dovoljenja", "desc": "Spremenite dovoljenja vašega dokumenta PDF" @@ -375,38 +794,10 @@ "title": "Odstrani", "desc": "Izbrišite neželene strani iz dokumenta PDF." }, - "addPassword": { - "title": "Dodaj geslo", - "desc": "Šifrirajte svoj dokument PDF z geslom." - }, - "removePassword": { - "title": "Odstrani geslo", - "desc": "Odstranite zaščito z geslom iz vašega dokumenta PDF." - }, - "compress": { - "title": "Stisni", - "desc": "Stisnite PDF-je, da zmanjšate njihovo velikost." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Spremeni metapodatke", - "desc": "Spremeni/Odstrani/Dodaj metapodatke iz dokumenta PDF" - }, "fileToPDF": { "title": "Pretvori datoteko v PDF", "desc": "Pretvori skoraj vsako datoteko v PDF (DOCX, PNG, XLS, PPT, TXT in več)" }, - "ocr": { - "title": "OCR / Čistilni pregledi", - "desc": "Cleanup skenira in zazna besedilo iz slik znotraj PDF-ja in ga ponovno doda kot besedilo." - }, - "extractImages": { - "title": "Izvleči slike", - "desc": "Izvleče vse slike iz PDF-ja in jih shrani v zip" - }, "pdfToPDFA": { "title": "PDF v PDF/A", "desc": "Pretvori PDF v PDF/A za dolgoročno shranjevanje" @@ -435,70 +826,14 @@ "title": "Zaznaj/razdeli skenirane fotografije", "desc": "Razdeli več fotografij iz fotografije/PDF" }, - "sign": { - "title": "Podpiši", - "desc": "Doda podpis v PDF z risbo, besedilom ali sliko" - }, - "flatten": { - "title": "Zravnaj", - "desc": "Odstrani vse interaktivne elemente in obrazce iz PDF-ja" - }, - "repair": { - "title": "Popravilo", - "desc": "Poskuša popraviti poškodovan/pokvarjen PDF" - }, - "removeBlanks": { - "title": "Odstrani prazne strani", - "desc": "Zazna in odstrani prazne strani iz dokumenta" - }, - "removeAnnotations": { - "title": "Odstrani opombe", - "desc": "Odstrani vse komentarje/opombe iz PDF-ja" - }, - "compare": { - "title": "Primerjaj", - "desc": "Primerja in prikazuje razlike med 2 dokumentoma PDF" - }, - "certSign": { - "title": "Podpiši s potrdilom", - "desc": "Podpiše PDF s potrdilom/ključem (PEM/P12)" - }, - "removeCertSign": { - "title": "Odstrani znak potrdila", - "desc": "Odstrani podpis potrdila iz PDF-ja" - }, - "pageLayout": { - "title": "Večstranska postavitev", - "desc": "Združi več strani dokumenta PDF v eno stran" - }, - "scalePages": { - "title": "Prilagodi velikost/merilo strani", - "desc": "Spremenite velikost/merilo strani in/ali njeno vsebino." - }, "pipeline": { "title": "Cevovod", "desc": "Zaženi več dejanj na PDF-jih z definiranjem cevovodnih skriptov" }, - "addPageNumbers": { - "title": "Dodaj številke strani", - "desc": "Dodaj številke strani skozi dokument na določeno mesto" - }, "auto-rename": { "title": "Samodejno preimenuj datoteko PDF", "desc": "Samodejno preimenuje datoteko PDF glede na zaznano glavo" }, - "adjustContrast": { - "title": "Prilagodi barve/kontrast", - "desc": "Prilagodi kontrast, nasičenost in svetlost PDF-ja" - }, - "crop": { - "title": "Obreži PDF", - "desc": "Obrežite PDF, da zmanjšate njegovo velikost (ohranja besedilo!)" - }, - "autoSplitPDF": { - "title": "Samodejno razdeli strani", - "desc": "Samodejno razdeli optično prebrane PDF-je s fizično QR kodo razdelilnika optično prebranih strani" - }, "sanitizePDF": { "title": "Razkuži", "desc": "Odstrani skripte in druge elemente iz datotek PDF" @@ -519,30 +854,14 @@ "title": "PDF v Markdown", "desc": "Pretvori poljuben PDF v Markdown" }, - "getPdfInfo": { - "title": "Pridobite VSE informacije o PDF-ju", - "desc": "Zgrabi vse možne informacije o PDF-jih" - }, "pageExtracter": { "title": "Izvleček strani(e)", "desc": "Izvleče izbrane strani iz PDF-ja" }, - "pdfToSinglePage": { - "title": "PDF na eno veliko stran", - "desc": "Združi vse strani PDF v eno samo veliko stran" - }, - "showJS": { - "title": "Prikaži Javascript", - "desc": "Išče in prikaže vse JS, vstavljene v PDF" - }, "autoRedact": { "title": "Samodejno popravi", "desc": "Samodejno popravi (začrni) besedilo v PDF-ju na podlagi vnesenega besedila" }, - "redact": { - "title": "Ročna redakcija", - "desc": "Preredi PDF na podlagi izbranega besedila, narisanih oblik in/ali izbranih strani(-e)" - }, "PDFToCSV": { "title": "PDF v CSV", "desc": "Izvleče tabele iz PDF in jih pretvori v CSV" @@ -551,10 +870,6 @@ "title": "Samodejna razdelitev po velikosti/številu", "desc": "Razdeli en PDF na več dokumentov glede na velikost, število strani ali število dokumentov" }, - "overlay-pdfs": { - "title": "Prekrivanje PDF-jev", - "desc": "Prekriva PDF-je na vrhu drugega PDF-ja" - }, "split-by-sections": { "title": "Razdeli PDF po razdelkih", "desc": "Vsako stran PDF-ja razdelite na manjše vodoravne in navpične dele" @@ -563,43 +878,17 @@ "title": "Dodaj žig v PDF", "desc": "Dodaj besedilo ali slikovne žige na nastavljenih lokacijah" }, - "removeImage": { - "title": "Odstrani sliko", - "desc": "Odstranite sliko iz PDF-ja, da zmanjšate velikost datoteke" - }, - "splitByChapters": { - "title": "Razdeli PDF po poglavjih", - "desc": "Razdeli PDF na več datotek glede na strukturo poglavij." - }, - "validateSignature": { - "title": "Preveri podpis PDF", - "desc": "Preveri digitalne podpise in potrdila v dokumentih PDF" - }, "replace-color": { "title": "Napredne barvne možnosti", "desc": "Zamenjaj barvo besedila in ozadja v PDF-ju in obrni celotno barvo PDF-ja, da zmanjšaš velikost datoteke" }, - "convert": { - "title": "Pretvori" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Izvleči strani" - }, - "removePages": { - "title": "Odstrani", - "desc": "Izbrišite neželene strani iz dokumenta PDF." - }, "removeImagePdf": { "title": "Odstrani sliko", "desc": "Odstranite sliko iz PDF-ja, da zmanjšate velikost datoteke" }, - "autoSizeSplitPDF": { - "title": "Samodejna razdelitev po velikosti/številu", - "desc": "Razdeli en PDF na več dokumentov glede na velikost, število strani ali število dokumentov" - }, "adjust-contrast": { "title": "Prilagodi barve/kontrast", "desc": "Prilagodi kontrast, nasičenost in svetlost PDF-ja" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Napredne barvne možnosti", "desc": "Zamenjaj barvo besedila in ozadja v PDF-ju in obrni celotno barvo PDF-ja, da zmanjšaš velikost datoteke" - }, - "changePermissions": { - "title": "Spremeni dovoljenja" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "ogled, branje, opomba, besedilo, slika", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "spoj,operacije strani,zadnja stran,strežniška stran", "title": "Združi", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Združi", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Ime datoteke", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Združi več PDF-jev (2+)", "sortByName": "Razvrsti po imenu", "sortByDate": "Razvrsti po datumu", - "removeCertSign": "Odstraniti digitalni podpis v združeni datoteki?", - "submit": "Združi", - "sortBy": { - "filename": "Ime datoteke" - } + "removeCertSign": "Odstraniti digitalni podpis v združeni datoteki?" }, "split": { - "tags": "Operacije strani,deli,Multi Page,cut,strežniška stran", "title": "Razdeli PDF", "header": "Razdeli PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Vnesite strani za razdelitev:", "submit": "Razdeli", "steps": { + "chooseMethod": "Choose Method", "settings": "Nastavitve" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Velikost datoteke" + "name": "Velikost datoteke", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Velikost datoteke" + "label": "Velikost datoteke", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operacije strani,deli,Multi Page,cut,strežniška stran" }, "rotate": { - "tags": "strežniška stran", "title": "Zasukaj PDF", + "submit": "Zavrti", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "strežniška stran", "header": "Zasukaj PDF", - "selectAngle": "Izberite kot vrtenja (v večkratnikih 90 stopinj):", - "submit": "Zavrti" + "selectAngle": "Izberite kot vrtenja (v večkratnikih 90 stopinj):" + }, + "convert": { + "title": "Pretvori", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Nastavitve", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Barva", + "greyscale": "Sivine", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Izpolni stran", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF vsebuje digitalni podpis. To bo odstranjeno v naslednjem koraku.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Sivine", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "pretvorba,img,jpg,slika,fotografija" @@ -727,7 +1263,33 @@ "8": "Odstrani zadnjega", "9": "Odstrani prvega in zadnjega", "10": "Sodo-liho spajanje", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(npr. 1,3,2 ali 4-8,2,10-12 ali 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Dodaj sliko", "submit": "Dodaj sliko" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Besedilo, ponavljajoče se, oznaka, lastno, avtorske pravice, blagovna znamka, img, jpg, slika, fotografija", "title": "Dodaj vodni žig", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Dodaj vodni žig", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Besedilo", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Velikost pisave", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Besedilo", + "2": "Slika" + }, + "tags": "Besedilo, ponavljajoče se, oznaka, lastno, avtorske pravice, blagovna znamka, img, jpg, slika, fotografija", "header": "Dodaj vodni žig", "customColor": "Barva besedila po meri", "selectText": { @@ -755,17 +1506,6 @@ "8": "Vrsta vodnega žiga:", "9": "Slika vodnega žiga:", "10": "Pretvori PDF v PDF-sliko" - }, - "submit": "Dodaj vodni žig", - "type": { - "1": "Besedilo", - "2": "Slika" - }, - "watermarkType": { - "text": "Besedilo" - }, - "settings": { - "fontSize": "Velikost pisave" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Odstrani strani, izbriši strani", "title": "Odstrani", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Odstrani" }, - "addPassword": { - "tags": "varno,varnost", - "title": "Dodaj geslo", - "header": "Dodaj geslo (Šifriraj)", - "selectText": { - "1": "Izberite PDF za šifriranje", - "2": "Uporabniško geslo", - "3": "Dolžina šifrirnega ključa", - "4": "Višje vrednosti so močnejše, nižje vrednosti pa imajo boljšo združljivost.", - "5": "Dovoljenja za nastavitev (priporočeno za uporabo skupaj z geslom lastnika)", - "6": "Prepreči sestavljanje dokumenta", - "7": "Prepreči ekstrakcijo vsebine", - "8": "Prepreči ekstrakcijo za dostopnost", - "9": "Prepreči izpolnjevanje obrazca", - "10": "Prepreči spreminjanje", - "11": "Prepreči spreminjanje pripisov", - "12": "Prepreči tiskanje", - "13": "Prepreči tiskanje različnih formatov", - "14": "Lastniško geslo", - "15": "Omejuje, kaj je mogoče storiti z dokumentom, ko je odprt (ni podprt za vse bralnike)", - "16": "Omeji odpiranje samega dokumenta" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Šifriraj", "tooltip": { - "permissions": { - "title": "Spremeni dovoljenja" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "varno,dešifriranje,varnost,odstranitev gesla,brisanje gesla", - "title": "Odstrani geslo", - "header": "Odstrani geslo (dešifriraj)", - "selectText": { - "1": "Izberite PDF za dešifriranje", - "2": "Geslo" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Odstrani", - "desc": "Odstranite zaščito z geslom iz vašega dokumenta PDF.", - "password": { - "stepTitle": "Odstrani geslo", - "label": "Trenutno geslo" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Naslov,avtor,datum,kreacija,čas,založnik,producent,statistika", - "title": "Spremeni metapodatke", "header": "Spremeni metapodatke", + "submit": "Spremeni", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Naslov,avtor,datum,kreacija,čas,založnik,producent,statistika", "selectText": { "1": "Prosimo, uredite spremenljivke, ki jih želite spremeniti", "2": "Izbriši vse metapodatke", @@ -856,15 +1877,7 @@ "4": "Drugi metapodatki:", "5": "Dodaj vnos metapodatkov po meri" }, - "author": "Avtor:", - "creationDate": "Datum ustvarjanja (llll/MM/dd HH:mm:ss):", - "creator": "Ustvarjalec:", - "keywords": "Ključne besede:", - "modDate": "Datum spremembe (llll/MM/dd HH:mm:ss):", - "producer": "Proizvajalec:", - "subject": "Zadeva:", - "trapped": "Ujet:", - "submit": "Spremeni" + "modDate": "Datum spremembe (llll/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformacija,format,dokument,slika,diapozitiv,besedilo,konverzija,office,docs,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "prepoznavanje,besedilo,slika,skeniranje,branje,prepoznavanje,zaznavanje,urejanje", "title": "OCR / Čiščenje skeniranja", + "desc": "Cleanup skenira in zazna besedilo iz slik znotraj PDF-ja in ga ponovno doda kot besedilo.", "header": "Čistilni pregledi / OCR (optično prepoznavanje znakov)", "selectText": { "1": "Izberite jezike, ki jih želite zaznati v PDF-ju (navedeni so tisti, ki so trenutno zaznani):", @@ -896,23 +1910,89 @@ "help": "Prosimo, preberite to dokumentacijo o uporabi tega za druge jezike in/ali uporabi ne v dockerju", "credit": "Ta storitev uporablja qpdf in Tesseract za OCR.", "submit": "Obdelaj PDF z OCR", - "desc": "Cleanup skenira in zazna besedilo iz slik znotraj PDF-ja in ga ponovno doda kot besedilo.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Nastavitve", "ocrMode": { - "label": "Način OCR" + "label": "Način OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Jeziki" + "label": "Jeziki", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Način OCR" + "title": "Način OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Jeziki" + "title": "Jeziki", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Izvleci slike", "selectText": "Izberite format slike za pretvorbo ekstrahiranih slik", "allowDuplicates": "Shrani podvojene slike", - "submit": "Izvleček" + "submit": "Izvleček", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "archive,long-term,standard,conversion,storage,preservation", @@ -993,17 +2079,53 @@ }, "info": "Python ni nameščen. Za tek je potrebno." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "avtoriziraj,začetnice,narisan-podpis,besedilni-znak,podpis-slike", "title": "Podpiši", "header": "Podpiši PDF-je", "upload": "Naloži sliko", - "draw": "Nariši podpis", - "text": "Vnos besedila", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Počisti", "add": "Dodaj", "saved": "Shranjeni podpisi", "save": "Shrani podpis", + "applySignatures": "Apply Signatures", "personalSigs": "Osebni podpisi", "sharedSigs": "Skupni podpisi", "noSavedSigs": "Ni shranjenih podpisov", @@ -1015,42 +2137,179 @@ "previous": "Prejšnja stran", "maintainRatio": "Preklopi ohranjanje razmerja stranic", "undo": "Razveljavi", - "redo": "Ponovi" + "redo": "Ponovi", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "avtoriziraj,začetnice,narisan-podpis,besedilni-znak,podpis-slike" }, "flatten": { - "tags": "static,deactivate,non-interactive,streamline", "title": "Zravnaj", "header": "Zravnaj PDF", "flattenOnlyForms": "Splošči samo obrazce", "submit": "Zravnaj", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Nastavitve" }, "options": { - "flattenOnlyForms": "Splošči samo obrazce" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Splošči samo obrazce", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "static,deactivate,non-interactive,streamline" }, "repair": { "tags": "popravi,obnovi,popravi,obnovi", "title": "Popravilo", "header": "Popravi datoteke PDF", - "submit": "Popravilo" + "submit": "Popravilo", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "cleanup,streamline,non-content,organize", "title": "Odstrani praznine", "header": "Odstrani prazne strani", - "threshold": "Prag beline slikovnih pik:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Odstrani praznine", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "cleanup,streamline,non-content,organize", "thresholdDesc": "Prag za določanje, kako bel mora biti bel piksel, da je označen kot 'bel'. 0 = črna, 255 čisto bela.", - "whitePercent": "Odstotek beline (%):", - "whitePercentDesc": "Odstotek strani, ki mora imeti 'bele' slikovne pike za odstranitev", - "submit": "Odstrani praznine" + "whitePercentDesc": "Odstotek strani, ki mora imeti 'bele' slikovne pike za odstranitev" }, "removeAnnotations": { "tags": "comments,highlight,notes,markup,remove", "title": "Odstrani opombe", "header": "Odstrani opombe", - "submit": "Odstrani" + "submit": "Odstrani", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "diferenciiraj,kontrast,spremembe,analiza", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "avtentikacija,PEM,P12,uradno,šifriranje", "title": "Podpisovanje potrdila", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Lokacija", + "logoTitle": "Logo", + "name": "Ime", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Vnesite geslo shrambe ključev ali zasebnega ključa (če obstaja):", + "passwordOptional": "Leave empty if no password", + "reason": "Razlog", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Prikaži logotip", "header": "Podpišite PDF s svojim potrdilom (Delo v teku)", "selectPDF": "Izberite datoteko PDF za podpis:", "jksNote": "Opomba: Če vaša vrsta potrdila ni navedena spodaj, jo pretvorite v datoteko Java Keystore (.jks) z orodjem ukazne vrstice keytool. Nato spodaj izberite možnost datoteke .jks.", @@ -1089,13 +2484,7 @@ "selectCert": "Izberite svojo datoteko potrdila (format X.509, lahko je .pem ali .der):", "selectP12": "Izberite datoteko shrambe ključev PKCS#12 (.p12 ali .pfx) (izbirno, če je na voljo, mora vsebovati vaš zasebni ključ in potrdilo):", "selectJKS": "Izberite datoteko shrambe ključev Java (.jks ali .keystore):", - "certType": "Vrsta potrdila", - "password": "Vnesite geslo shrambe ključev ali zasebnega ključa (če obstaja):", "showSig": "Prikaži podpis", - "reason": "Razlog", - "location": "Lokacija", - "name": "Ime", - "showLogo": "Prikaži logotip", "submit": "Podpiši PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Odstrani podpis potrdila", "header": "Odstranite digitalno potrdilo iz PDF-ja", "selectPDF": "Izberite datoteko PDF:", - "submit": "Odstrani podpis" + "submit": "Odstrani podpis", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "spoji,sestavi,enojni pogled,organiziraj", @@ -1111,16 +2511,157 @@ "header": "Postavitev več strani", "pagesPerSheet": "Strani na list:", "addBorder": "Dodaj obrobe", - "submit": "Pošlji" + "submit": "Pošlji", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "resize,modify,dimension,adapt", "title": "Prilagodi velikost strani", "header": "Prilagodi velikost strani", "pageSize": "Velikost strani dokumenta.", "keepPageSize": "Izvirna velikost", "scaleFactor": "Raven povečave (obrezovanje) strani.", - "submit": "Pošlji" + "submit": "Pošlji", + "tags": "resize,modify,dimension,adapt" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginate,label,organize,index" @@ -1129,16 +2670,83 @@ "tags": "samodejno zaznaj,na podlagi glave,organiziraj,preoznači", "title": "Samodejno preimenuj", "header": "Samodejno preimenuj PDF", - "submit": "Samodejno preimenuj" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Samodejno preimenuj", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "color-correction,tune,modify,enhance,colour-correction" }, "crop": { - "tags": "obreži, skrči, uredi, oblikuj", "title": "Obrezovanje", "header": "Obreži PDF", - "submit": "Pošlji" + "submit": "Pošlji", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "obreži, skrči, uredi, oblikuj" }, "autoSplitPDF": { "tags": "Na osnovi QR,ločeno,skeniranje-segment,organiziranje", @@ -1221,24 +2829,124 @@ "downloadJS": "Prenesi Javascript", "submit": "Pokaži" }, - "autoRedact": { - "tags": "Uredi,Skrij,zatemni,črno,marker,skrito", - "title": "Samodejno redigiraj", - "header": "Samodejno redigiraj", - "colorLabel": "Barva", - "textsToRedactLabel": "Besedilo za redigiranje (ločeno z vrsticami)", - "textsToRedactPlaceholder": "npr. \\nZaupno \\nStrogo zaupno", - "useRegexLabel": "Uporabi regularni izraz", - "wholeWordSearchLabel": "Iskanje po celi besedi", - "customPaddingLabel": "Dodatno oblazinjenje po meri", - "convertPDFToImageLabel": "Pretvori PDF v PDF-sliko (Uporablja se za odstranitev besedila za poljem)", - "submitButton": "Pošlji" - }, "redact": { "tags": "Uredi,Skrij,zatemni,črno,marker,skrito,ročno", "title": "Ročna redakcija", - "header": "Ročna redakcija", "submit": "Uredi", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Napredno" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Dodaj", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Strani", + "placeholder": "(npr. 1,2,8 ali 4,7,12-16 ali 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Izvozi", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Ročna redakcija", "textBasedRedaction": "Redakcija na podlagi besedila", "pageBasedRedaction": "Redakcija na podlagi strani", "convertPDFToImageLabel": "Pretvori PDF v PDF-sliko (Uporablja se za odstranjevanje besedila za poljem)", @@ -1264,22 +2972,7 @@ "showLayers": "Prikaži plasti (dvokliknite za ponastavitev vseh plasti na privzeto stanje)", "colourPicker": "Izbirnik barv", "findCurrentOutlineItem": "Poišči trenutno postavko orisa", - "applyChanges": "Uporabi spremembe", - "auto": { - "settings": { - "advancedTitle": "Napredno" - }, - "wordsToRedact": { - "add": "Dodaj" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Strani", - "placeholder": "(npr. 1,2,8 ali 4,7,12-16 ali 2n-1)" - }, - "export": "Izvozi" - } + "applyChanges": "Uporabi spremembe" }, "tableExtraxt": { "tags": "CSV, ekstrakcija tabele, ekstrah, pretvorba" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "Prekrivanje", "header": "Prekrivne datoteke PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Izberite osnovno datoteko PDF" }, "overlayFiles": { - "label": "Izberite Prekrivne datoteke PDF" + "label": "Izberite Prekrivne datoteke PDF", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Izberi način prekrivanja", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "Število prekrivanj (za fiksni način ponavljanja)", - "placeholder": "Vnesite število, ločeno z vejico (npr. 2,3,1)" + "placeholder": "Vnesite število, ločeno z vejico (npr. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Izberi položaj prekrivanja", "foreground": "Ospredje", "background": "Ozadje" }, - "submit": "Pošlji" + "submit": "Pošlji", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Oddelek Razdeli, razdeli, prilagodi, prilagodi", @@ -1332,6 +3068,7 @@ "tags": "Žig, Dodaj sliko, sredinska slika, Vodni žig, PDF, Vdelaj, Prilagodi, Prilagodi", "header": "Ožigosajte PDF", "title": "Ožigosajte PDF", + "stampSetup": "Stamp Setup", "stampType": "Vrsta žiga", "stampText": "Označi besedilo", "stampImage": "Označi sliko", @@ -1344,7 +3081,19 @@ "overrideY": "Preglasi Y koordinato", "customMargin": "Margina po meri", "customColor": "Barva besedila po meri", - "submit": "Pošlji" + "submit": "Pošlji", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Odstrani sliko,operacije strani,zadnja stran,strežniška stran" @@ -1362,7 +3111,8 @@ "status": { "_value": "Stanje", "valid": "Veljaven", - "invalid": "Neveljavno" + "invalid": "Neveljavno", + "complete": "Validation complete" }, "signer": "Podpisnik", "date": "Datum", @@ -1389,40 +3139,122 @@ "version": "Različica", "keyUsage": "Uporaba ključa", "selfSigned": "Samopodpisano", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Informacije o podpisu", "_value": "Podpis", "mathValid": "Podpis je matematično veljaven AMPAK:" }, - "selectCustomCert": "Datoteka potrdila po meri X.509 (izbirno)" - }, - "replace-color": { - "title": "Napredne barvne možnosti", - "header": "Zamenjaj-Obrni barvni PDF", - "selectText": { - "1": "Zamenjaj ali obrni barvne možnosti", - "2": "Privzeto (privzete barve z visokim kontrastom)", - "3": "Po meri (barve po meri)", - "4": "Full-Invert(Invert vse barve)", - "5": "Možnosti barv z visokim kontrastom", - "6": "belo besedilo na črnem ozadju", - "7": "Črno besedilo na belem ozadju", - "8": "Rumeno besedilo na črnem ozadju", - "9": "Zeleno besedilo na črnem ozadju", - "10": "Izberi barvo besedila", - "11": "Izberi barvo ozadja" + "selectCustomCert": "Datoteka potrdila po meri X.509 (izbirno)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Zamenjaj" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Zamenjaj barvo,operacije strani,zadnja stran,strežniška stran" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Prijava", "header": "Prijava", "signin": "Prijava", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Zapomni si me", "invalid": "Neveljavno uporabniško ime ali geslo.", "locked": "Vaš račun je bil zaklenjen.", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "Prijavljeni ste že v", "alreadyLoggedIn2": "naprave. Odjavite se iz naprav in poskusite znova.", "toManySessions": "Imate preveč aktivnih sej", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF na eno stran", "header": "PDF na eno stran", - "submit": "Pretvori v eno stran" + "submit": "Pretvori v eno stran", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Izvleči strani", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "Prilagodi kontrast", "header": "Prilagodi kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Svetlost:", "saturation": "Nasičenost:", - "download": "Prenos" + "download": "Prenos", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Stisnite", + "desc": "Compress PDFs to reduce their file size.", "header": "Stisnite PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Velikost datoteke" + }, "credit": "Ta storitev uporablja qpdf za stiskanje/optimizacijo PDF.", "grayscale": { "label": "Uporabi sivinsko lestvico za stiskanje" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Nastavitve stiskanja", @@ -1491,10 +3435,7 @@ "4": "Samodejni način - Samodejno prilagodi kakovost, da dobi PDF na natančno velikost", "5": "Pričakovana velikost PDF (npr. 25 MB, 10,8 MB, 25 KB)" }, - "submit": "Stisnite", - "method": { - "filesize": "Velikost datoteke" - } + "submit": "Stisnite" }, "decrypt": { "passwordPrompt": "Ta datoteka je zaščitena z geslom. Prosim vnesite geslo:", @@ -1595,7 +3536,13 @@ "title": "Odstrani sliko", "header": "Odstrani sliko", "removeImage": "Odstrani sliko", - "submit": "Odstrani sliko" + "submit": "Odstrani sliko", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Razdeli PDF po poglavjih", @@ -1629,6 +3576,12 @@ }, "note": "Opombe ob izdaji so na voljo samo v angleščini" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,54 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Prenos", - "undo": "Razveljavi", - "convert": { - "title": "Pretvori", - "settings": "Nastavitve", - "color": "Barva", - "greyscale": "Sivine", - "fillPage": "Izpolni stran", - "pdfaDigitalSignatureWarning": "PDF vsebuje digitalni podpis. To bo odstranjeno v naslednjem koraku.", - "grayscale": "Sivine" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Izberi vse", - "deselectAll": "Prekliči izbor vseh" + "deselectAll": "Prekliči izbor vseh", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Podpiši" + "read": "Read", + "sign": "Podpiši", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Nalaganje...", - "or": "ali" + "or": "ali", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Ime", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Različica", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Izberi vse", "deselectAll": "Prekliči izbor vseh", "deleteSelected": "Izbriši izbrano", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Prenos", - "delete": "Izbriši" + "delete": "Izbriši", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Prečisti PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Nastavitve" + "files": "Files", + "settings": "Nastavitve", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Dodaj geslo", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Šifriraj", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Spremeni dovoljenja", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "varno,varnost", + "header": "Dodaj geslo (Šifriraj)", + "selectText": { + "1": "Izberite PDF za šifriranje", + "2": "Uporabniško geslo", + "3": "Dolžina šifrirnega ključa", + "4": "Višje vrednosti so močnejše, nižje vrednosti pa imajo boljšo združljivost.", + "5": "Dovoljenja za nastavitev (priporočeno za uporabo skupaj z geslom lastnika)", + "6": "Prepreči sestavljanje dokumenta", + "7": "Prepreči ekstrakcijo vsebine", + "8": "Prepreči ekstrakcijo za dostopnost", + "9": "Prepreči izpolnjevanje obrazca", + "10": "Prepreči spreminjanje", + "11": "Prepreči spreminjanje pripisov", + "12": "Prepreči tiskanje", + "13": "Prepreči tiskanje različnih formatov", + "14": "Lastniško geslo", + "15": "Omejuje, kaj je mogoče storiti z dokumentom, ko je odprt (ni podprt za vse bralnike)", + "16": "Omeji odpiranje samega dokumenta" } }, "changePermissions": { "title": "Spremeni dovoljenja", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Spremeni dovoljenja", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Prepreči sestavljanje dokumenta" @@ -1738,10 +4580,784 @@ "label": "Prepreči tiskanje različnih formatov" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Spremeni dovoljenja" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Odstrani geslo", + "desc": "Odstranite zaščito z geslom iz vašega dokumenta PDF.", + "tags": "varno,dešifriranje,varnost,odstranitev gesla,brisanje gesla", + "password": { + "stepTitle": "Odstrani geslo", + "label": "Trenutno geslo", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Odstrani", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Odstrani geslo (dešifriraj)", + "selectText": { + "1": "Izberite PDF za dešifriranje", + "2": "Geslo" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Zamenjaj ali obrni barvne možnosti", + "2": "Privzeto (privzete barve z visokim kontrastom)", + "3": "Po meri (barve po meri)", + "4": "Full-Invert(Invert vse barve)", + "5": "Možnosti barv z visokim kontrastom", + "6": "belo besedilo na črnem ozadju", + "7": "Črno besedilo na belem ozadju", + "8": "Rumeno besedilo na črnem ozadju", + "9": "Zeleno besedilo na črnem ozadju", + "10": "Izberi barvo besedila", + "11": "Izberi barvo ozadja", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Zamenjaj", + "title": "Napredne barvne možnosti", + "header": "Zamenjaj-Obrni barvni PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Uredi,Skrij,zatemni,črno,marker,skrito", + "title": "Samodejno redigiraj", + "header": "Samodejno redigiraj", + "colorLabel": "Barva", + "textsToRedactLabel": "Besedilo za redigiranje (ločeno z vrsticami)", + "textsToRedactPlaceholder": "npr. \\nZaupno \\nStrogo zaupno", + "useRegexLabel": "Uporabi regularni izraz", + "wholeWordSearchLabel": "Iskanje po celi besedi", + "customPaddingLabel": "Dodatno oblazinjenje po meri", + "convertPDFToImageLabel": "Pretvori PDF v PDF-sliko (Uporablja se za odstranitev besedila za poljem)", + "submitButton": "Pošlji" + }, + "replaceColorPdf": { + "tags": "Zamenjaj barvo,operacije strani,zadnja stran,strežniška stran" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/sr-LATN-RS/translation.json b/frontend/public/locales/sr-LATN-RS/translation.json index 2503eba23..1b802d4df 100644 --- a/frontend/public/locales/sr-LATN-RS/translation.json +++ b/frontend/public/locales/sr-LATN-RS/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Prilagođeni tekst", "numberPagesDesc": "Koje stranice brojati, podrazumevano 'sve', takođe prihvata 1-5 ili 2,5,9 itd.", "customNumberDesc": "Podrazumevano je {n}, takođe prihvata 'Stranica {n} od {ukupno}', 'Tekst-{n}', '{ime_fajla}-{n}'", - "submit": "Dodaj brojeve stranica" + "submit": "Dodaj brojeve stranica", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Prilagođeni redosled stranica (unesi listu brojeva stranica 1,5,6 ili funkcija, kao što je 2n+1, razdvojenih zarezima) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Odaberi PDF(ove)", "multiPdfPrompt": "Odaberi PDF-ove (2+)", "multiPdfDropPrompt": "Odaberi (prevuci i pusti ) sve PDF-ove koji su vam potrebni", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "su preveliki. Maksimalna dozvoljena veličina je", "processTimeWarning": "Warning:Upozorenje: Ovaj proces može trajati i do minut, u zavisnosti od veličine dokumenta", "pageOrderPrompt": "Prilagođeni redosled stranica (unesi listu brojeva stranica ili funkcija, kao što su 2n+1, razdvojene zarezima) :", - "pageSelectionPrompt": "Prilagođeni redosled stranica (unesi listu brojeva stranica 1,5,6 ili funkcija, kao što je 2n+1, razdvojenih zarezima) :", "goToPage": "Idi", "true": "Tačno", "false": "Netačno", "unknown": "Nepoznato", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Sačuvaj", "saveToBrowser": "Sačuvaj u pregledaču", + "download": "Preuzmi", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Poništi", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Zatvori", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "odabrani fajlovi", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Nema dodatih favorita", "downloadComplete": "Preuzimanje završeno", "bored": "Da li ti je dosadno dok čekaš?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF dokument je šifrovan i lozinka nije data ili je netačna", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Error", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Izvinjavamo se zbog problema!", "needHelp": "Potrebna pomoć / Naišli ste na problem?", "contactTip": "Ako i dalje imaš problema, ne oklevaj da nas kontaktiraš za pomoć. Možeš poslati prijavu na našoj GitHub stranici ili nas kontaktirati putem Discord-a:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - pošalji prijavu", "discordSubmit": "Discord - pošalji poruku za podršku" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Obriši", "username": "Korisničko ime", "password": "Šifra", @@ -82,6 +169,7 @@ "green": "Zeleno", "blue": "Plavo", "custom": "Prilagođeno...", + "comingSoon": "Coming soon", "WorkInProgess": "Radovi u toku, možda neće raditi ili će biti grešaka, molimo prijavite sve probleme !", "poweredBy": "Omogućeno od strane", "yes": "Da", @@ -115,12 +203,14 @@ "page": "Strana", "pages": "Strane", "loading": "Učitavam...", + "review": "Review", "addToDoc": "Dodaj u dokument", "reset": "Resetuj", "apply": "Primeni", "noFileSelected": "Datoteka nije izabrana. Otpremi jednu.", "legal": { "privacy": "Politika privatnosti", + "iAgreeToThe": "I agree to all of the", "terms": "Uslovi i odredbe", "accessibility": "Pristupačnost", "cookie": "Politika kolačića", @@ -160,6 +250,7 @@ "title": "Želiš li da učiniš Stirling PDF boljim?", "paragraph1": "Stirling PDF ima opcioni sistem analitike koji nam pomaže da unapredimo proizvod. Ne pratimo nikakve lične podatke niti sadržaj fajlova.", "paragraph2": "Molimo te da razmotriš uključivanje analitike kako bi pomogao Stirling PDF-u da raste i omogućio nam bolje razumevanje naših korisnika.", + "learnMore": "Learn more", "enable": "Omogući analitiku", "disable": "Onemogući analitiku", "settings": "Možeš da promeniš podešavanja za analitiku u config/settings.yml datoteci" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Sačuvaj unete podatke", "help": "Omogući prethodno unete podatke za buduće korišćenje" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "Svi", "refresh": "Osveži", - "includeHomepage": "Uključi početnu stranu ('/')", - "includeLoginPage": "Uključi stranu za prijavu ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Ukupno krajnjih tačaka", "totalVisits": "Ukupno poseta", "showing": "Prikaz", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Broj poseta", "visitsTooltip": "Poseta: {0} ({1}% od ukupno)", - "retry": "Pokušaj ponovo" + "retry": "Pokušaj ponovo", + "includeHomepage": "Uključi početnu stranu ('/')", + "includeLoginPage": "Uključi stranu za prijavu ('/login')" }, "database": { "title": "Uvoz/izvoz baze", @@ -331,22 +474,310 @@ "alphabetical": "Abecedno", "globalPopularity": "Globalna popularnost", "sortBy": "Sortiranje:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Multi Alat", "desc": "Spajanje, rotacija, premeštanje i uklanjanje stranica" }, "merge": { + "tags": "combine,join,unite", "title": "Spajanje", "desc": "Lako spojite više PDF-ova u jedan." }, "split": { + "tags": "divide,separate,break", "title": "Razdvajanje", "desc": "Razdvojite PDF-ove u više dokumenata" }, "rotate": { + "tags": "turn,flip,orient", "title": "Rotacija", "desc": "Lako rotirajte vaše PDF-ove." }, + "convert": { + "tags": "transform,change", + "title": "Konvertuj", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organizacija", + "desc": "Uklonite/Premeštajte stranice u bilo kom redosledu" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Dodaj sliku", + "desc": "Dodaje sliku na određeno mesto u PDF-u" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Dodaj vodeni žig", + "desc": "Dodajte prilagođeni vodeni žig na vaš PDF dokument." + }, + "removePassword": { + "tags": "unlock", + "title": "Ukloni lozinku", + "desc": "Uklonite zaštitu lozinkom sa vašeg PDF dokumenta." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Kompresuj", + "desc": "Kompresujte PDF-ove kako bi smanjili veličinu fajla." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Otključaj PDF obrazac", + "desc": "Uklanjanje oznake samo-za-čitanje sa svih polja PDF obrasca" + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Promena metapodataka", + "desc": "Promenite/Uklonite/Dodajte metapodatke u PDF dokumentu" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Čišćenje skenova", + "desc": "Čišćenje skenova i detektovanje teksta sa slika unutar PDF-a i ponovno dodavanje kao teksta." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Izvuci slike", + "desc": "Izvlači sve slike iz PDF-a i čuva ih u zip formatu" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Potpis", + "desc": "Dodaje potpis u PDF crtežom, tekstom ili slikom" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Ravnanje", + "desc": "Uklanja sve interaktivne elemente i forme iz PDF-a" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Potpis sa sertifikatom", + "desc": "Potpisuje PDF sa sertifikatom/ključem (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Popravi", + "desc": "Pokušava popraviti oštećeni/izgubljeni PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Ukloni prazne stranice", + "desc": "Detektuje i uklanja prazne stranice iz dokumenta" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Ukloni Anotacije", + "desc": "Uklanja sve komentare/anotacije iz PDF-a" + }, + "compare": { + "tags": "difference", + "title": "Uporedi", + "desc": "Upoređuje i prikazuje razlike između 2 PDF dokumenata" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Uklanjanje digitalnog potpisa", + "desc": "Uklanjanje digitalnog potpisa sa sertifikatom iz PDF-a" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Višestruki prikaz stranica", + "desc": "Spaja više stranica PDF dokumenta u jednu stranicu" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Podesi veličinu/skalu stranice", + "desc": "Podesi veličinu/skalu stranice i/ili njenog sadržaja." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Dodaj brojeve stranica", + "desc": "Dodaje brojeve stranica u dokumentu na određeno mesto" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Podesi boje/kontrast", + "desc": "Podesi kontrast, zasićenost i osvetljenost PDF-a" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Skraćivanje PDF-a", + "desc": "Skraćuje PDF radi smanjenja veličine (zadržava tekst!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Automatsko razdvajanje stranica", + "desc": "Automatski deli skenirane PDF-ove pomoću fizičkog skenera QR koda" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Dohvati SVE informacije o PDF-u", + "desc": "Dobavlja sve moguće informacije o PDF-ovima" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF u Jednu Veliku Stranicu", + "desc": "Spaja sve stranice PDF-a u jednu veliku stranicu" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Prikaži JavaScript", + "desc": "Pretražuje i prikazuje bilo koji JavaScript ubačen u PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Ukloni sliku", + "desc": "Remove image from PDF to reduce file size" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Podeli PDF po poglavljima", + "desc": "Split a PDF into multiple files based on its chapter structure." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Proveri PDF potpis", + "desc": "Verifikacija digitalnog potpisa i sertifikata u PDF dokumentu" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Izmeni sadržaj", + "desc": "Dodaj ili izmeni obeleživače i sadržaj u PDF dokumentima" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Izdvajanje stranica", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Ukloni", + "desc": "Brisanje nepotrebnih stranice iz PDF dokumenta" + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Automatsko deljenje po veličini/broju", + "desc": "Deljenje jednog PDF-a na više na osnovu veličine, broja stranica ili broja dokumenata" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Dodaj lozinku", + "desc": "Enkriptujte vaš PDF dokument lozinkom." + }, + "changePermissions": { + "title": "Promeni dozvole", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Preklapa PDF-ove jedan preko drugog", + "title": "Preklapanje PDF-ova" + }, "imageToPDF": { "title": "Slika u PDF", "desc": "Konvertujte sliku (PNG, JPEG, GIF) u PDF." @@ -355,18 +786,6 @@ "title": "PDF u Sliku", "desc": "Konvertujte PDF u sliku. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organizacija", - "desc": "Uklonite/Premeštajte stranice u bilo kom redosledu" - }, - "addImage": { - "title": "Dodaj sliku", - "desc": "Dodaje sliku na određeno mesto u PDF-u" - }, - "watermark": { - "title": "Dodaj vodeni žig", - "desc": "Dodajte prilagođeni vodeni žig na vaš PDF dokument." - }, "permissions": { "title": "Promeni dozvole", "desc": "Promenite dozvole vašeg PDF dokumenta" @@ -375,38 +794,10 @@ "title": "Ukloni", "desc": "Obrišite nepotrebne stranice iz vašeg PDF dokumenta." }, - "addPassword": { - "title": "Dodaj lozinku", - "desc": "Enkriptujte vaš PDF dokument lozinkom." - }, - "removePassword": { - "title": "Ukloni lozinku", - "desc": "Uklonite zaštitu lozinkom sa vašeg PDF dokumenta." - }, - "compress": { - "title": "Kompresuj", - "desc": "Kompresujte PDF-ove kako bi smanjili veličinu fajla." - }, - "unlockPDFForms": { - "title": "Otključaj PDF obrazac", - "desc": "Uklanjanje oznake samo-za-čitanje sa svih polja PDF obrasca" - }, - "changeMetadata": { - "title": "Promena metapodataka", - "desc": "Promenite/Uklonite/Dodajte metapodatke u PDF dokumentu" - }, "fileToPDF": { "title": "Konvertuj fajl u PDF", "desc": "Konvertujte gotovo bilo koji fajl u PDF (DOCX, PNG, XLS, PPT, TXT i više)" }, - "ocr": { - "title": "OCR / Čišćenje skenova", - "desc": "Čišćenje skenova i detektovanje teksta sa slika unutar PDF-a i ponovno dodavanje kao teksta." - }, - "extractImages": { - "title": "Izvuci slike", - "desc": "Izvlači sve slike iz PDF-a i čuva ih u zip formatu" - }, "pdfToPDFA": { "title": "PDF u PDF/A", "desc": "Konvertujte PDF u PDF/A za dugoročno čuvanje" @@ -435,70 +826,14 @@ "title": "Detekcija/Razdvajanje skeniranih fotografija", "desc": "Razdvaja više fotografija unutar slike/PDF-a" }, - "sign": { - "title": "Potpis", - "desc": "Dodaje potpis u PDF crtežom, tekstom ili slikom" - }, - "flatten": { - "title": "Ravnanje", - "desc": "Uklanja sve interaktivne elemente i forme iz PDF-a" - }, - "repair": { - "title": "Popravi", - "desc": "Pokušava popraviti oštećeni/izgubljeni PDF" - }, - "removeBlanks": { - "title": "Ukloni prazne stranice", - "desc": "Detektuje i uklanja prazne stranice iz dokumenta" - }, - "removeAnnotations": { - "title": "Ukloni Anotacije", - "desc": "Uklanja sve komentare/anotacije iz PDF-a" - }, - "compare": { - "title": "Uporedi", - "desc": "Upoređuje i prikazuje razlike između 2 PDF dokumenata" - }, - "certSign": { - "title": "Potpis sa sertifikatom", - "desc": "Potpisuje PDF sa sertifikatom/ključem (PEM/P12)" - }, - "removeCertSign": { - "title": "Uklanjanje digitalnog potpisa", - "desc": "Uklanjanje digitalnog potpisa sa sertifikatom iz PDF-a" - }, - "pageLayout": { - "title": "Višestruki prikaz stranica", - "desc": "Spaja više stranica PDF dokumenta u jednu stranicu" - }, - "scalePages": { - "title": "Podesi veličinu/skalu stranice", - "desc": "Podesi veličinu/skalu stranice i/ili njenog sadržaja." - }, "pipeline": { "title": "Pipeline (Napredno)", "desc": "Pokreće više akcija na PDF-ovima definisanjem skripti u pipelinu" }, - "addPageNumbers": { - "title": "Dodaj brojeve stranica", - "desc": "Dodaje brojeve stranica u dokumentu na određeno mesto" - }, "auto-rename": { "title": "Automatsko preimenovanje PDF fajla", "desc": "Automatski menja ime PDF fajla na osnovu detektovanog zaglavlja" }, - "adjustContrast": { - "title": "Podesi boje/kontrast", - "desc": "Podesi kontrast, zasićenost i osvetljenost PDF-a" - }, - "crop": { - "title": "Skraćivanje PDF-a", - "desc": "Skraćuje PDF radi smanjenja veličine (zadržava tekst!)" - }, - "autoSplitPDF": { - "title": "Automatsko razdvajanje stranica", - "desc": "Automatski deli skenirane PDF-ove pomoću fizičkog skenera QR koda" - }, "sanitizePDF": { "title": "Sanitizacija", "desc": "Uklanja skripte i druge elemente iz PDF fajlova" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Dohvati SVE informacije o PDF-u", - "desc": "Dobavlja sve moguće informacije o PDF-ovima" - }, "pageExtracter": { "title": "Izdvajanje stranica", "desc": "Izdvaja odabrane stranice iz PDF-a" }, - "pdfToSinglePage": { - "title": "PDF u Jednu Veliku Stranicu", - "desc": "Spaja sve stranice PDF-a u jednu veliku stranicu" - }, - "showJS": { - "title": "Prikaži JavaScript", - "desc": "Pretražuje i prikazuje bilo koji JavaScript ubačen u PDF" - }, "autoRedact": { "title": "Automatsko Cenzurisanje", "desc": "Automatsko cenzurisanje teksta u PDF-u na osnovu unetog teksta" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF u CSV", "desc": "Izdvaja tabele iz PDF-a pretvarajući ih u CSV" @@ -551,10 +870,6 @@ "title": "Automatsko Deljenje po Veličini/Broju", "desc": "Deljenje jednog PDF-a na više dokumenata na osnovu veličine, broja stranica ili broja dokumenata" }, - "overlay-pdfs": { - "title": "Preklapanje PDF-ova", - "desc": "Preklapa PDF-ove jedan preko drugog" - }, "split-by-sections": { "title": "Deljenje PDF-a po Odeljcima", "desc": "Deljenje svake stranice PDF-a na manje horizontalne i vertikalne odeljke" @@ -563,48 +878,18 @@ "title": "Dodaj pečat u PDF", "desc": "Dodavanje teksta ili slike pečeta na željenim lokacijama" }, - "removeImage": { - "title": "Ukloni sliku", - "desc": "Remove image from PDF to reduce file size" - }, - "splitByChapters": { - "title": "Podeli PDF po poglavljima", - "desc": "Split a PDF into multiple files based on its chapter structure." - }, - "validateSignature": { - "title": "Proveri PDF potpis", - "desc": "Verifikacija digitalnog potpisa i sertifikata u PDF dokumentu" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" }, - "convert": { - "title": "Konvertuj" - }, "attachments": { "title": "Dodaj priloge", "desc": "Dodavanje ili uklanjanje uključenih datoteka (priloga) u/iz PDF-a" }, - "editTableOfContents": { - "title": "Izmeni sadržaj", - "desc": "Dodaj ili izmeni obeleživače i sadržaj u PDF dokumentima" - }, - "extractPages": { - "title": "Izdvajanje stranica" - }, - "removePages": { - "title": "Ukloni", - "desc": "Brisanje nepotrebnih stranice iz PDF dokumenta" - }, "removeImagePdf": { "title": "Ukloni sliku", "desc": "Uklanjanje slike iz PDF-a u cilju smanjenja veličine datoteke" }, - "autoSizeSplitPDF": { - "title": "Automatsko deljenje po veličini/broju", - "desc": "Deljenje jednog PDF-a na više na osnovu veličine, broja stranica ili broja dokumenata" - }, "adjust-contrast": { "title": "Podesi boje/kontrast", "desc": "Podešavanje kontrasta, zasićenosti i osvetljenost PDF-a" @@ -612,11 +897,12 @@ "replaceColorPdf": { "title": "Napredna podešavanja boja", "desc": "Zameni boju teksta i pozadine u PDF i invertuj celokupnu boju PDF-a u cilju smanjenja veličine datoteke" - }, - "changePermissions": { - "title": "Promeni dozvole" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "pregled,čitanje,anotiranje,tekst,slika", "title": "Pogledaj/Izmeni PDF", @@ -650,17 +936,39 @@ "merge": { "tags": "spajanje,Operacije sa stranicama,Backend,server strana", "title": "Spajanje", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Spajanje", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Ime datoteke", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Spajanje više PDF fajlova (2+)", "sortByName": "Sortiraj po imenu", "sortByDate": "Sortiraj po datumu", - "removeCertSign": "Remove digital signature in the merged file?", - "submit": "Spajanje", - "sortBy": { - "filename": "Ime datoteke" - } + "removeCertSign": "Remove digital signature in the merged file?" }, "split": { - "tags": "Operacije sa stranicama,podela,Višestruke stranice,sečenje,server strana", "title": "Razdvajanje PDF-a", "header": "Razdvajanje PDF-a", "desc": { @@ -676,25 +984,249 @@ "splitPages": "Unesite stranice za razdvajanje:", "submit": "Razdvoji", "steps": { + "chooseMethod": "Choose Method", "settings": "Podešavanja" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Veličina datoteke" + "name": "Veličina datoteke", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Veličina datoteke" + "label": "Veličina datoteke", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operacije sa stranicama,podela,Višestruke stranice,sečenje,server strana" }, "rotate": { - "tags": "server strana", "title": "Rotiranje PDF-a", + "submit": "Rotiraj", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "server strana", "header": "Rotiranje PDF-a", - "selectAngle": "Izaberite ugao rotacije (u višestrukim od 90 stepeni):", - "submit": "Rotiraj" + "selectAngle": "Izaberite ugao rotacije (u višestrukim od 90 stepeni):" + }, + "convert": { + "title": "Konvertuj", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Podešavanja", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Boja", + "greyscale": "Monohromatski", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Popuni stranicu", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF sadrži digitalni potpis. Biće uklonjen u sledećem koraku.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Monohromatski", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konverzija,img,jpg,slika,foto" @@ -732,7 +1264,33 @@ "8": "Ukloni poslednju", "9": "Ukloni prvu i poslednju", "10": "Spoji neparne i parne stranice", - "11": "Dupliraj sve stranice" + "11": "Dupliraj sve stranice", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(npr. 1,3,2 ili 4-8,2,10-12 ili 2n-1)" }, @@ -744,9 +1302,198 @@ "upload": "Dodaj sliku", "submit": "Dodaj sliku" }, + "attachments": { + "tags": "uključi,dodaj,datoteka,prilog,prilozi", + "title": "Dodaj priloge", + "header": "Dodaj priloge", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Dodaj priloge" + }, "watermark": { - "tags": "Tekst,ponavljanje,etiketa,vlastiti,autorsko pravo,zaštita, img,jpg,slika,foto", "title": "Dodaj vodeni žig", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Dodaj vodeni žig", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Tekst", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Veličina fonta", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Text", + "2": "Image" + }, + "tags": "Tekst,ponavljanje,etiketa,vlastiti,autorsko pravo,zaštita, img,jpg,slika,foto", "header": "Dodaj vodeni žig", "customColor": "Custom Text Color", "selectText": { @@ -760,17 +1507,6 @@ "8": "Tip vodenog žiga:", "9": "Slika vodenog žiga:", "10": "Convert PDF to PDF-Image" - }, - "submit": "Dodaj vodeni žig", - "type": { - "1": "Text", - "2": "Image" - }, - "watermarkType": { - "text": "Tekst" - }, - "settings": { - "fontSize": "Veličina fonta" } }, "permissions": { @@ -795,50 +1531,201 @@ "removePages": { "tags": "Ukloni stranice,obriši stranice", "title": "Ukloni", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Ukloni" }, - "addPassword": { - "tags": "bezbedno,zaštita", - "title": "Dodaj šifru", - "header": "Dodaj šifru (Enkripcija)", - "selectText": { - "1": "Izaberite PDF za enkripciju", - "2": "Korisnička šifra", - "3": "Dužina enkripcijskog ključa", - "4": "Veće vrednosti su jače, ali manje vrednosti imaju bolju kompatibilnost.", - "5": "Postavke dozvola (Preporučuje se korišćenje sa šifrom vlasnika)", - "6": "Onemogući sastavljanje dokumenta", - "7": "Onemogući ekstrakciju sadržaja", - "8": "Onemogući ekstrakciju za pristupačnost", - "9": "Onemogući popunjavanje formulara", - "10": "Onemogući modifikaciju", - "11": "Onemogući modifikaciju anotacija", - "12": "Onemogući štampanje", - "13": "Onemogući štampanje u različitim formatima", - "14": "Šifra vlasnika", - "15": "Ograničava šta se može raditi sa dokumentom nakon otvaranja (Nije podržano od svih čitača)", - "16": "Ograničava otvaranje samog dokumenta" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Enkriptuj", "tooltip": { - "permissions": { - "title": "Promeni dozvole" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "bezbedno,Dešifruj,zaštita,ukloni lozinku", - "title": "Ukloni šifru", - "header": "Ukloni šifru (Dekripcija)", - "selectText": { - "1": "Izaberite PDF za dekripciju", - "2": "Šifra" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Ukloni", - "desc": "Uklanjanje lozinke iz PDF dokumenta", - "password": { - "stepTitle": "Ukloni lozinku", - "label": "Trenutna lozinka" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -848,12 +1735,142 @@ "tags": "ukloni,obriši,obrazac,polje,samo za čitanje", "title": "Ukloni režim samo-za-čitanje sa polja obrasca", "header": "Otključaj PDF obrazac", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Naslov,autor,datum,kreacije,vreme,izdavač,proizvođač,statistike", - "title": "Naslov:", "header": "Promeni metapodatke", + "submit": "Promeni", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Naslov,autor,datum,kreacije,vreme,izdavač,proizvođač,statistike", "selectText": { "1": "Izmenite promenljive koje želite promeniti", "2": "Obriši sve metapodatke", @@ -861,15 +1878,7 @@ "4": "Drugi metapodaci:", "5": "Dodaj prilagođeni unos metapodataka" }, - "author": "Autor:", - "creationDate": "Datum kreiranja (gggg/MM/dd HH:mm:ss):", - "creator": "Kreator:", - "keywords": "Ključne reči:", - "modDate": "Datum izmene (gggg/MM/dd HH:mm:ss):", - "producer": "Proizvođač:", - "subject": "Tema:", - "trapped": "Zaglavljeno:", - "submit": "Promeni" + "modDate": "Datum izmene (gggg/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformacija,format,dokument,slika,slajd,tekst,konverzija,office,docs,word,excel,powerpoint", @@ -883,6 +1892,7 @@ "ocr": { "tags": "prepoznavanje,tekst,slika,sken,čitanje,identifikacija,detekcija,uređivanje", "title": "OCR / Čišćenje skeniranja", + "desc": "Čišćenje skenova i detektovanje teksta na slikama unutar PDF-a i ponovno dodavanje kao teksta", "header": "Čišćenje skeniranja / OCR (Optičko prepoznavanje znakova)", "selectText": { "1": "Odaberite jezike koji će biti detektovani unutar PDF-a (Navedeni su trenutno detektovani):", @@ -901,23 +1911,89 @@ "help": "Molimo vas da pročitate ovu dokumentaciju o tome kako koristiti ovo za druge jezike i/ili korišćenje van docker-a", "credit": "Ova usluga koristi qpdf i Tesseract za OCR.", "submit": "Obradi PDF sa OCR-om", - "desc": "Čišćenje skenova i detektovanje teksta na slikama unutar PDF-a i ponovno dodavanje kao teksta", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Podešavanja", "ocrMode": { - "label": "Režim OCR-a:" + "label": "Režim OCR-a:", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Jezici" + "label": "Jezici", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Režim OCR-a:" + "title": "Režim OCR-a:", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Jezici" + "title": "Jezici", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -926,7 +2002,13 @@ "header": "Izdvajanje slika", "selectText": "Odaberite format slike za konvertovanje izdvojenih slika", "allowDuplicates": "Sačuvaj duplirane slike", - "submit": "Izdvajanje" + "submit": "Izdvajanje", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arhiva,dugoročno,standard,konverzija,čuvanje,čuvanje", @@ -998,17 +2080,53 @@ }, "info": "Python nije instaliran. Neophodan je za rad." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autorizacija,inicijali,crtani-potpis,tekstualni-potpis,slikovni-potpis", "title": "Potpiši", "header": "Potpiši PDF fajlove", "upload": "Učitaj sliku", - "draw": "Nacrtaj potpis", - "text": "Tekstualni unos", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Obriši", "add": "Dodaj", "saved": "Snimljeni potpisi", "save": "Snimi potpis", + "applySignatures": "Apply Signatures", "personalSigs": "Lični potpisi", "sharedSigs": "Deljeni potpisi", "noSavedSigs": "Nema snimljenih potpisa", @@ -1020,42 +2138,179 @@ "previous": "Prethodna strana", "maintainRatio": "Uključi/isključi zadržavanje proporcija", "undo": "Poništi", - "redo": "Ponovi" + "redo": "Ponovi", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autorizacija,inicijali,crtani-potpis,tekstualni-potpis,slikovni-potpis" }, "flatten": { - "tags": "statično,deaktivirati,neinteraktivno,usmeriti", "title": "Ravnanje", "header": "Ravnanje PDF fajlova", "flattenOnlyForms": "Izravnaj samo forme", "submit": "Ravnanje", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Podešavanja" }, "options": { - "flattenOnlyForms": "Izravnaj samo forme" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Izravnaj samo forme", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statično,deaktivirati,neinteraktivno,usmeriti" }, "repair": { "tags": "popravi,vrati,korekcija,obnovi", "title": "Popravi", "header": "Popravi PDF fajlove", - "submit": "Popravi" + "submit": "Popravi", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "čišćenje,usmeriti,ne-sadržaj,organizacija", "title": "Ukloni prazne stranice", "header": "Ukloni prazne stranice", - "threshold": "Prag beline piksela:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Ukloni prazne", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "čišćenje,usmeriti,ne-sadržaj,organizacija", "thresholdDesc": "Prag za određivanje koliko beli piksel mora biti 'beli'. 0 = Crno, 255 čisto belo.", - "whitePercent": "Procenat bele boje (%):", - "whitePercentDesc": "Procenat stranice koji mora biti 'beli' pikseli da bi se uklonili", - "submit": "Ukloni prazne" + "whitePercentDesc": "Procenat stranice koji mora biti 'beli' pikseli da bi se uklonili" }, "removeAnnotations": { "tags": "komentari,isticanje,beleške,oznake,ukloni", "title": "Ukloni Anotacije", "header": "Ukloni Anotacije", - "submit": "Ukloni" + "submit": "Ukloni", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "razlikovati,kontrast,izmene,analiza", @@ -1087,6 +2342,142 @@ "certSign": { "tags": "autentifikacija,PEM,P12,zvanično,šifrovanje", "title": "Potpisivanje Sertifikatom", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Lokacija", + "logoTitle": "Logo", + "name": "Ime", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Unesite lozinku vašeg keystore-a ili privatnog ključa (ako je ima):", + "passwordOptional": "Leave empty if no password", + "reason": "Razlog", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Prikaži logo", "header": "Potpiši PDF sa svojim sertifikatom (Rad u toku)", "selectPDF": "Izaberite PDF fajl za potpisivanje:", "jksNote": "Napomena: Ako tvoj tip sertifikata nije naveden ispod, konvertuj ga u Java Keystore (.jks) format koristeći komandni alat keytool. Zatim izaberi opciju .jks ispod.", @@ -1094,13 +2485,7 @@ "selectCert": "Izaberite svoj sertifikat (X.509 format, može biti .pem ili .der):", "selectP12": "Izaberite svoj PKCS#12 keystore fajl (.p12 ili .pfx) (Opciono, ako je dostupan, trebalo bi da sadrži vaš privatni ključ i sertifikat):", "selectJKS": "Izaberi svoju Java keystore datoteku (.jks or .keystore):", - "certType": "Tip sertifikata", - "password": "Unesite lozinku vašeg keystore-a ili privatnog ključa (ako je ima):", "showSig": "Prikaži potpis", - "reason": "Razlog", - "location": "Lokacija", - "name": "Ime", - "showLogo": "Prikaži logo", "submit": "Potpiši PDF" }, "removeCertSign": { @@ -1108,7 +2493,18 @@ "title": "Ukloni potpis sertifikata", "header": "Ukloni digitalni sertifikat iz PDF-a", "selectPDF": "Izaberi PDF dokument:", - "submit": "Ukloni potpis" + "submit": "Ukloni potpis", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "spajanje,kompozit,pojedinačan-prikaz,organizacija", @@ -1116,16 +2512,157 @@ "header": "Višestruki Raspored Stranica", "pagesPerSheet": "Stranica po listu:", "addBorder": "Dodaj ivice", - "submit": "Potvrdi" + "submit": "Potvrdi", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "izmena,modifikacija,dimenzija,adaptacija", "title": "Podesi razmeru stranica", "header": "Podesi razmeru stranica", "pageSize": "Veličina stranice dokumenta.", "keepPageSize": "Originalna veličina", "scaleFactor": "Nivo zumiranja (rezanje) stranice.", - "submit": "Potvrdi" + "submit": "Potvrdi", + "tags": "izmena,modifikacija,dimenzija,adaptacija" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginacija,oznaka,organizacija,indeks" @@ -1134,16 +2671,83 @@ "tags": "auto-detekcija,zaglavlje-bazirano,organizacija,preimenovanje", "title": "Automatsko preimenovanje", "header": "Automatsko preimenovanje PDF-a", - "submit": "Automatsko preimenovanje" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Automatsko preimenovanje", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "korekcija-boja,podešavanje,modifikacija,unapredi" }, "crop": { - "tags": "trimovanje,skupljanje,uređivanje,oblikovanje", "title": "Iseci", "header": "Skraćivanje PDF-a", - "submit": "Potvrdi" + "submit": "Potvrdi", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "trimovanje,skupljanje,uređivanje,oblikovanje" }, "autoSplitPDF": { "tags": "QR-bazirano,razdvoji,segment-skeniranja,organizacija", @@ -1226,24 +2830,124 @@ "downloadJS": "Preuzmi Javascript", "submit": "Prikaži" }, - "autoRedact": { - "tags": "Cenzura,Sakrij,prekrivanje,crna,marker,skriveno", - "title": "Auto Cenzura", - "header": "Auto Cenzura", - "colorLabel": "Boja", - "textsToRedactLabel": "Tekst za cenzurisanje (razdvojeni linijama)", - "textsToRedactPlaceholder": "npr. \\nPoverljivo \\nVrhunski Tajno", - "useRegexLabel": "Koristi Regex", - "wholeWordSearchLabel": "Pretraga celih reči", - "customPaddingLabel": "Dodatni prazan prostor", - "convertPDFToImageLabel": "Konvertuj PDF u PDF-Image (koristi se za uklanjanje teksta iza okvira)", - "submitButton": "Potvrdi" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Redaktuj", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Napredno" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Dodaj", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Strane", + "placeholder": "(npr. 1,2,8 ili 4,7,12-16 ili 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Izvoz", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1269,22 +2973,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Napredno" - }, - "wordsToRedact": { - "add": "Dodaj" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Strane", - "placeholder": "(npr. 1,2,8 ili 4,7,12-16 ili 2n-1)" - }, - "export": "Izvoz" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Izdvajanje tabela,izdvajanje,konvertovanje" @@ -1295,11 +2984,15 @@ "overlay-pdfs": { "tags": "Preklapanje", "header": "Preklapanje PDF fajlova", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Izaberite osnovni PDF fajl" }, "overlayFiles": { - "label": "Izaberite PDF fajlove za preklapanje" + "label": "Izaberite PDF fajlove za preklapanje", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Izaberite režim preklapanja", @@ -1309,14 +3002,53 @@ }, "counts": { "label": "Broj preklapanja (za režim Fixed Repeat)", - "placeholder": "Unesite brojeve odvojene zarezom (npr. 2,3,1)" + "placeholder": "Unesite brojeve odvojene zarezom (npr. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Izaberite poziciju preklapanja", "foreground": "Prethodni plan", "background": "Pozadina" }, - "submit": "Potvrdi" + "submit": "Potvrdi", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Deljenje odeljaka,Deljenje,Podešavanje", @@ -1337,6 +3069,7 @@ "tags": "Stamp, Add image, center image, Watermark, PDF, Embed, Customize", "header": "Pečatiraj PDF", "title": "Dodavanje pečata u PDF", + "stampSetup": "Stamp Setup", "stampType": "Tip pečeta:", "stampText": "Tekst pečata:", "stampImage": "Slika pečeta:", @@ -1349,7 +3082,19 @@ "overrideY": "Zameni Y koordinatu:", "customMargin": "Podešavanje margina:", "customColor": "Custom Text Color", - "submit": "Pošalji" + "submit": "Pošalji", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Ukloni sliku, Zahvati na stranici, Bekend,serverska strana" @@ -1367,7 +3112,8 @@ "status": { "_value": "Status", "valid": "Validan", - "invalid": "Invalidan" + "invalid": "Invalidan", + "complete": "Validation complete" }, "signer": "Potpisnik", "date": "Datum", @@ -1394,40 +3140,122 @@ "version": "Verzija", "keyUsage": "Namena ključa", "selfSigned": "Samopotpisan", - "bits": "bitova" + "bits": "bitova", + "details": "Certificate Details" }, "signature": { "info": "Informacije o potpisu", "_value": "Signature", "mathValid": "Potpis je matematički validan ALI:" }, - "selectCustomCert": "Prilagođena X.509 datoteka sertifikata (opciono)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Replace-Invert Color PDF", - "selectText": { - "1": "Replace or Invert color Options", - "2": "Default(Default high contrast colors)", - "3": "Custom(Customized colors)", - "4": "Full-Invert(Invert all colors)", - "5": "High contrast color options", - "6": "Beli tekst na crnoj pozadini", - "7": "Crni tekst na beloj pozadini", - "8": "Žuti tekst na crnoj pozadini", - "9": "Zeleni tekst na crnoj pozadini", - "10": "Choose text Color", - "11": "Choose background Color" + "selectCustomCert": "Prilagođena X.509 datoteka sertifikata (opciono)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Zameni" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Replace Color,Page operations,Back end,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Prijavite se", "header": "Prijavite se", "signin": "Prijavite se", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Zapamti me", "invalid": "Neispravno korisničko ime ili lozinka.", "locked": "Vaš nalog je zaključan.", @@ -1446,12 +3274,83 @@ "alreadyLoggedIn": "Već si prijavljen na", "alreadyLoggedIn2": "uređaja. Odjavi se sa uređaja i pokušaj ponovo.", "toManySessions": "Imaš previše aktivnih sesija", - "logoutMessage": "Odjavljen si." + "logoutMessage": "Odjavljen si.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF u Jednu Stranicu", "header": "PDF u Jednu Stranicu", - "submit": "Konvertuj u Jednu Stranicu" + "submit": "Konvertuj u Jednu Stranicu", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Izdvajanje stranica", @@ -1475,18 +3374,59 @@ "adjustContrast": { "title": "Podesi Kontrast", "header": "Podesi Kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Osvetljenje:", "saturation": "Zasićenje:", - "download": "Preuzmi" + "download": "Preuzmi", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Kompresija", + "desc": "Compress PDFs to reduce their file size.", "header": "Kompresuj PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Veličina datoteke" + }, "credit": "Ova usluga koristi qpdf za kompresiju / optimizaciju PDF-a.", "grayscale": { "label": "Primeni sivinu za kompresiju" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1496,10 +3436,7 @@ "4": "Automatski režim - Automatski prilagođava kvalitet kako bi PDF bio tačne veličine", "5": "Očekivana veličina PDF-a (npr. 25MB, 10.8MB, 25KB)" }, - "submit": "Kompresuj", - "method": { - "filesize": "Veličina datoteke" - } + "submit": "Kompresuj" }, "decrypt": { "passwordPrompt": "Ova datoteka je zaštićena lozinkom. Unesi lozinku:", @@ -1600,7 +3537,13 @@ "title": "Ukloni sliku", "header": "Ukloni sliku", "removeImage": "Ukloni sliku", - "submit": "Ukloni sliku" + "submit": "Ukloni sliku", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Podeli PDF po poglavljima", @@ -1634,6 +3577,12 @@ }, "note": "Beleške o izdanju su dostupne samo na engleskom jeziku" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "Kako koristimo kolačiće", @@ -1669,54 +3618,943 @@ "title": "Analitika", "description": "Ovi kolačići nam pomažu da razumemo kako se naši alati koriste, kako bismo mogli da se fokusiramo na razvoj funkcija koje naša zajednica najviše ceni. Budite sigurni — Stirling PDF ne može i nikada neće pratiti sadržaj dokumenata sa kojima radite." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Preuzmi", - "undo": "Poništi", - "convert": { - "title": "Konvertuj", - "settings": "Podešavanja", - "color": "Boja", - "greyscale": "Monohromatski", - "fillPage": "Popuni stranicu", - "pdfaDigitalSignatureWarning": "PDF sadrži digitalni potpis. Biće uklonjen u sledećem koraku.", - "grayscale": "Monohromatski" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "uključi,dodaj,datoteka,prilog,prilozi", - "title": "Dodaj priloge", - "header": "Dodaj priloge", - "submit": "Dodaj priloge" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Izaberi sve", - "deselectAll": "Poništi sve" + "deselectAll": "Poništi sve", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Potpis" + "read": "Read", + "sign": "Potpis", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Učitavam...", - "or": "ili" + "or": "ili", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Ime", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Verzija", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Izaberi sve", "deselectAll": "Poništi sve", "deleteSelected": "Izaberi izabrano", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Preuzmi", - "delete": "Obriši" + "delete": "Obriši", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Sanitizacija PDF-a", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Podešavanja" + "files": "Files", + "settings": "Podešavanja", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Dodaj šifru", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Enkriptuj", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Promeni dozvole", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "bezbedno,zaštita", + "header": "Dodaj šifru (Enkripcija)", + "selectText": { + "1": "Izaberite PDF za enkripciju", + "2": "Korisnička šifra", + "3": "Dužina enkripcijskog ključa", + "4": "Veće vrednosti su jače, ali manje vrednosti imaju bolju kompatibilnost.", + "5": "Postavke dozvola (Preporučuje se korišćenje sa šifrom vlasnika)", + "6": "Onemogući sastavljanje dokumenta", + "7": "Onemogući ekstrakciju sadržaja", + "8": "Onemogući ekstrakciju za pristupačnost", + "9": "Onemogući popunjavanje formulara", + "10": "Onemogući modifikaciju", + "11": "Onemogući modifikaciju anotacija", + "12": "Onemogući štampanje", + "13": "Onemogući štampanje u različitim formatima", + "14": "Šifra vlasnika", + "15": "Ograničava šta se može raditi sa dokumentom nakon otvaranja (Nije podržano od svih čitača)", + "16": "Ograničava otvaranje samog dokumenta" } }, "changePermissions": { "title": "Promeni dozvole", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Promeni dozvole", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Onemogući sastavljanje dokumenta" @@ -1743,10 +4581,784 @@ "label": "Onemogući štampanje u različitim formatima" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Promeni dozvole" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Ukloni šifru", + "desc": "Uklanjanje lozinke iz PDF dokumenta", + "tags": "bezbedno,Dešifruj,zaštita,ukloni lozinku", + "password": { + "stepTitle": "Ukloni lozinku", + "label": "Trenutna lozinka", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Ukloni", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Ukloni šifru (Dekripcija)", + "selectText": { + "1": "Izaberite PDF za dekripciju", + "2": "Šifra" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or Invert color Options", + "2": "Default(Default high contrast colors)", + "3": "Custom(Customized colors)", + "4": "Full-Invert(Invert all colors)", + "5": "High contrast color options", + "6": "Beli tekst na crnoj pozadini", + "7": "Crni tekst na beloj pozadini", + "8": "Žuti tekst na crnoj pozadini", + "9": "Zeleni tekst na crnoj pozadini", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Zameni", + "title": "Replace-Invert-Color", + "header": "Replace-Invert Color PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Cenzura,Sakrij,prekrivanje,crna,marker,skriveno", + "title": "Auto Cenzura", + "header": "Auto Cenzura", + "colorLabel": "Boja", + "textsToRedactLabel": "Tekst za cenzurisanje (razdvojeni linijama)", + "textsToRedactPlaceholder": "npr. \\nPoverljivo \\nVrhunski Tajno", + "useRegexLabel": "Koristi Regex", + "wholeWordSearchLabel": "Pretraga celih reči", + "customPaddingLabel": "Dodatni prazan prostor", + "convertPDFToImageLabel": "Konvertuj PDF u PDF-Image (koristi se za uklanjanje teksta iza okvira)", + "submitButton": "Potvrdi" + }, + "replaceColorPdf": { + "tags": "Replace Color,Page operations,Back end,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/sv-SE/translation.json b/frontend/public/locales/sv-SE/translation.json index 86e9fa982..970a73bf7 100644 --- a/frontend/public/locales/sv-SE/translation.json +++ b/frontend/public/locales/sv-SE/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Anpassad text", "numberPagesDesc": "Vilka sidor som ska numreras, standard 'all', accepterar även 1-5 eller 2,5,9 etc", "customNumberDesc": "Standard är {n}, accepterar även 'Sida {n} av {total}', 'Text-{n}', '{filnamn}-{n}", - "submit": "Lägg till sidnummer" + "submit": "Lägg till sidnummer", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Anpassat sidval (Ange en kommaseparerad lista med sidnummer 1,5,6 eller funktioner som 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Välj PDF(er)", "multiPdfPrompt": "Välj PDF-filer (2+)", "multiPdfDropPrompt": "Välj (eller dra och släpp) alla PDF-filer du behöver", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Varning: Denna process kan ta upp till en minut beroende på filstorlek", "pageOrderPrompt": "Sidordning (Ange en kommaseparerad lista med sidnummer) :", - "pageSelectionPrompt": "Anpassat sidval (Ange en kommaseparerad lista med sidnummer 1,5,6 eller funktioner som 2n+1) :", "goToPage": "Gå till", "true": "Sant", "false": "Falskt", "unknown": "Okänt", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Spara", "saveToBrowser": "Spara till webbläsare", + "download": "Ladda ner", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Stäng", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "filer valda", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Inga favoriter har lagts till", "downloadComplete": "Nedladdning klar", "bored": "Trött på att vänta?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF-dokumentet är lösenordsskyddat och antingen har lösenordet inte angetts eller är felaktigt", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Fel", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Vi beklagar problemet!", "needHelp": "Behöver du hjälp / Har du hittat ett problem?", "contactTip": "Om du fortfarande har problem, tveka inte att kontakta oss för hjälp. Du kan skicka in en fråga på vår GitHub-sida eller kontakta oss via Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Skicka in en fråga", "discordSubmit": "Discord - Skicka in ett supportinlägg" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Radera", "username": "Användarnamn", "password": "Lösenord", @@ -82,6 +169,7 @@ "green": "Grön", "blue": "Blå", "custom": "Anpassad...", + "comingSoon": "Coming soon", "WorkInProgess": "Pågående arbete, kan vara icke fungerande eller buggigt. Rapportera eventuella problem!", "poweredBy": "Drivs av", "yes": "Ja", @@ -115,12 +203,14 @@ "page": "Sidan", "pages": "Sidor", "loading": "Laddar...", + "review": "Review", "addToDoc": "Lägg till i dokument", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Dataprotektionspolicy", + "iAgreeToThe": "I agree to all of the", "terms": "Villkor och betingelser", "accessibility": "Gängeshållbarhet", "cookie": "Cockiropfer", @@ -160,6 +250,7 @@ "title": "Vill du göra Stirling PDF bättre?", "paragraph1": "Stirling PDF har inaktiverad analys för att hjälpa oss förbättra produkten. Vi spårar ingen personlig information eller filinnehåll.", "paragraph2": "Var god aktivera analyser för att hjälpa Stirling-PDF att växa och tillåta oss att förstå våra användare bättre.", + "learnMore": "Learn more", "enable": "Aktivera analys", "disable": "Avaktivera analys", "settings": "Du kan ändra analysinställningarna i config/settings.yml-filen" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Spara formulärinmatningar", "help": "Aktivera för att lagra tidigare använda inmatningar för framtida körningar" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Databasimport/export", @@ -331,22 +474,310 @@ "alphabetical": "Alfabetisk", "globalPopularity": "Global Popularity", "sortBy": "Sortera efter:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Multi-verktyg", "desc": "Sammanfoga, rotera, ordna om och ta bort sidor" }, "merge": { + "tags": "combine,join,unite", "title": "Sammanfoga", "desc": "Sammanfoga enkelt flera PDF-filer till en." }, "split": { + "tags": "divide,separate,break", "title": "Dela", "desc": "Dela upp PDF-filer i flera dokument" }, "rotate": { + "tags": "turn,flip,orient", "title": "Rotera", "desc": "Rotera enkelt dina PDF-filer." }, + "convert": { + "tags": "transform,change", + "title": "Konvertera", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Ordna", + "desc": "Ta bort/ordna om sidor i valfri ordning" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Lägg till bild", + "desc": "Lägger till en bild på en angiven plats i PDF:en (pågår arbete)" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Lägg till vattenstämpel", + "desc": "Lägg till en anpassad vattenstämpel till ditt PDF-dokument." + }, + "removePassword": { + "tags": "unlock", + "title": "Ta bort lösenord", + "desc": "Ta bort lösenordsskydd från ditt PDF-dokument." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Komprimera", + "desc": "Komprimera PDF-filer för att minska deras filstorlek." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Ändra metadata", + "desc": "Ändra/ta bort/lägg till metadata från ett PDF-dokument" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Rensningsskanningar", + "desc": "Rengör skanningar och upptäcker text från bilder i en PDF och lägger till den igen som text." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Extrahera bilder", + "desc": "Extraherar alla bilder från en PDF och sparar dem till zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Signera", + "desc": "Lägger till signatur till PDF genom ritning, text eller bild" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Platta till", + "desc": "Ta bort alla interaktiva element och formulär från en PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Signera med certifikat", + "desc": "Signerar en PDF med ett certifikat/nyckel (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Reparera", + "desc": "Försöker reparera en korrupt/trasig PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Ta bort tomma sidor", + "desc": "Känner av och tar bort tomma sidor från ett dokument" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Ta bort anteckningar", + "desc": "Tar bort alla kommentarer/anteckningar från en PDF" + }, + "compare": { + "tags": "difference", + "title": "Jämför", + "desc": "Jämför och visar skillnaderna mellan 2 PDF-dokument" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Ta bort certifikatsignatur", + "desc": "Ta bort certifikatsignatur från PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Flersidigt layout", + "desc": "Slå samman flera sidor av ett PDF-dokument till en enda sida" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Justera sidstorlek/skala", + "desc": "Ändra storleken/skalan på sidan och/eller dess innehåll." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Lägg till sidnummer", + "desc": "Lägg till sidnummer genom hela dokumentet på en angiven plats" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Justera färger/kontrast", + "desc": "Justera kontrast, mättnad och ljusstyrka i en PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Beskär PDF", + "desc": "Beskär en PDF för att minska dess storlek (behåller text!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Auto-dela sidor", + "desc": "Auto-dela skannad PDF med fysisk skannad sidseparator QR-kod" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Hämta ALL information om PDF", + "desc": "Hämtar all möjlig information om PDF:er" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF till en enda stor sida", + "desc": "Slår samman alla PDF-sidor till en enda stor sida" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Visa Javascript", + "desc": "Söker och visar eventuell JS som injicerats i en PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Ta bort bild", + "desc": "Ta bort bild från PDF för att minska filstorlek" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Dela upp PDF efter kapitel", + "desc": "Dela upp en PDF till flera filer baserat på dess kapitelstruktur." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validera PDF signature", + "desc": "Verifiera digitala signaturer och certifiakt i PDF dokument" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extrahera sidor", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Ta bort", + "desc": "Ta bort oönskade sidor från ditt PDF-dokument." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Auto-dela efter storlek/antal", + "desc": "Dela en enda PDF till flera dokument baserat på storlek, sidantal eller dokumentantal" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Lägg till lösenord", + "desc": "Kryptera ditt PDF-dokument med ett lösenord." + }, + "changePermissions": { + "title": "Ändra behörigheter", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Överlagrar PDF:er ovanpå en annan PDF", + "title": "Överlagra PDF:er" + }, "imageToPDF": { "title": "Bild till PDF", "desc": "Konvertera en bild (PNG, JPEG, GIF) till PDF." @@ -355,18 +786,6 @@ "title": "PDF till bild", "desc": "Konvertera en PDF till en bild. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Ordna", - "desc": "Ta bort/ordna om sidor i valfri ordning" - }, - "addImage": { - "title": "Lägg till bild", - "desc": "Lägger till en bild på en angiven plats i PDF:en (pågår arbete)" - }, - "watermark": { - "title": "Lägg till vattenstämpel", - "desc": "Lägg till en anpassad vattenstämpel till ditt PDF-dokument." - }, "permissions": { "title": "Ändra behörigheter", "desc": "Ändra behörigheterna för ditt PDF-dokument" @@ -375,38 +794,10 @@ "title": "Ta bort", "desc": "Ta bort oönskade sidor från ditt PDF-dokument." }, - "addPassword": { - "title": "Lägg till lösenord", - "desc": "Kryptera ditt PDF-dokument med ett lösenord." - }, - "removePassword": { - "title": "Ta bort lösenord", - "desc": "Ta bort lösenordsskydd från ditt PDF-dokument." - }, - "compress": { - "title": "Komprimera", - "desc": "Komprimera PDF-filer för att minska deras filstorlek." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Ändra metadata", - "desc": "Ändra/ta bort/lägg till metadata från ett PDF-dokument" - }, "fileToPDF": { "title": "Konvertera fil till PDF", "desc": "Konvertera nästan vilken fil som helst till PDF (DOCX, PNG, XLS, PPT, TXT och mer)" }, - "ocr": { - "title": "OCR / Rensningsskanningar", - "desc": "Rengör skanningar och upptäcker text från bilder i en PDF och lägger till den igen som text." - }, - "extractImages": { - "title": "Extrahera bilder", - "desc": "Extraherar alla bilder från en PDF och sparar dem till zip" - }, "pdfToPDFA": { "title": "PDF till PDF/A", "desc": "Konvertera PDF till PDF/A för långtidslagring" @@ -435,70 +826,14 @@ "title": "Detektera/Dela skannade foton", "desc": "Delar flera foton från ett foto/PDF" }, - "sign": { - "title": "Signera", - "desc": "Lägger till signatur till PDF genom ritning, text eller bild" - }, - "flatten": { - "title": "Platta till", - "desc": "Ta bort alla interaktiva element och formulär från en PDF" - }, - "repair": { - "title": "Reparera", - "desc": "Försöker reparera en korrupt/trasig PDF" - }, - "removeBlanks": { - "title": "Ta bort tomma sidor", - "desc": "Känner av och tar bort tomma sidor från ett dokument" - }, - "removeAnnotations": { - "title": "Ta bort anteckningar", - "desc": "Tar bort alla kommentarer/anteckningar från en PDF" - }, - "compare": { - "title": "Jämför", - "desc": "Jämför och visar skillnaderna mellan 2 PDF-dokument" - }, - "certSign": { - "title": "Signera med certifikat", - "desc": "Signerar en PDF med ett certifikat/nyckel (PEM/P12)" - }, - "removeCertSign": { - "title": "Ta bort certifikatsignatur", - "desc": "Ta bort certifikatsignatur från PDF" - }, - "pageLayout": { - "title": "Flersidigt layout", - "desc": "Slå samman flera sidor av ett PDF-dokument till en enda sida" - }, - "scalePages": { - "title": "Justera sidstorlek/skala", - "desc": "Ändra storleken/skalan på sidan och/eller dess innehåll." - }, "pipeline": { "title": "Pipeline (Avancerat)", "desc": "Kör flera åtgärder på PDF:er genom att definiera pipeline-skript" }, - "addPageNumbers": { - "title": "Lägg till sidnummer", - "desc": "Lägg till sidnummer genom hela dokumentet på en angiven plats" - }, "auto-rename": { "title": "Automatiskt byt namn på PDF-fil", "desc": "Byter automatiskt namn på en PDF-fil baserat på dess detekterade rubrik" }, - "adjustContrast": { - "title": "Justera färger/kontrast", - "desc": "Justera kontrast, mättnad och ljusstyrka i en PDF" - }, - "crop": { - "title": "Beskär PDF", - "desc": "Beskär en PDF för att minska dess storlek (behåller text!)" - }, - "autoSplitPDF": { - "title": "Auto-dela sidor", - "desc": "Auto-dela skannad PDF med fysisk skannad sidseparator QR-kod" - }, "sanitizePDF": { "title": "Sanera", "desc": "Ta bort skript och andra element från PDF-filer" @@ -519,30 +854,14 @@ "title": "PDF till Markdown", "desc": "Konvertera PDF till Markdown" }, - "getPdfInfo": { - "title": "Hämta ALL information om PDF", - "desc": "Hämtar all möjlig information om PDF:er" - }, "pageExtracter": { "title": "Extrahera sida(or)", "desc": "Extraherar valda sidor från PDF" }, - "pdfToSinglePage": { - "title": "PDF till en enda stor sida", - "desc": "Slår samman alla PDF-sidor till en enda stor sida" - }, - "showJS": { - "title": "Visa Javascript", - "desc": "Söker och visar eventuell JS som injicerats i en PDF" - }, "autoRedact": { "title": "Auto-redigera", "desc": "Auto-redigerar (svärtar) text i en PDF baserat på inmatad text" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF till CSV", "desc": "Extraherar tabeller från en PDF och konverterar dem till CSV" @@ -551,10 +870,6 @@ "title": "Auto-dela efter storlek/antal", "desc": "Dela en enda PDF till flera dokument baserat på storlek, sidantal eller dokumentantal" }, - "overlay-pdfs": { - "title": "Överlagra PDF:er", - "desc": "Överlagrar PDF:er ovanpå en annan PDF" - }, "split-by-sections": { "title": "Dela PDF efter sektioner", "desc": "Dela varje sida av en PDF i mindre horisontella och vertikala sektioner" @@ -563,43 +878,17 @@ "title": "Lägg till stämpel på PDF", "desc": "Lägg till text eller bildstämplar på angivna platser" }, - "removeImage": { - "title": "Ta bort bild", - "desc": "Ta bort bild från PDF för att minska filstorlek" - }, - "splitByChapters": { - "title": "Dela upp PDF efter kapitel", - "desc": "Dela upp en PDF till flera filer baserat på dess kapitelstruktur." - }, - "validateSignature": { - "title": "Validera PDF signature", - "desc": "Verifiera digitala signaturer och certifiakt i PDF dokument" - }, "replace-color": { "title": "Ersätt och Invertera färg", "desc": "Ersätt färg för text och bakgrund i PDF och invertera hela färgen på PDF för att minska filstorlek" }, - "convert": { - "title": "Konvertera" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Extrahera sidor" - }, - "removePages": { - "title": "Ta bort", - "desc": "Ta bort oönskade sidor från ditt PDF-dokument." - }, "removeImagePdf": { "title": "Ta bort bild", "desc": "Ta bort bild från PDF för att minska filstorlek" }, - "autoSizeSplitPDF": { - "title": "Auto-dela efter storlek/antal", - "desc": "Dela en enda PDF till flera dokument baserat på storlek, sidantal eller dokumentantal" - }, "adjust-contrast": { "title": "Justera färger/kontrast", "desc": "Justera kontrast, mättnad och ljusstyrka i en PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Ersätt och Invertera färg", "desc": "Ersätt färg för text och bakgrund i PDF och invertera hela färgen på PDF för att minska filstorlek" - }, - "changePermissions": { - "title": "Ändra behörigheter" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "visa,läs,kommentera,text,bild", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "sammanfoga,Sidoperationer,Backend,serversida", "title": "Sammanfoga", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Slå samman", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Filnamn", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Slå samman flera PDF-filer (2+)", "sortByName": "Sortera efter namn", "sortByDate": "Sortera efter datum", - "removeCertSign": "Ta bort digital signatur i den sammanslagna filen?", - "submit": "Slå samman", - "sortBy": { - "filename": "Filnamn" - } + "removeCertSign": "Ta bort digital signatur i den sammanslagna filen?" }, "split": { - "tags": "Sidoperationer,dela,Multisida,klippa,serversida", "title": "Dela upp PDF", "header": "Dela upp PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Ange sidor att dela på:", "submit": "Dela", "steps": { + "chooseMethod": "Choose Method", "settings": "Inställningar" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Filstorlek" + "name": "Filstorlek", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Filstorlek" + "label": "Filstorlek", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Sidoperationer,dela,Multisida,klippa,serversida" }, "rotate": { - "tags": "serversida", "title": "Rotera PDF", + "submit": "Rotera", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "serversida", "header": "Rotera PDF", - "selectAngle": "Välj rotationsvinkel (i multipler av 90 grader):", - "submit": "Rotera" + "selectAngle": "Välj rotationsvinkel (i multipler av 90 grader):" + }, + "convert": { + "title": "Konvertera", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Inställningar", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Färg", + "greyscale": "Gråskala", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Fyll sida", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF:en innehåller en digital signatur. Denna kommer att tas bort i nästa steg.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Gråskala", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konvertering,img,jpg,bild,foto" @@ -727,7 +1263,33 @@ "8": "Ta bort sista", "9": "Ta bort första och sista", "10": "Udda-jämn sammanslagning", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(t.ex. 1,3,2 eller 4-8,2,10-12 eller 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Lägg till bild", "submit": "Lägg till bild" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Text,upprepande,etikett,egen,upphovsrätt,varumärke,img,jpg,bild,foto", "title": "Lägg till vattenstämpel", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Lägg till vattenstämpel", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Text", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Teckenstorlek", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Text", + "2": "Bild" + }, + "tags": "Text,upprepande,etikett,egen,upphovsrätt,varumärke,img,jpg,bild,foto", "header": "Lägg till vattenstämpel", "customColor": "Anpassad textfärg", "selectText": { @@ -755,14 +1506,6 @@ "8": "Vattenstämpeltyp:", "9": "Vattenstämpelbild:", "10": "Konvertera PDF till PDF-bild" - }, - "submit": "Lägg till vattenstämpel", - "type": { - "1": "Text", - "2": "Bild" - }, - "settings": { - "fontSize": "Teckenstorlek" } }, "permissions": { @@ -787,50 +1530,201 @@ "removePages": { "tags": "Ta bort sidor,radera sidor", "title": "Ta bort", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Ta bort" }, - "addPassword": { - "tags": "säkra,säkerhet", - "title": "Lägg till lösenord", - "header": "Lägg till lösenord (kryptera)", - "selectText": { - "1": "Välj PDF att kryptera", - "2": "Lösenord", - "3": "Längd på krypteringsnyckeln", - "4": "Högre värden är starkare, men lägre värden har bättre kompatibilitet.", - "5": "Behörigheter att ställa in", - "6": "Förhindra sammansättning av dokument", - "7": "Förhindra innehållsextraktion", - "8": "Förhindra extraktion för tillgänglighet", - "9": "Förhindra att fylla i formulär", - "10": "Förhindra modifiering", - "11": "Förhindra anteckningsändring", - "12": "Förhindra utskrift", - "13": "Förhindra utskrift av olika format", - "14": "Ägarlösenord", - "15": "Begränsar vad som kan göras med dokumentet när det väl är öppnat (Stöds inte av alla läsare)", - "16": "Begränsar öppnandet av själva dokumentet" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Kryptera", "tooltip": { - "permissions": { - "title": "Ändra behörigheter" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "säkra,Dekryptera,säkerhet,ta bort lösenord,radera lösenord", - "title": "Ta bort lösenord", - "header": "Ta bort lösenord (Dekryptera)", - "selectText": { - "1": "Välj PDF att dekryptera", - "2": "Lösenord" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Ta bort", - "desc": "Ta bort lösenordsskydd från ditt PDF-dokument.", - "password": { - "stepTitle": "Ta bort lösenord", - "label": "Nuvarande lösenord" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -840,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Titel,författare,datum,skapelse,tid,utgivare,producent,statistik", - "title": "Titel:", "header": "Ändra metadata", + "submit": "Ändra", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Titel,författare,datum,skapelse,tid,utgivare,producent,statistik", "selectText": { "1": "Redigera de variabler du vill ändra", "2": "Ta bort all metadata", @@ -853,15 +1877,7 @@ "4": "Andra metadata:", "5": "Lägg till anpassad metadatapost" }, - "author": "Författare:", - "creationDate": "Skapningsdatum (åååå/MM/dd HH:mm:ss):", - "creator": "Skapare:", - "keywords": "Sökord:", - "modDate": "Ändringsdatum (åååå/MM/dd HH:mm:ss):", - "producer": "Producent:", - "subject": "Ämne:", - "trapped": "Fångad:", - "submit": "Ändra" + "modDate": "Ändringsdatum (åååå/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformation,format,dokument,bild,presentation,text,konvertering,kontor,dokument,word,excel,powerpoint", @@ -875,6 +1891,7 @@ "ocr": { "tags": "igenkänning,text,bild,skanna,läsa,identifiera,detektering,redigerbar", "title": "OCR / Rengöring av skanningar", + "desc": "Rengör skanningar och upptäcker text från bilder i en PDF och lägger till den igen som text.", "header": "Rengöring av skanningar / OCR (Optisk teckenigenkänning)", "selectText": { "1": "Välj språk som ska upptäckas i PDF:en (de listade är de som för närvarande identifieras):", @@ -893,23 +1910,89 @@ "help": "Vänligen läs denna dokumentation om hur du använder detta för andra språk och/eller använder inte i docker", "credit": "Denna tjänst använder qpdf och Tesseract för OCR.", "submit": "Bearbeta PDF med OCR", - "desc": "Rengör skanningar och upptäcker text från bilder i en PDF och lägger till den igen som text.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Inställningar", "ocrMode": { - "label": "OCR-läge" + "label": "OCR-läge", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Språk" + "label": "Språk", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR-läge" + "title": "OCR-läge", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Språk" + "title": "Språk", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -918,7 +2001,13 @@ "header": "Extrahera bilder", "selectText": "Välj bildformat att konvertera extraherade bilder till", "allowDuplicates": "Spara dubblettbilder", - "submit": "Extrahera" + "submit": "Extrahera", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arkiv,långtids,standard,konvertering,lagring,bevarande", @@ -990,17 +2079,53 @@ }, "info": "Python är inte installerat. Det krävs för att köra." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "auktorisera,initialer,ritad-signatur,text-signatur,bild-signatur", "title": "Signera", "header": "Signera PDF-filer", "upload": "Ladda upp bild", - "draw": "Rita signatur", - "text": "Textinmatning", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Rensa", "add": "Lägg till", "saved": "Sparade signaturer", "save": "Spara signatur", + "applySignatures": "Apply Signatures", "personalSigs": "Personliga signaturer", "sharedSigs": "Delade signaturer", "noSavedSigs": "Inga sparade signaturer hittades", @@ -1012,42 +2137,179 @@ "previous": "Föregående sida", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "auktorisera,initialer,ritad-signatur,text-signatur,bild-signatur" }, "flatten": { - "tags": "statisk,avaktivera,icke-interaktiv,effektivisera", "title": "Platta till", "header": "Platta till PDF-filer", "flattenOnlyForms": "Platta till endast formulär", "submit": "Platta till", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Inställningar" }, "options": { - "flattenOnlyForms": "Platta till endast formulär" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Platta till endast formulär", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statisk,avaktivera,icke-interaktiv,effektivisera" }, "repair": { "tags": "fixa,återställa,korrigering,återhämta", "title": "Reparera", "header": "Reparera PDF-filer", - "submit": "Reparera" + "submit": "Reparera", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "städa upp,effektivisera,icke-innehåll,organisera", "title": "Ta bort tomrum", "header": "Ta bort tomma sidor", - "threshold": "Tröskelvärde:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Ta bort tomrum", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "städa upp,effektivisera,icke-innehåll,organisera", "thresholdDesc": "Tröskelvärde för att bestämma hur vit en vit pixel måste vara", - "whitePercent": "Vit procent (%):", - "whitePercentDesc": "Procentandel av sidan som måste vara vit för att kunna tas bort", - "submit": "Ta bort tomrum" + "whitePercentDesc": "Procentandel av sidan som måste vara vit för att kunna tas bort" }, "removeAnnotations": { "tags": "kommentarer,markera,anteckningar,markup,ta bort", "title": "Ta bort anteckningar", "header": "Ta bort anteckningar", - "submit": "Ta bort" + "submit": "Ta bort", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "särskilja,kontrastera,ändringar,analys", @@ -1079,6 +2341,142 @@ "certSign": { "tags": "autentisera,PEM,P12,officiell,kryptera", "title": "Certifikatsignering", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Plats", + "logoTitle": "Logo", + "name": "Namn", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Ange ditt nyckellagerlösenord eller privata nyckellösenord (om tillämpligt):", + "passwordOptional": "Leave empty if no password", + "reason": "Anledning", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Visa logo", "header": "Signera en PDF med ditt certifikat (Pågående arbete)", "selectPDF": "Välj en PDF-fil för signering:", "jksNote": "Obs: Om din certifikattyp inte finns listad nedan, vänligen konvertera den till en Java Keystore (.jks) fil med hjälp av keytool-kommandoradsverktyget. Välj sedan .jks-filalternativet nedan.", @@ -1086,13 +2484,7 @@ "selectCert": "Välj din certifikatfil (X.509-format, kan vara .pem eller .der):", "selectP12": "Välj din PKCS#12-nyckellagringsfil (.p12 eller .pfx) (Valfritt, om det tillhandahålls bör det innehålla din privata nyckel och certifikat):", "selectJKS": "Välj din Java Keystore-fil (.jks eller .keystore):", - "certType": "Certifikattyp", - "password": "Ange ditt nyckellagerlösenord eller privata nyckellösenord (om tillämpligt):", "showSig": "Visa signatur", - "reason": "Anledning", - "location": "Plats", - "name": "Namn", - "showLogo": "Visa logo", "submit": "Signera PDF" }, "removeCertSign": { @@ -1100,7 +2492,18 @@ "title": "Ta bort certifikatsignatur", "header": "Ta bort den digitala certifikatsignaturen från PDF:en", "selectPDF": "Välj en PDF-fil:", - "submit": "Ta bort signatur" + "submit": "Ta bort signatur", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "slå samman,sammansatt,enkel-vy,organisera", @@ -1108,16 +2511,157 @@ "header": "Flersidigt layout", "pagesPerSheet": "Sidor per ark:", "addBorder": "Lägg till kanter", - "submit": "Skicka" + "submit": "Skicka", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "ändra storlek,modifiera,dimension,anpassa", "title": "Justera sidskala", "header": "Justera sidskala", "pageSize": "Storlek på en sida i dokumentet.", "keepPageSize": "Originalstorlek", "scaleFactor": "Zoomnivå (beskärning) för en sida.", - "submit": "Skicka" + "submit": "Skicka", + "tags": "ändra storlek,modifiera,dimension,anpassa" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginera,etikett,organisera,indexera" @@ -1126,16 +2670,83 @@ "tags": "auto-detektera,rubrikbaserad,organisera,märka om", "title": "Auto-byt namn", "header": "Auto-byt namn på PDF", - "submit": "Auto-byt namn" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Auto-byt namn", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "färgkorrigering,finjustera,modifiera,förbättra" }, "crop": { - "tags": "trimma,krympa,redigera,forma", "title": "Beskär", "header": "Beskär PDF", - "submit": "Skicka" + "submit": "Skicka", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "trimma,krympa,redigera,forma" }, "autoSplitPDF": { "tags": "QR-baserad,separera,skanna-segment,organisera", @@ -1218,24 +2829,124 @@ "downloadJS": "Ladda ner Javascript", "submit": "Visa" }, - "autoRedact": { - "tags": "Redigera,Dölja,svärta,svart,markör,dold", - "title": "Auto-redigera", - "header": "Auto-redigera", - "colorLabel": "Färg", - "textsToRedactLabel": "Text att redigera (radavgränsad)", - "textsToRedactPlaceholder": "t.ex. \\nKonfidentiellt \\nHemligt", - "useRegexLabel": "Använd Regex", - "wholeWordSearchLabel": "Hel ord-sökning", - "customPaddingLabel": "Anpassad extra utfyllnad", - "convertPDFToImageLabel": "Konvertera PDF till PDF-bild (Används för att ta bort text bakom rutan)", - "submitButton": "Skicka" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Avancerat" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Lägg till", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Sidor", + "placeholder": "(t.ex. 1,2,8 eller 4,7,12-16 eller 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Exportera", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1261,22 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Avancerat" - }, - "wordsToRedact": { - "add": "Lägg till" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Sidor", - "placeholder": "(t.ex. 1,2,8 eller 4,7,12-16 eller 2n-1)" - }, - "export": "Exportera" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Tabellextraktion,extrahera,konvertera" @@ -1287,11 +2983,15 @@ "overlay-pdfs": { "tags": "Överlagra", "header": "Överlagra PDF-filer", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Välj bas-PDF-fil" }, "overlayFiles": { - "label": "Välj överlagrings-PDF-filer" + "label": "Välj överlagrings-PDF-filer", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Välj överlagringsläge", @@ -1301,14 +3001,53 @@ }, "counts": { "label": "Överlagringsantal (för fast upprepningsläge)", - "placeholder": "Ange kommaseparerade antal (t.ex. 2,3,1)" + "placeholder": "Ange kommaseparerade antal (t.ex. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Välj överlagringsposition", "foreground": "Förgrund", "background": "Bakgrund" }, - "submit": "Skicka" + "submit": "Skicka", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Sektionsdelning,Dela,Anpassa", @@ -1329,6 +3068,7 @@ "tags": "Stämpel,Lägg till bild,centrera bild,Vattenstämpel,PDF,Bädda in,Anpassa", "header": "Stämpla PDF", "title": "Stämpla PDF", + "stampSetup": "Stamp Setup", "stampType": "Stämpeltyp", "stampText": "Stämpeltext", "stampImage": "Stämpelbild", @@ -1341,7 +3081,19 @@ "overrideY": "Åsidosätt Y-koordinat", "customMargin": "Anpassad marginal", "customColor": "Anpassad textfärg", - "submit": "Skicka" + "submit": "Skicka", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Ta bort bild,Sidoperationer,Backend,serversida" @@ -1359,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Giltig", - "invalid": "Ogiltig" + "invalid": "Ogiltig", + "complete": "Validation complete" }, "signer": "Signer", "date": "Datum", @@ -1386,40 +3139,122 @@ "version": "Version", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Ersätt-Invertera-Färg", - "header": "Ersätt-Invertera färg på PDF", - "selectText": { - "1": "Ersätt eller Invertera färgalternativ", - "2": "Standard (standard höghastighetsfärg)", - "3": "Anpassad (anpassade färger)", - "4": "Full-Invertera (invertera alla färger)", - "5": "Höghastighetsfärgalternativ", - "6": "Vit text på svart bakgrund", - "7": "Svart text på vit bakgrund", - "8": "Gul text på svart bakgrund", - "9": "Grön text på svart bakgrund", - "10": "Välj textfärg", - "11": "Välj bakgrundsfärg" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Ersätt" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Ersätt Färg, Sidåtgärder, Bakomliggande, Serversid" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Logga in", "header": "Logga in", "signin": "Logga in", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Kom ihåg mig", "invalid": "Ogiltigt användarnamn eller lösenord.", "locked": "Ditt konto har låsts.", @@ -1438,12 +3273,83 @@ "alreadyLoggedIn": "Du är redan inloggad på", "alreadyLoggedIn2": "enheter. Logga ut från enheterna och försök igen.", "toManySessions": "Du har för många aktiva sessioner", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF till en sida", "header": "PDF till en sida", - "submit": "Konvertera till en sida" + "submit": "Konvertera till en sida", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Extrahera sidor", @@ -1467,18 +3373,59 @@ "adjustContrast": { "title": "Justera kontrast", "header": "Justera kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Ljusstyrka:", "saturation": "Mättnad:", - "download": "Ladda ner" + "download": "Ladda ner", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Komprimera", + "desc": "Compress PDFs to reduce their file size.", "header": "Komprimera PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Filstorlek" + }, "credit": "Denna tjänst använder qpdf för PDF-komprimering/optimering.", "grayscale": { "label": "Tillämpa gråskala för komprimering" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1488,10 +3435,7 @@ "4": "Autoläge - Autojusterar kvaliteten för att få PDF till exakt storlek", "5": "Förväntad PDF-storlek (t.ex. 25MB, 10,8MB, 25KB)" }, - "submit": "Komprimera", - "method": { - "filesize": "Filstorlek" - } + "submit": "Komprimera" }, "decrypt": { "passwordPrompt": "Denna fil är lösenordsskyddad. Fyll i lösenord:", @@ -1592,7 +3536,13 @@ "title": "Ta bort bild", "header": "Ta bort bild", "removeImage": "Ta bort bild", - "submit": "Ta bort bild" + "submit": "Ta bort bild", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Dela upp PDF efter kapitel", @@ -1626,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1661,50 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Ladda ner", - "convert": { - "title": "Konvertera", - "settings": "Inställningar", - "color": "Färg", - "greyscale": "Gråskala", - "fillPage": "Fyll sida", - "pdfaDigitalSignatureWarning": "PDF:en innehåller en digital signatur. Denna kommer att tas bort i nästa steg.", - "grayscale": "Gråskala" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { - "selectAll": "Välj allt" + "closeSelected": "Close Selected Files", + "selectAll": "Välj allt", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Signera" + "read": "Read", + "sign": "Signera", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Laddar...", - "or": "eller" + "or": "eller", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Namn", + "fileFormat": "Format", + "fileSize": "Size", + "fileVersion": "Version", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Välj allt", + "deselectAll": "Deselect All", "deleteSelected": "Ta bort valda", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Ladda ner", - "delete": "Radera" + "delete": "Radera", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Sanera PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Inställningar" + "files": "Files", + "settings": "Inställningar", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Lägg till lösenord", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Kryptera", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Ändra behörigheter", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "säkra,säkerhet", + "header": "Lägg till lösenord (kryptera)", + "selectText": { + "1": "Välj PDF att kryptera", + "2": "Lösenord", + "3": "Längd på krypteringsnyckeln", + "4": "Högre värden är starkare, men lägre värden har bättre kompatibilitet.", + "5": "Behörigheter att ställa in", + "6": "Förhindra sammansättning av dokument", + "7": "Förhindra innehållsextraktion", + "8": "Förhindra extraktion för tillgänglighet", + "9": "Förhindra att fylla i formulär", + "10": "Förhindra modifiering", + "11": "Förhindra anteckningsändring", + "12": "Förhindra utskrift", + "13": "Förhindra utskrift av olika format", + "14": "Ägarlösenord", + "15": "Begränsar vad som kan göras med dokumentet när det väl är öppnat (Stöds inte av alla läsare)", + "16": "Begränsar öppnandet av själva dokumentet" } }, "changePermissions": { "title": "Ändra behörigheter", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Ändra behörigheter", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Förhindra sammansättning av dokument" @@ -1731,10 +4580,784 @@ "label": "Förhindra utskrift av olika format" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Ändra behörigheter" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Ta bort lösenord", + "desc": "Ta bort lösenordsskydd från ditt PDF-dokument.", + "tags": "säkra,Dekryptera,säkerhet,ta bort lösenord,radera lösenord", + "password": { + "stepTitle": "Ta bort lösenord", + "label": "Nuvarande lösenord", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Ta bort", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Ta bort lösenord (Dekryptera)", + "selectText": { + "1": "Välj PDF att dekryptera", + "2": "Lösenord" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Ersätt eller Invertera färgalternativ", + "2": "Standard (standard höghastighetsfärg)", + "3": "Anpassad (anpassade färger)", + "4": "Full-Invertera (invertera alla färger)", + "5": "Höghastighetsfärgalternativ", + "6": "Vit text på svart bakgrund", + "7": "Svart text på vit bakgrund", + "8": "Gul text på svart bakgrund", + "9": "Grön text på svart bakgrund", + "10": "Välj textfärg", + "11": "Välj bakgrundsfärg", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Ersätt", + "title": "Ersätt-Invertera-Färg", + "header": "Ersätt-Invertera färg på PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Redigera,Dölja,svärta,svart,markör,dold", + "title": "Auto-redigera", + "header": "Auto-redigera", + "colorLabel": "Färg", + "textsToRedactLabel": "Text att redigera (radavgränsad)", + "textsToRedactPlaceholder": "t.ex. \\nKonfidentiellt \\nHemligt", + "useRegexLabel": "Använd Regex", + "wholeWordSearchLabel": "Hel ord-sökning", + "customPaddingLabel": "Anpassad extra utfyllnad", + "convertPDFToImageLabel": "Konvertera PDF till PDF-bild (Används för att ta bort text bakom rutan)", + "submitButton": "Skicka" + }, + "replaceColorPdf": { + "tags": "Ersätt Färg, Sidåtgärder, Bakomliggande, Serversid" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/th-TH/translation.json b/frontend/public/locales/th-TH/translation.json index ea56cde7b..e2571aa09 100644 --- a/frontend/public/locales/th-TH/translation.json +++ b/frontend/public/locales/th-TH/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "ข้อความที่กำหนดเอง", "numberPagesDesc": "หมายเลขหน้าที่จะกำหนด หมายเลขเริ่มต้น 'ทั้งหมด', ยังยอมรับ 1-5 หรือ 2,5,9 เป็นต้น", "customNumberDesc": "ค่าเริ่มต้น {n}, ยังยอมรับ 'หน้า {n} ของ {total}', 'ข้อความ-{n}', '{filename}-{n}'", - "submit": "เพิ่มหมายเลขหน้า" + "submit": "เพิ่มหมายเลขหน้า", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "เลือกหน้าตามความต้องการ (ป้อนหมายเลขหน้าแยกด้วยเครื่องหมายจุลภาค เช่น 1,5,6 หรือฟังก์ชัน เช่น 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "เลือก PDF", "multiPdfPrompt": "เลือก PDF หลายไฟล์ (2 ขึ้นไป)", "multiPdfDropPrompt": "เลือก (หรือลากและวาง) PDF ทั้งหมดที่คุณต้องการ", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "คำเตือน: กระบวนการนี้อาจใช้เวลาสูงสุดหนึ่งนาทีขึ้นอยู่กับขนาดไฟล์", "pageOrderPrompt": "เรียงลำดับหน้าตามความต้องการ (ป้อนหมายเลขหน้าแยกด้วยเครื่องหมายจุลภาคหรือฟังก์ชัน เช่น 2n+1) :", - "pageSelectionPrompt": "เลือกหน้าตามความต้องการ (ป้อนหมายเลขหน้าแยกด้วยเครื่องหมายจุลภาค เช่น 1,5,6 หรือฟังก์ชัน เช่น 2n+1) :", "goToPage": "ไปที่หน้า", "true": "จริง", "false": "เท็จ", "unknown": "ไม่ทราบ", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "บันทึก", "saveToBrowser": "บันทึกในเบราว์เซอร์", + "download": "ดาวน์โหลด", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "ปิด", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "ไฟล์ที่เลือก", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "ไม่มีรายการโปรดที่เพิ่ม", "downloadComplete": "การดาวน์โหลดเสร็จสมบูรณ์", "bored": "เบื่อรอหรือยัง?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "เอกสาร PDF มีรหัสผ่าน และไม่ได้ระบุรหัสผ่านหรือรหัสผ่านไม่ถูกต้อง", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "ข้อผิดพลาด", + "dismissAllErrors": "Dismiss All Errors", "sorry": "ขออภัยในปัญหา!", "needHelp": "ต้องการความช่วยเหลือ / พบปัญหา?", "contactTip": "หากคุณยังมีปัญหา อย่าลังเลที่จะติดต่อเราเพื่อขอความช่วยเหลือ คุณสามารถส่งตั๋วบนหน้าของเราใน GitHub หรือ ติดต่อเราผ่าน Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - ส่งตั๋ว", "discordSubmit": "Discord - ส่งโพสต์การสนับสนุน" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "ลบ", "username": "ชื่อผู้ใช้", "password": "รหัสผ่าน", @@ -82,6 +169,7 @@ "green": "เขียว", "blue": "น้ำเงิน", "custom": "ปรับแต่ง...", + "comingSoon": "Coming soon", "WorkInProgess": "กำลังดำเนินการ อาจไม่ทำงานหรือมีบั๊ก โปรดรายงานปัญหาใด ๆ!", "poweredBy": "ขับเคลื่อนโดย", "yes": "ใช่", @@ -115,12 +203,14 @@ "page": "หน้า", "pages": "หน้า", "loading": "กำลังโหลด...", + "review": "Review", "addToDoc": "เพิ่มเข้าสู่เอกสาร", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "นโยบายความเป็นส่วนตัว", + "iAgreeToThe": "I agree to all of the", "terms": "ข้อกำหนดการใช้งาน", "accessibility": "ความเข้าถึง", "cookie": "นโยบายคุกกี้", @@ -160,6 +250,7 @@ "title": "คุณต้องการที่จะทำให้ Stirling PDF ดียิ่งขึ้นไหม?", "paragraph1": "Stirling PDF มีการวิเคราะห์แบบสมัครใจเพื่อช่วยเราปรับปรุงผลิตภัณฑ์ เราไม่นำทางความเป็นส่วนตัวหรือเนื้อหาของไฟล์ไปเก็บข้อมูลใด ๆ", "paragraph2": "โปรดพิจารณาการเปิดใช้งานการวิเคราะห์เพื่อช่วยให้ Stirling-PDF เจริญเติบโตและทำให้เราเข้าใจผู้ใช้งานมากขึ้น", + "learnMore": "Learn more", "enable": "เปิดการวิเคราะห์", "disable": "ปิดการวิเคราะห์", "settings": "คุณสามารถเปลี่ยนแปลงการตั้งค่าการวิเคราะห์ในไฟล์ config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "บันทึกการป้อนฟอร์ม", "help": "เปิดใช้งานเพื่อบันทึกการป้อนข้อมูลที่ใช้ก่อนหน้านี้สำหรับการรันในอนาคต" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "การนำเข้า/ส่งออกฐานข้อมูล", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "เครื่องมือ PDF หลายตัว", "desc": "รวม หมุน จัดเรียง และลบหน้าต่างๆ" }, "merge": { + "tags": "combine,join,unite", "title": "รวมไฟล์ PDF", "desc": "รวม PDF หลายไฟล์เป็นหนึ่งเดียวได้อย่างง่ายดาย" }, "split": { + "tags": "divide,separate,break", "title": "แยกไฟล์ PDF", "desc": "แยก PDF เป็นหลายเอกสาร" }, "rotate": { + "tags": "turn,flip,orient", "title": "หมุน", "desc": "หมุน PDF ของคุณได้อย่างง่ายดาย" }, + "convert": { + "tags": "transform,change", + "title": "แปลง", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "จัดระเบียบ", + "desc": "ลบ/จัดเรียงหน้าต่างๆ ในลำดับที่ต้องการ" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "เพิ่มรูปภาพ", + "desc": "เพิ่มรูปภาพไปยังตำแหน่งที่กำหนดใน PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "เพิ่มลายน้ำ", + "desc": "เพิ่มลายน้ำที่กำหนดเองลงในเอกสาร PDF ของคุณ" + }, + "removePassword": { + "tags": "unlock", + "title": "ลบรหัสผ่าน", + "desc": "ลบรหัสผ่านจากการป้องกันเอกสาร PDF ของคุณ" + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "บีบอัด", + "desc": "บีบอัด PDF เพื่อลดขนาดไฟล์" + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "เปลี่ยนข้อมูลเมตา", + "desc": "เปลี่ยน/ลบ/เพิ่มข้อมูลเมตาจากเอกสาร PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / ทำความสะอาดการสแกน", + "desc": "ทำความสะอาดการสแกนและตรวจจับข้อความจากภาพภายใน PDF และเพิ่มเป็นข้อความอีกครั้ง" + }, + "extractImages": { + "tags": "pull,save,export", + "title": "แยกรูปภาพ", + "desc": "แยกรูปภาพทั้งหมดจาก PDF และบันทึกในรูปแบบ zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "เซ็นชื่อ", + "desc": "เพิ่มลายเซ็นลงใน PDF ด้วยการวาด ข้อความ หรือรูปภาพ" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "แบน", + "desc": "ลบองค์ประกอบแบบอินเตอร์แอคทีฟและฟอร์มทั้งหมดจาก PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "เซ็นชื่อด้วยใบรับรอง", + "desc": "เซ็นชื่อ PDF ด้วยใบรับรอง/คีย์ (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "ซ่อมแซม", + "desc": "พยายามซ่อมแซม PDF ที่เสียหาย/แตก" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "ลบหน้าว่าง", + "desc": "ตรวจจับและลบหน้าว่างจากเอกสาร" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "ลบคำอธิบายประกอบ", + "desc": "ลบความคิดเห็น/คำอธิบายประกอบทั้งหมดจาก PDF" + }, + "compare": { + "tags": "difference", + "title": "เปรียบเทียบ", + "desc": "เปรียบเทียบและแสดงความแตกต่างระหว่างเอกสาร PDF สองฉบับ" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "ลบลายเซ็นใบรับรอง", + "desc": "ลบลายเซ็นใบรับรองจาก PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "เลย์เอาต์หลายหน้า", + "desc": "รวมหน้าหลายหน้าของเอกสาร PDF เข้าด้วยกันในหน้าเดียว" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "ปรับขนาด/สเกลหน้า", + "desc": "เปลี่ยนขนาด/สเกลของหน้าและ/หรือเนื้อหาของมัน" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "เพิ่มหมายเลขหน้า", + "desc": "เพิ่มหมายเลขหน้าตลอดทั้งเอกสารในตำแหน่งที่กำหนด" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "ปรับสี/คอนทราสต์", + "desc": "ปรับคอนทราสต์ ความอิ่มตัว และความสว่างของ PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "ครอบตัด PDF", + "desc": "ครอบตัด PDF เพื่อลดขนาด (รักษาข้อความ!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "แยกหน้าอัตโนมัติ", + "desc": "แยก PDF ที่สแกนโดยใช้ QR Code แยกหน้า" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "รับข้อมูลทั้งหมดเกี่ยวกับ PDF", + "desc": "รับข้อมูลที่เป็นไปได้ทั้งหมดเกี่ยวกับ PDF" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "หน้าขนาดใหญ่เพียงหน้าเดียว", + "desc": "รวมหน้าทั้งหมดของ PDF เป็นหน้าเดียวขนาดใหญ่" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "แสดง Javascript", + "desc": "ค้นหาและแสดง Javascript ที่ฝังใน PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "ลบภาพออกจาก PDF", + "desc": "ลบภาพออกจาก PDF เพื่อลดขนาดไฟล์" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "แบ่งไฟล์ PDF ตามหมวดหมู่", + "desc": "Split a PDF into multiple files based on its chapter structure." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "แยกหน้า", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "ลบ", + "desc": "ลบหน้าที่ไม่ต้องการจากเอกสาร PDF ของคุณ" + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "แยกตามขนาด/จำนวน", + "desc": "แยก PDF เป็นเอกสารหลายฉบับตามขนาด จำนวนหน้า หรือจำนวนเอกสาร" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "เพิ่มรหัสผ่าน", + "desc": "เข้ารหัสเอกสาร PDF ของคุณด้วยรหัสผ่าน" + }, + "changePermissions": { + "title": "เปลี่ยนสิทธิ์", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "ซ้อนทับ PDF บน PDF อีกไฟล์หนึ่ง", + "title": "ซ้อนทับ PDF" + }, "imageToPDF": { "title": "รูปภาพเป็น PDF", "desc": "แปลงรูปภาพ (PNG, JPEG, GIF) เป็น PDF" @@ -355,18 +786,6 @@ "title": "PDF เป็นรูปภาพ", "desc": "แปลง PDF เป็นรูปภาพ (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "จัดระเบียบ", - "desc": "ลบ/จัดเรียงหน้าต่างๆ ในลำดับที่ต้องการ" - }, - "addImage": { - "title": "เพิ่มรูปภาพ", - "desc": "เพิ่มรูปภาพไปยังตำแหน่งที่กำหนดใน PDF" - }, - "watermark": { - "title": "เพิ่มลายน้ำ", - "desc": "เพิ่มลายน้ำที่กำหนดเองลงในเอกสาร PDF ของคุณ" - }, "permissions": { "title": "เปลี่ยนสิทธิ์", "desc": "เปลี่ยนสิทธิ์ของเอกสาร PDF ของคุณ" @@ -375,38 +794,10 @@ "title": "ลบ", "desc": "ลบหน้าที่ไม่ต้องการจากเอกสาร PDF ของคุณ" }, - "addPassword": { - "title": "เพิ่มรหัสผ่าน", - "desc": "เข้ารหัสเอกสาร PDF ของคุณด้วยรหัสผ่าน" - }, - "removePassword": { - "title": "ลบรหัสผ่าน", - "desc": "ลบรหัสผ่านจากการป้องกันเอกสาร PDF ของคุณ" - }, - "compress": { - "title": "บีบอัด", - "desc": "บีบอัด PDF เพื่อลดขนาดไฟล์" - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "เปลี่ยนข้อมูลเมตา", - "desc": "เปลี่ยน/ลบ/เพิ่มข้อมูลเมตาจากเอกสาร PDF" - }, "fileToPDF": { "title": "แปลงไฟล์เป็น PDF", "desc": "แปลงไฟล์เกือบทุกประเภทเป็น PDF (DOCX, PNG, XLS, PPT, TXT และอื่น ๆ)" }, - "ocr": { - "title": "OCR / ทำความสะอาดการสแกน", - "desc": "ทำความสะอาดการสแกนและตรวจจับข้อความจากภาพภายใน PDF และเพิ่มเป็นข้อความอีกครั้ง" - }, - "extractImages": { - "title": "แยกรูปภาพ", - "desc": "แยกรูปภาพทั้งหมดจาก PDF และบันทึกในรูปแบบ zip" - }, "pdfToPDFA": { "title": "PDF เป็น PDF/A", "desc": "แปลง PDF เป็น PDF/A สำหรับการจัดเก็บระยะยาว" @@ -435,70 +826,14 @@ "title": "ตรวจจับ/แยกรูปภาพสแกน", "desc": "แยกรูปภาพหลายรูปจากภาพ/ PDF" }, - "sign": { - "title": "เซ็นชื่อ", - "desc": "เพิ่มลายเซ็นลงใน PDF ด้วยการวาด ข้อความ หรือรูปภาพ" - }, - "flatten": { - "title": "แบน", - "desc": "ลบองค์ประกอบแบบอินเตอร์แอคทีฟและฟอร์มทั้งหมดจาก PDF" - }, - "repair": { - "title": "ซ่อมแซม", - "desc": "พยายามซ่อมแซม PDF ที่เสียหาย/แตก" - }, - "removeBlanks": { - "title": "ลบหน้าว่าง", - "desc": "ตรวจจับและลบหน้าว่างจากเอกสาร" - }, - "removeAnnotations": { - "title": "ลบคำอธิบายประกอบ", - "desc": "ลบความคิดเห็น/คำอธิบายประกอบทั้งหมดจาก PDF" - }, - "compare": { - "title": "เปรียบเทียบ", - "desc": "เปรียบเทียบและแสดงความแตกต่างระหว่างเอกสาร PDF สองฉบับ" - }, - "certSign": { - "title": "เซ็นชื่อด้วยใบรับรอง", - "desc": "เซ็นชื่อ PDF ด้วยใบรับรอง/คีย์ (PEM/P12)" - }, - "removeCertSign": { - "title": "ลบลายเซ็นใบรับรอง", - "desc": "ลบลายเซ็นใบรับรองจาก PDF" - }, - "pageLayout": { - "title": "เลย์เอาต์หลายหน้า", - "desc": "รวมหน้าหลายหน้าของเอกสาร PDF เข้าด้วยกันในหน้าเดียว" - }, - "scalePages": { - "title": "ปรับขนาด/สเกลหน้า", - "desc": "เปลี่ยนขนาด/สเกลของหน้าและ/หรือเนื้อหาของมัน" - }, "pipeline": { "title": "ทิศทางงาน", "desc": "เรียกใช้งานหลายการกระทำใน PDF โดยกำหนดสคริปต์ pipeline" }, - "addPageNumbers": { - "title": "เพิ่มหมายเลขหน้า", - "desc": "เพิ่มหมายเลขหน้าตลอดทั้งเอกสารในตำแหน่งที่กำหนด" - }, "auto-rename": { "title": "เปลี่ยนชื่อ PDF อัตโนมัติ", "desc": "เปลี่ยนชื่อไฟล์ PDF โดยอัตโนมัติตามหัวข้อที่ตรวจจับได้" }, - "adjustContrast": { - "title": "ปรับสี/คอนทราสต์", - "desc": "ปรับคอนทราสต์ ความอิ่มตัว และความสว่างของ PDF" - }, - "crop": { - "title": "ครอบตัด PDF", - "desc": "ครอบตัด PDF เพื่อลดขนาด (รักษาข้อความ!)" - }, - "autoSplitPDF": { - "title": "แยกหน้าอัตโนมัติ", - "desc": "แยก PDF ที่สแกนโดยใช้ QR Code แยกหน้า" - }, "sanitizePDF": { "title": "ทำความสะอาด", "desc": "ลบสคริปต์และองค์ประกอบอื่นๆ จากไฟล์ PDF" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "รับข้อมูลทั้งหมดเกี่ยวกับ PDF", - "desc": "รับข้อมูลที่เป็นไปได้ทั้งหมดเกี่ยวกับ PDF" - }, "pageExtracter": { "title": "แยกหน้า", "desc": "แยกหน้าที่เลือกจาก PDF" }, - "pdfToSinglePage": { - "title": "หน้าขนาดใหญ่เพียงหน้าเดียว", - "desc": "รวมหน้าทั้งหมดของ PDF เป็นหน้าเดียวขนาดใหญ่" - }, - "showJS": { - "title": "แสดง Javascript", - "desc": "ค้นหาและแสดง Javascript ที่ฝังใน PDF" - }, "autoRedact": { "title": "ซ่อนข้อมูลอัตโนมัติ", "desc": "ซ่อนข้อความใน PDF โดยอัตโนมัติตามข้อความที่ป้อน" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF เป็น CSV", "desc": "แยกตารางจาก PDF แปลงเป็น CSV" @@ -551,10 +870,6 @@ "title": "แยกตามขนาด/จำนวน", "desc": "แยก PDF เป็นเอกสารหลายฉบับตามขนาด จำนวนหน้า หรือจำนวนเอกสาร" }, - "overlay-pdfs": { - "title": "ซ้อนทับ PDF", - "desc": "ซ้อนทับ PDF บน PDF อีกไฟล์หนึ่ง" - }, "split-by-sections": { "title": "แยก PDF เป็นส่วน", "desc": "แบ่งแต่ละหน้าของ PDF เป็นส่วนย่อยแนวนอนและแนวตั้ง" @@ -563,43 +878,17 @@ "title": "เพิ่มตราประทับลงใน PDF", "desc": "เพิ่มข้อความหรือตราประทับรูปภาพในตำแหน่งที่กำหนด" }, - "removeImage": { - "title": "ลบภาพออกจาก PDF", - "desc": "ลบภาพออกจาก PDF เพื่อลดขนาดไฟล์" - }, - "splitByChapters": { - "title": "แบ่งไฟล์ PDF ตามหมวดหมู่", - "desc": "Split a PDF into multiple files based on its chapter structure." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" }, - "convert": { - "title": "แปลง" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "แยกหน้า" - }, - "removePages": { - "title": "ลบ", - "desc": "ลบหน้าที่ไม่ต้องการจากเอกสาร PDF ของคุณ" - }, "removeImagePdf": { "title": "ลบภาพออกจาก PDF", "desc": "ลบภาพออกจาก PDF เพื่อลดขนาดไฟล์" }, - "autoSizeSplitPDF": { - "title": "แยกตามขนาด/จำนวน", - "desc": "แยก PDF เป็นเอกสารหลายฉบับตามขนาด จำนวนหน้า หรือจำนวนเอกสาร" - }, "adjust-contrast": { "title": "ปรับสี/คอนทราสต์", "desc": "ปรับคอนทราสต์ ความอิ่มตัว และความสว่างของ PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" - }, - "changePermissions": { - "title": "เปลี่ยนสิทธิ์" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "ดู, อ่าน, เพิ่มคำอธิบาย, ข้อความ, รูปภาพ", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "รวม, การดำเนินการหน้า, ฝั่งเซิร์ฟเวอร์", "title": "รวม", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "รวม", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "ชื่อไฟล์", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "รวม PDF หลายไฟล์ (2 ขึ้นไป)", "sortByName": "จัดเรียงตามชื่อ", "sortByDate": "จัดเรียงตามวันที่", - "removeCertSign": "ลบลายเซ็นดิจิทัลในไฟล์ที่รวม?", - "submit": "รวม", - "sortBy": { - "filename": "ชื่อไฟล์" - } + "removeCertSign": "ลบลายเซ็นดิจิทัลในไฟล์ที่รวม?" }, "split": { - "tags": "การดำเนินการหน้า, แบ่ง, หลายหน้า, ตัด, ฝั่งเซิร์ฟเวอร์", "title": "แยก PDF", "header": "แยก PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "ป้อนหน้าที่ต้องการแยก:", "submit": "แยก", "steps": { + "chooseMethod": "Choose Method", "settings": "การตั้งค่า" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "ขนาดไฟล์" + "name": "ขนาดไฟล์", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "ขนาดไฟล์" + "label": "ขนาดไฟล์", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "การดำเนินการหน้า, แบ่ง, หลายหน้า, ตัด, ฝั่งเซิร์ฟเวอร์" }, "rotate": { - "tags": "ฝั่งเซิร์ฟเวอร์", "title": "หมุน PDF", + "submit": "หมุน", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "ฝั่งเซิร์ฟเวอร์", "header": "หมุน PDF", - "selectAngle": "เลือกมุมการหมุน (เป็นหลายเท่าของ 90 องศา):", - "submit": "หมุน" + "selectAngle": "เลือกมุมการหมุน (เป็นหลายเท่าของ 90 องศา):" + }, + "convert": { + "title": "แปลง", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "การตั้งค่า", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "สี", + "greyscale": "ระดับสีเทา", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "เติมหน้า", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF มีลายเซ็นดิจิทัล ซึ่งจะถูกลบในขั้นตอนถัดไป", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "ระดับสีเทา", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "การแปลง, รูปภาพ, JPG, ภาพ, รูปถ่าย" @@ -727,7 +1263,33 @@ "8": "ลบหน้าหมายเลขสุดท้าย", "9": "ลบหน้าหมายเลขแรกและสุดท้าย", "10": "รวมหน้าแบบคี่-คู่", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(เช่น 1,3,2 หรือ 4-8,2,10-12 หรือ 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "เพิ่มรูปภาพ", "submit": "เพิ่มรูปภาพ" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "ข้อความ, ซ้ำ, ป้าย, ของคุณเอง, ลิขสิทธิ์, เครื่องหมายการค้า, รูปภาพ, JPG, ภาพ, รูปถ่าย", "title": "เพิ่มลายน้ำ", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "เพิ่มลายน้ำ", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "ข้อความ", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "ขนาดตัวอักษร", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "ข้อความ", + "2": "ภาพ" + }, + "tags": "ข้อความ, ซ้ำ, ป้าย, ของคุณเอง, ลิขสิทธิ์, เครื่องหมายการค้า, รูปภาพ, JPG, ภาพ, รูปถ่าย", "header": "เพิ่มลายน้ำ", "customColor": "สีข้อความที่กำหนดเอง", "selectText": { @@ -755,17 +1506,6 @@ "8": "ประเภทลายน้ำ:", "9": "ภาพลายน้ำ:", "10": "Convert PDF to PDF-Image" - }, - "submit": "เพิ่มลายน้ำ", - "type": { - "1": "ข้อความ", - "2": "ภาพ" - }, - "watermarkType": { - "text": "ข้อความ" - }, - "settings": { - "fontSize": "ขนาดตัวอักษร" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "ลบหน้า, ลบหน้า", "title": "ลบ", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "ลบ" }, - "addPassword": { - "tags": "ปลอดภัย, ความปลอดภัย", - "title": "เพิ่มรหัสผ่าน", - "header": "เพิ่มรหัสผ่าน (เข้ารหัส)", - "selectText": { - "1": "เลือก PDF เพื่อเข้ารหัส", - "2": "รหัสผ่านผู้ใช้", - "3": "ความยาวคีย์การเข้ารหัส", - "4": "ค่าสูงกว่ามีความแข็งแกร่งกว่า แต่ค่าต่ำกว่าเข้ากันได้ดีกว่า", - "5": "สิทธิ์ที่ตั้งค่า (แนะนำให้ใช้พร้อมรหัสผ่านผู้ดูแล)", - "6": "ป้องกันการประกอบเอกสาร", - "7": "ป้องกันการสกัดเนื้อหา", - "8": "ป้องกันการสกัดเพื่อการเข้าถึง", - "9": "ป้องกันการกรอกแบบฟอร์ม", - "10": "ป้องกันการแก้ไข", - "11": "ป้องกันการแก้ไขคำอธิบายประกอบ", - "12": "ป้องกันการพิมพ์", - "13": "ป้องกันการพิมพ์รูปแบบต่างๆ", - "14": "รหัสผ่านผู้ดูแล", - "15": "จำกัดสิ่งที่สามารถทำได้กับเอกสารเมื่อเปิด (ไม่รองรับโดยผู้อ่านทั้งหมด)", - "16": "จำกัดการเปิดเอกสาร" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "เข้ารหัส", "tooltip": { - "permissions": { - "title": "เปลี่ยนสิทธิ์" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "ปลอดภัย, ถอดรหัส, ความปลอดภัย, ลบรหัสผ่าน", - "title": "ลบรหัสผ่าน", - "header": "ลบรหัสผ่าน (ถอดรหัส)", - "selectText": { - "1": "เลือก PDF ที่ต้องการถอดรหัส", - "2": "รหัสผ่าน" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "ลบ", - "desc": "ลบรหัสผ่านจากการป้องกันเอกสาร PDF ของคุณ", - "password": { - "stepTitle": "ลบรหัสผ่าน", - "label": "รหัสผ่านปัจจุบัน" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "ชื่อ, ผู้แต่ง, วันที่, สร้าง, เวลา, ผู้เผยแพร่, ผู้ผลิต, สถิติ", - "title": "เปลี่ยนข้อมูลเมตา", "header": "เปลี่ยนข้อมูลเมตา", + "submit": "เปลี่ยน", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "ชื่อ, ผู้แต่ง, วันที่, สร้าง, เวลา, ผู้เผยแพร่, ผู้ผลิต, สถิติ", "selectText": { "1": "โปรดแก้ไขตัวแปรที่คุณต้องการเปลี่ยน", "2": "ลบข้อมูลเมตาทั้งหมด", @@ -856,15 +1877,7 @@ "4": "ข้อมูลเมตาอื่น ๆ:", "5": "เพิ่มรายการข้อมูลเมตาที่กำหนดเอง" }, - "author": "ผู้แต่ง:", - "creationDate": "วันที่สร้าง (yyyy/MM/dd HH:mm:ss):", - "creator": "ผู้สร้าง:", - "keywords": "คำสำคัญ:", - "modDate": "วันที่แก้ไข (yyyy/MM/dd HH:mm:ss):", - "producer": "ผู้ผลิต:", - "subject": "หัวข้อ:", - "trapped": "ติดกับ:", - "submit": "เปลี่ยน" + "modDate": "วันที่แก้ไข (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "การแปลง, รูปแบบ, เอกสาร, รูปภาพ, สไลด์, ข้อความ, การแปลง, สำนักงาน, เอกสาร, Word, Excel, PowerPoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "การรู้จำ, ข้อความ, รูปภาพ, การสแกน, อ่าน, ระบุ, ตรวจจับ, แก้ไขได้", "title": "OCR / ทำความสะอาดการสแกน", + "desc": "ทำความสะอาดการสแกนและตรวจจับข้อความจากภาพภายใน PDF และเพิ่มเป็นข้อความอีกครั้ง", "header": "ทำความสะอาดการสแกน / OCR (การรู้จำอักขระด้วยแสง)", "selectText": { "1": "เลือกภาษาที่จะตรวจจับใน PDF (รายการที่แสดงคือภาษาที่ตรวจจับได้ในขณะนี้):", @@ -896,23 +1910,89 @@ "help": "โปรดอ่านเอกสารนี้เพื่อใช้งานภาษาอื่นๆ และ/หรือใช้งานนอก docker", "credit": "บริการนี้ใช้ qpdf และ Tesseract สำหรับ OCR", "submit": "ประมวลผล PDF ด้วย OCR", - "desc": "ทำความสะอาดการสแกนและตรวจจับข้อความจากภาพภายใน PDF และเพิ่มเป็นข้อความอีกครั้ง", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "การตั้งค่า", "ocrMode": { - "label": "โหมด OCR" + "label": "โหมด OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "ภาษา" + "label": "ภาษา", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "โหมด OCR" + "title": "โหมด OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "ภาษา" + "title": "ภาษา", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "แยกรูปภาพ", "selectText": "เลือกรูปแบบภาพที่จะใช้ในการแปลงรูปภาพที่แยกได้", "allowDuplicates": "บันทึกลายซ้ำ", - "submit": "แยก" + "submit": "แยก", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "การจัดเก็บ, ระยะยาว, มาตรฐาน, การแปลง, การเก็บรักษา", @@ -993,17 +2079,53 @@ }, "info": "Python ไม่มีการติดตั้ง กรุณาติดตั้งเพื่อใช้งาน" }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "อนุญาต, อักษรย่อ, ลายเซ็นที่วาด, ลายเซ็นข้อความ, ลายเซ็นรูปภาพ", "title": "เซ็นชื่อ", "header": "เซ็นชื่อ PDF", "upload": "อัปโหลดรูปภาพ", - "draw": "วาดลายเซ็น", - "text": "ป้อนข้อความ", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "ล้าง", "add": "เพิ่ม", "saved": "ลายเซ็นที่บันทึกไว้", "save": "บันทึกลายเซ็น", + "applySignatures": "Apply Signatures", "personalSigs": "ลายเซ็นส่วนตัว", "sharedSigs": "ลายเซ็นร่วม", "noSavedSigs": "ไม่พบลายเซ็นที่บันทึกไว้", @@ -1015,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "อนุญาต, อักษรย่อ, ลายเซ็นที่วาด, ลายเซ็นข้อความ, ลายเซ็นรูปภาพ" }, "flatten": { - "tags": "สถิต, ปิดการใช้งาน, ไม่โต้ตอบ, ลดจำนวน", "title": "แบน", "header": "แบน PDF", "flattenOnlyForms": "แบนเฉพาะฟอร์ม", "submit": "แบน", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "การตั้งค่า" }, "options": { - "flattenOnlyForms": "แบนเฉพาะฟอร์ม" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "แบนเฉพาะฟอร์ม", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "สถิต, ปิดการใช้งาน, ไม่โต้ตอบ, ลดจำนวน" }, "repair": { "tags": "ซ่อมแซม, กู้คืน, กู้", "title": "ซ่อมแซม", "header": "ซ่อมแซม PDF", - "submit": "ซ่อมแซม" + "submit": "ซ่อมแซม", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "ทำความสะอาด, ลดจำนวน, ไม่มีเนื้อหา, จัดระเบียบ", "title": "ลบหน้าว่าง", "header": "ลบหน้าว่าง", - "threshold": "เกณฑ์ความขาวของพิกเซล:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "ลบหน้าว่าง", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "ทำความสะอาด, ลดจำนวน, ไม่มีเนื้อหา, จัดระเบียบ", "thresholdDesc": "เกณฑ์ในการกำหนดว่าพิกเซลขาวเพียงพอจะถูกจัดเป็น 'ขาว' เท่าใด 0 = ดำ, 255 = ขาวบริสุทธิ์", - "whitePercent": "เปอร์เซ็นต์ความขาว (%):", - "whitePercentDesc": "เปอร์เซ็นต์ของหน้าที่ต้องเป็นพิกเซล 'ขาว' เพื่อจะถูกลบ", - "submit": "ลบหน้าว่าง" + "whitePercentDesc": "เปอร์เซ็นต์ของหน้าที่ต้องเป็นพิกเซล 'ขาว' เพื่อจะถูกลบ" }, "removeAnnotations": { "tags": "ความคิดเห็น, เน้นข้อความ, โน้ต, มาร์คอัพ, ลบ", "title": "ลบคำอธิบายประกอบ", "header": "ลบคำอธิบายประกอบ", - "submit": "ลบ" + "submit": "ลบ", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "แยกแยะ, เปรียบเทียบ, การเปลี่ยนแปลง, การวิเคราะห์", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "ยืนยัน, PEM, P12, เป็นทางการ, เข้ารหัส", "title": "การเซ็นชื่อด้วยใบรับรอง", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "ตำแหน่ง", + "logoTitle": "Logo", + "name": "ชื่อ", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "ใส่รหัสผ่าน Keystore หรือคีย์ส่วนตัวของคุณ (ถ้ามี):", + "passwordOptional": "Leave empty if no password", + "reason": "เหตุผล", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "แสดงโลโก้", "header": "เซ็นชื่อ PDF ด้วยใบรับรองของคุณ (กำลังดำเนินการ)", "selectPDF": "เลือกไฟล์ PDF สำหรับการเซ็น:", "jksNote": "หมายเหตุ: หากประเภทใบรับรองของคุณไม่อยู่ในรายการด้านล่าง กรุณาแปลงเป็นไฟล์ Java Keystore (.jks) โดยใช้เครื่องมือ keytool จากบรรทัดคำสั่ง จากนั้นเลือกตัวเลือกไฟล์ .jks ด้านล่าง", @@ -1089,13 +2484,7 @@ "selectCert": "เลือกไฟล์ใบรับรองของคุณ (รูปแบบ X.509, อาจเป็น .pem หรือ .der):", "selectP12": "เลือกไฟล์ PKCS#12 Keystore ของคุณ (.p12 หรือ .pfx) (ไม่บังคับ หากมี ควรมีคีย์ส่วนตัวและใบรับรองของคุณ):", "selectJKS": "เลือกไฟล์ Java Keystore ของคุณ (.jks หรือ .keystore):", - "certType": "ประเภทใบรับรอง", - "password": "ใส่รหัสผ่าน Keystore หรือคีย์ส่วนตัวของคุณ (ถ้ามี):", "showSig": "แสดงลายเซ็น", - "reason": "เหตุผล", - "location": "ตำแหน่ง", - "name": "ชื่อ", - "showLogo": "แสดงโลโก้", "submit": "เซ็นชื่อ PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "ลบลายเซ็นใบรับรอง", "header": "ลบลายเซ็นดิจิทัลจาก PDF", "selectPDF": "เลือกไฟล์ PDF:", - "submit": "ลบลายเซ็น" + "submit": "ลบลายเซ็น", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "รวม, ประกอบ, มุมมองเดียว, จัดระเบียบ", @@ -1111,16 +2511,157 @@ "header": "เลย์เอาต์หลายหน้า", "pagesPerSheet": "จำนวนหน้าต่อแผ่น:", "addBorder": "เพิ่มขอบ", - "submit": "ส่ง" + "submit": "ส่ง", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "ปรับขนาด, แก้ไข, มิติ, ปรับ", "title": "ปรับสเกลหน้า", "header": "ปรับสเกลหน้า", "pageSize": "ขนาดหน้าของเอกสาร", "keepPageSize": "ขนาดต้นฉบับ", "scaleFactor": "ระดับการซูม (ครอบตัด) ของหน้า", - "submit": "ส่ง" + "submit": "ส่ง", + "tags": "ปรับขนาด, แก้ไข, มิติ, ปรับ" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "หน้า, เลขหน้า, จัดระเบียบ, ดัชนี" @@ -1129,16 +2670,83 @@ "tags": "ตรวจจับอัตโนมัติ, ตั้งชื่อใหม่, จัดระเบียบ, ป้าย", "title": "เปลี่ยนชื่ออัตโนมัติ", "header": "เปลี่ยนชื่อ PDF อัตโนมัติ", - "submit": "เปลี่ยนชื่ออัตโนมัติ" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "เปลี่ยนชื่ออัตโนมัติ", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "ปรับสี, จูน, แก้ไข, ปรับปรุง" }, "crop": { - "tags": "ครอบตัด, ลดขนาด, แก้ไข, รูปทรง", "title": "ครอบตัด", "header": "ครอบตัด PDF", - "submit": "ส่ง" + "submit": "ส่ง", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "ครอบตัด, ลดขนาด, แก้ไข, รูปทรง" }, "autoSplitPDF": { "tags": "แยกโดย QR, แยก, ส่วนสแกน, จัดระเบียบ", @@ -1221,24 +2829,124 @@ "downloadJS": "ดาวน์โหลด Javascript", "submit": "แสดง" }, - "autoRedact": { - "tags": "ซ่อน, ซ่อนข้อความ, ซ่อนด้วยสีดำ", - "title": "ซ่อนข้อมูลอัตโนมัติ", - "header": "ซ่อนข้อมูลอัตโนมัติ", - "colorLabel": "สี", - "textsToRedactLabel": "ข้อความที่จะซ่อน (แยกด้วยบรรทัด)", - "textsToRedactPlaceholder": "เช่น \\nConfidential \\nTop-Secret", - "useRegexLabel": "ใช้ Regex", - "wholeWordSearchLabel": "ค้นหาทั้งคำ", - "customPaddingLabel": "การเติมที่กำหนดเอง", - "convertPDFToImageLabel": "แปลง PDF เป็นภาพ PDF (ใช้เพื่อลบข้อความที่อยู่ด้านหลังกล่อง)", - "submitButton": "ส่ง" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "ขั้นสูง" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "เพิ่ม", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "หน้า", + "placeholder": "(เช่น 1,2,8 หรือ 4,7,12-16 หรือ 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1264,21 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "ขั้นสูง" - }, - "wordsToRedact": { - "add": "เพิ่ม" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "หน้า", - "placeholder": "(เช่น 1,2,8 หรือ 4,7,12-16 หรือ 2n-1)" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV, การแยกตาราง, แยก, การแปลง" @@ -1289,11 +2983,15 @@ "overlay-pdfs": { "tags": "ซ้อนทับ", "header": "ซ้อนทับไฟล์ PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "เลือกไฟล์ PDF พื้นฐาน" }, "overlayFiles": { - "label": "เลือกไฟล์ PDF ซ้อนทับ" + "label": "เลือกไฟล์ PDF ซ้อนทับ", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "เลือกโหมดซ้อนทับ", @@ -1303,14 +3001,53 @@ }, "counts": { "label": "จำนวนการซ้อนทับ (สำหรับโหมดวนซ้ำ)", - "placeholder": "ป้อนจำนวนแยกด้วยเครื่องหมายจุลภาค (เช่น 2,3,1)" + "placeholder": "ป้อนจำนวนแยกด้วยเครื่องหมายจุลภาค (เช่น 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "เลือกตำแหน่งซ้อนทับ", "foreground": "พื้นหน้า", "background": "พื้นหลัง" }, - "submit": "ส่ง" + "submit": "ส่ง", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "แยกส่วน, แบ่ง, ปรับแต่ง", @@ -1331,6 +3068,7 @@ "tags": "ตราประทับ, เพิ่มรูปภาพ, รูปภาพกึ่งกลาง, ลายน้ำ, PDF, ฝัง, ปรับแต่ง", "header": "ตราประทับ PDF", "title": "ตราประทับ PDF", + "stampSetup": "Stamp Setup", "stampType": "ประเภทตราประทับ", "stampText": "ข้อความตราประทับ", "stampImage": "รูปภาพตราประทับ", @@ -1343,7 +3081,19 @@ "overrideY": "แทนที่พิกัด Y", "customMargin": "ขอบที่กำหนดเอง", "customColor": "สีข้อความที่กำหนดเอง", - "submit": "ส่ง" + "submit": "ส่ง", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Remove Image,Page operations,Back end,server side" @@ -1361,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1388,40 +3139,122 @@ "version": "เวอร์ชัน", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Replace-Invert Color PDF", - "selectText": { - "1": "Replace or Invert color Options", - "2": "Default(Default high contrast colors)", - "3": "Custom(Customized colors)", - "4": "Full-Invert(Invert all colors)", - "5": "High contrast color options", - "6": "white text on black background", - "7": "Black text on white background", - "8": "Yellow text on black background", - "9": "Green text on black background", - "10": "Choose text Color", - "11": "Choose background Color" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Replace" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Replace Color,Page operations,Back end,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "ลงชื่อเข้าใช้", "header": "ลงชื่อเข้าใช้", "signin": "ลงชื่อเข้าใช้", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "จำฉันไว้", "invalid": "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง", "locked": "บัญชีของคุณถูกล็อค", @@ -1440,12 +3273,83 @@ "alreadyLoggedIn": "คุณได้เข้าสู่ระบบใน", "alreadyLoggedIn2": "อุปกรณ์แล้ว กรุณาออกจากระบบจากอุปกรณ์ที่ใช้งานอยู่แล้ว จากนั้นลองใหม่อีกครั้ง", "toManySessions": "คุณมีการเข้าสู่ระบบพร้อมกันเกินกว่ากำหนด", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF เป็นหน้าขนาดใหญ่เพียงหน้าเดียว", "header": "PDF เป็นหน้าขนาดใหญ่เพียงหน้าเดียว", - "submit": "แปลงเป็นหน้าขนาดใหญ่เพียงหน้าเดียว" + "submit": "แปลงเป็นหน้าขนาดใหญ่เพียงหน้าเดียว", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "แยกหน้า", @@ -1469,18 +3373,59 @@ "adjustContrast": { "title": "ปรับคอนทราสต์", "header": "ปรับคอนทราสต์", + "basic": "Basic Adjustments", "contrast": "คอนทราสต์:", "brightness": "ความสว่าง:", "saturation": "ความอิ่มตัว:", - "download": "ดาวน์โหลด" + "download": "ดาวน์โหลด", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "บีบอัด", + "desc": "Compress PDFs to reduce their file size.", "header": "บีบอัด PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "ขนาดไฟล์" + }, "credit": "บริการนี้ใช้ qpdf สำหรับการบีบอัด/การเพิ่มประสิทธิภาพ PDF", "grayscale": { "label": "ใช้ระดับสีเทาสำหรับการบีบอัด" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1490,10 +3435,7 @@ "4": "โหมดอัตโนมัติ - ปรับคุณภาพอัตโนมัติเพื่อให้ PDF ตรงกับขนาดที่ต้องการ", "5": "ขนาด PDF ที่คาดหวัง (เช่น 25MB, 10.8MB, 25KB)" }, - "submit": "บีบอัด", - "method": { - "filesize": "ขนาดไฟล์" - } + "submit": "บีบอัด" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1594,7 +3536,13 @@ "title": "ลบภาพ", "header": "ลบภาพ", "removeImage": "ลบภาพ", - "submit": "ยืนยันการลบภาพ" + "submit": "ยืนยันการลบภาพ", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "แบ่งไฟล์ PDF ตามหมวดหมู่", @@ -1628,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1663,45 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "ดาวน์โหลด", - "convert": { - "title": "แปลง", - "settings": "การตั้งค่า", - "color": "สี", - "greyscale": "ระดับสีเทา", - "fillPage": "เติมหน้า", - "pdfaDigitalSignatureWarning": "PDF มีลายเซ็นดิจิทัล ซึ่งจะถูกลบในขั้นตอนถัดไป", - "grayscale": "ระดับสีเทา" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "เซ็นชื่อ" + "read": "Read", + "sign": "เซ็นชื่อ", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { - "loading": "กำลังโหลด..." + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "กำลังโหลด...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "ชื่อ", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "เวอร์ชัน", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "ดาวน์โหลด", - "delete": "ลบ" + "delete": "ลบ", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "ทำความสะอาด PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "การตั้งค่า" + "files": "Files", + "settings": "การตั้งค่า", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "เพิ่มรหัสผ่าน", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "เข้ารหัส", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "เปลี่ยนสิทธิ์", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "ปลอดภัย, ความปลอดภัย", + "header": "เพิ่มรหัสผ่าน (เข้ารหัส)", + "selectText": { + "1": "เลือก PDF เพื่อเข้ารหัส", + "2": "รหัสผ่านผู้ใช้", + "3": "ความยาวคีย์การเข้ารหัส", + "4": "ค่าสูงกว่ามีความแข็งแกร่งกว่า แต่ค่าต่ำกว่าเข้ากันได้ดีกว่า", + "5": "สิทธิ์ที่ตั้งค่า (แนะนำให้ใช้พร้อมรหัสผ่านผู้ดูแล)", + "6": "ป้องกันการประกอบเอกสาร", + "7": "ป้องกันการสกัดเนื้อหา", + "8": "ป้องกันการสกัดเพื่อการเข้าถึง", + "9": "ป้องกันการกรอกแบบฟอร์ม", + "10": "ป้องกันการแก้ไข", + "11": "ป้องกันการแก้ไขคำอธิบายประกอบ", + "12": "ป้องกันการพิมพ์", + "13": "ป้องกันการพิมพ์รูปแบบต่างๆ", + "14": "รหัสผ่านผู้ดูแล", + "15": "จำกัดสิ่งที่สามารถทำได้กับเอกสารเมื่อเปิด (ไม่รองรับโดยผู้อ่านทั้งหมด)", + "16": "จำกัดการเปิดเอกสาร" } }, "changePermissions": { "title": "เปลี่ยนสิทธิ์", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "เปลี่ยนสิทธิ์", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "ป้องกันการประกอบเอกสาร" @@ -1728,10 +4580,784 @@ "label": "ป้องกันการพิมพ์รูปแบบต่างๆ" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "เปลี่ยนสิทธิ์" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "ลบรหัสผ่าน", + "desc": "ลบรหัสผ่านจากการป้องกันเอกสาร PDF ของคุณ", + "tags": "ปลอดภัย, ถอดรหัส, ความปลอดภัย, ลบรหัสผ่าน", + "password": { + "stepTitle": "ลบรหัสผ่าน", + "label": "รหัสผ่านปัจจุบัน", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "ลบ", + "results": { + "title": "Decrypted PDFs" + }, + "header": "ลบรหัสผ่าน (ถอดรหัส)", + "selectText": { + "1": "เลือก PDF ที่ต้องการถอดรหัส", + "2": "รหัสผ่าน" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or Invert color Options", + "2": "Default(Default high contrast colors)", + "3": "Custom(Customized colors)", + "4": "Full-Invert(Invert all colors)", + "5": "High contrast color options", + "6": "white text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color", + "header": "Replace-Invert Color PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "ซ่อน, ซ่อนข้อความ, ซ่อนด้วยสีดำ", + "title": "ซ่อนข้อมูลอัตโนมัติ", + "header": "ซ่อนข้อมูลอัตโนมัติ", + "colorLabel": "สี", + "textsToRedactLabel": "ข้อความที่จะซ่อน (แยกด้วยบรรทัด)", + "textsToRedactPlaceholder": "เช่น \\nConfidential \\nTop-Secret", + "useRegexLabel": "ใช้ Regex", + "wholeWordSearchLabel": "ค้นหาทั้งคำ", + "customPaddingLabel": "การเติมที่กำหนดเอง", + "convertPDFToImageLabel": "แปลง PDF เป็นภาพ PDF (ใช้เพื่อลบข้อความที่อยู่ด้านหลังกล่อง)", + "submitButton": "ส่ง" + }, + "replaceColorPdf": { + "tags": "Replace Color,Page operations,Back end,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/tr-TR/translation.json b/frontend/public/locales/tr-TR/translation.json index b7f549348..d4495d033 100644 --- a/frontend/public/locales/tr-TR/translation.json +++ b/frontend/public/locales/tr-TR/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Özel Metin", "numberPagesDesc": "Hangi sayfaların numaralandırılacağını, varsayılan 'all', ayrıca 1-5 veya 2,5,9 vb. kabul eder", "customNumberDesc": "Varsayılan {n}, ayrıca 'Sayfa {n} / {total}', 'Metin-{n}', '{filename}-{n} kabul eder", - "submit": "Sayfa Numaraları Ekle" + "submit": "Sayfa Numaraları Ekle", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Özel Sayfa Seçimi (1,5,6 sayfa numaralarının virgülle ayrılmış bir listesini veya 2n+1 gibi bir fonksiyon girin) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "PDF(leri) seçin", "multiPdfPrompt": "PDFleri seçin (2+)", "multiPdfDropPrompt": "Tüm gerekli PDF'leri seçin (ya da sürükleyip bırakın)", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "çok büyük. İzin verilen maksimum boyut:", "processTimeWarning": "Uyarı: Bu işlem, dosya boyutuna bağlı olarak bir dakikaya kadar sürebilir.", "pageOrderPrompt": "Özel Sayfa Sırası (Virgülle ayrılmış sayfa numaraları veya 2n+1 gibi bir fonksiyon girin) :", - "pageSelectionPrompt": "Özel Sayfa Seçimi (1,5,6 sayfa numaralarının virgülle ayrılmış bir listesini veya 2n+1 gibi bir fonksiyon girin) :", "goToPage": "Sayfaya Git", "true": "Doğru", "false": "Yanlış", "unknown": "Bilinmeyen", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Kaydet", "saveToBrowser": "Tarayıcıya Kaydet", + "download": "İndir", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Geri Al", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Kapat", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "dosya seçildi", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Favori eklenmedi", "downloadComplete": "İndirme Tamamlandı", "bored": "Sıkıldınız mı?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF belgesi şifreli ve şifre ya sağlanmadı ya da yanlış.", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Hata", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Sorun için özür dileriz!", "needHelp": "Yardıma mı ihtiyacınız var / Bir sorun mu buldunuz?", "contactTip": "Hala sorun yaşıyorsanız, yardım için bize ulaşmaktan çekinmeyin. GitHub sayfamızdan bir bilet gönderebilir veya Discord üzerinden bizimle iletişime geçebilirsiniz:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Hata gönderin", "discordSubmit": "Discord - Destek gönderisi gönderin" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Sil", "username": "Kullanıcı Adı", "password": "Parola", @@ -82,6 +169,7 @@ "green": "Yeşil", "blue": "Mavi", "custom": "Özel", + "comingSoon": "Coming soon", "WorkInProgess": "Çalışmalar devam ediyor, Çalışmayabilir veya hatalı olabilir, Lütfen herhangi bir sorunu bildirin!", "poweredBy": "Tarafından desteklenmektedir", "yes": "Evet", @@ -115,12 +203,14 @@ "page": "Sayfa", "pages": "Sayfalar", "loading": "Yükleniyor...", + "review": "Review", "addToDoc": "Dökümana Ekle", "reset": "Sıfırla", "apply": "Uygula", "noFileSelected": "Hiçbir dosya seçilmedi. Lütfen bir dosya yükleyin.", "legal": { "privacy": "Gizlilik Politikası", + "iAgreeToThe": "I agree to all of the", "terms": "Şartlar ve koşullar", "accessibility": "Erişilebilirlik", "cookie": "Çerez Politikası", @@ -160,6 +250,7 @@ "title": "Stirling PDF’i daha iyi hale getirmek ister misiniz?", "paragraph1": "Stirling PDF, ürünü geliştirmemize yardımcı olmak için isteğe bağlı analizleri içerir. Kişisel bilgileri veya dosya içeriklerini asla takip etmiyoruz.", "paragraph2": "Stirling PDF’in büyümesine destek olmak ve kullanıcılarımızı daha iyi anlayabilmemiz için analizleri etkinleştirmeyi düşünebilirsiniz.", + "learnMore": "Learn more", "enable": "Analizi Etkinleştir", "disable": "Analizi Devre Dışı Bırak", "settings": "Analiz ayarlarını config/settings.yml dosyasından değiştirebilirsiniz" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Form girdilerini kaydet", "help": "Gelecekteki çalıştırmalar için önceden kullanılan girdileri saklamayı etkinleştirin" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "En Çok Kullanılan 20", "all": "Hepsi", "refresh": "Yenile", - "includeHomepage": "Ana Sayfayı Dahil Et ('/')", - "includeLoginPage": "Giriş Sayfasını Dahil Et ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Toplam Uç Nokta", "totalVisits": "Toplam Ziyaret", "showing": "Gösteriliyor", @@ -290,7 +431,9 @@ "top": "En Çok", "numberOfVisits": "Ziyaret Sayısı", "visitsTooltip": "Ziyaret: {0} (toplamın %{1}’i)", - "retry": "Yeniden Dene" + "retry": "Yeniden Dene", + "includeHomepage": "Ana Sayfayı Dahil Et ('/')", + "includeLoginPage": "Giriş Sayfasını Dahil Et ('/login')" }, "database": { "title": "Veri Tabanını İçe/Dışa Aktar", @@ -331,22 +474,310 @@ "alphabetical": "Alfabetik", "globalPopularity": "Global Popülerlik", "sortBy": "Sıralama ölçütü:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Çoklu Araç", "desc": "Birleştir, Döndür, Yeniden Düzenle ve Sayfaları Kaldır" }, "merge": { + "tags": "combine,join,unite", "title": "Birleştir", "desc": "Çoklu PDF'leri tek bir dosyada kolayca birleştirin." }, "split": { + "tags": "divide,separate,break", "title": "Ayır", "desc": "PDF'leri birden fazla belgeye ayırın" }, "rotate": { + "tags": "turn,flip,orient", "title": "Döndür", "desc": "PDF'lerinizi kolayca döndürün." }, + "convert": { + "tags": "transform,change", + "title": "Dönüştür", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Düzenle", + "desc": "Sayfaları herhangi bir sırayla kaldırın/düzenleyin" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Resim Ekle", + "desc": "PDF'e belirli bir konuma resim ekler" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Filigran Ekle", + "desc": "PDF belgenize özel bir filigran ekleyin." + }, + "removePassword": { + "tags": "unlock", + "title": "Parolayı Kaldır", + "desc": "PDF belgenizden parola korumasını kaldırın." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Sıkıştır", + "desc": "PDF'lerin dosya boyutunu azaltmak için sıkıştırın." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "PDF Formlarının Kilidini Kaldır", + "desc": "Form alanlarını düzenlenebilir hâle getir." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Metaveriyi Değiştir", + "desc": "Bir PDF belgesinden metaveriyi değiştir/kaldır/ekle" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Taramaları Temizle", + "desc": "Taramaları temizler ve bir PDF içindeki resimlerden metni algılar ve tekrar metin olarak ekler." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Resimleri Çıkar", + "desc": "Bir PDF'ten tüm resimleri çıkarır ve bunları zip olarak kaydeder." + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "İmzala", + "desc": "Çizim, metin veya resim ile PDF'e imza ekler" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Düzleştir", + "desc": "PDF'ten tüm etkileşimli öğeleri ve formları kaldırır" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Sertifika ile İmzala", + "desc": "Bir PDF'i Sertifika/Anahtar (PEM/P12) ile imzalar" + }, + "repair": { + "tags": "fix,restore", + "title": "Onar", + "desc": "Bozuk/kırık bir PDF'i onarmaya çalışır" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Boş Sayfaları Kaldır", + "desc": "Bir belgeden boş sayfaları tespit eder ve kaldırır" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Ek Açıklamaları Kaldır", + "desc": "PDF'deki tüm yorumları/açıklamaları kaldırır" + }, + "compare": { + "tags": "difference", + "title": "Karşılaştır", + "desc": "2 PDF Belgesi arasındaki farkları karşılaştırır ve gösterir" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Sertifika İmzasını Kaldır", + "desc": "PDF'ten sertifika imzasını kaldırır" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Çoklu-Sayfa Düzeni", + "desc": "Bir PDF belgesinin çoklu sayfalarını tek bir sayfada birleştirir" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Sayfa boyutunu/ölçeğini ayarla", + "desc": "Bir sayfanın ve/veya içeriğinin boyutunu/ölçeğini değiştirir" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Sayfa Numaraları Ekle", + "desc": "Bir belgeye belirli bir konuma sayfa numaraları ekler" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Renkleri/Kontrastı Ayarla", + "desc": "Bir PDF'in Kontrastını, Doygunluğunu ve Parlaklığını ayarlar" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF'i Kırp", + "desc": "Boyutunu azaltmak için bir PDF'i kırpar (metni korur!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Sayfaları Otomatik Böl", + "desc": "Fiziksel taranmış sayfa bölücü QR Kod ile Taranmış PDF'i Otomatik Böl" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "PDF Hakkında TÜM Bilgiyi Al", + "desc": "PDF'ler hakkında mümkün olan her türlü bilgiyi toplar" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF'i Tek Büyük Sayfaya", + "desc": "Tüm PDF sayfalarını tek büyük bir sayfada birleştirir" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Javascript'i Göster", + "desc": "Bir PDF'e enjekte edilen herhangi bir JS'i araştırır ve gösterir" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manuel Sansürleme", + "desc": "Seçilen metinler, çizilen şekiller ve/veya belirli sayfalar üzerinden PDF'yi sansürler" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Resmi kaldır", + "desc": "Dosya boyutunu küçültmek için PDF'den resmi kaldırın" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "PDF'yi Bölümlere Göre Böl", + "desc": "PDF'yi bölüm yapısına göre birden fazla dosyaya ayırın." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "PDF İmzasını Doğrula", + "desc": "PDF belgelerindeki dijital imzaları ve sertifikaları doğrulayın" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "İçindekiler Tablosunu Düzenle", + "desc": "PDF belgelerinde yer işaretleri ve içindekiler tablosu ekleyin veya düzenleyin" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Sayfaları Çıkar", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Kaldır", + "desc": "PDF belgenizden istenmeyen sayfaları silin." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Boyut/Sayıya Göre Otomatik Bölme", + "desc": "Tek bir PDF'yi boyut, sayfa sayısı veya belge sayısına göre birden fazla belgeye bölün" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Parola Ekle", + "desc": "PDF belgenizi bir parola ile şifreleyin." + }, + "changePermissions": { + "title": "İzinleri Değiştir", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "PDF'leri başka bir PDF'nin üzerine bindirir", + "title": "PDF'leri Bindirme" + }, "imageToPDF": { "title": "Resimden PDF'e", "desc": "Bir resmi (PNG, JPEG, GIF) PDF'e dönüştürün." @@ -355,18 +786,6 @@ "title": "PDF'den Resme", "desc": "PDF'yi bir resme dönüştürün. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Düzenle", - "desc": "Sayfaları herhangi bir sırayla kaldırın/düzenleyin" - }, - "addImage": { - "title": "Resim Ekle", - "desc": "PDF'e belirli bir konuma resim ekler" - }, - "watermark": { - "title": "Filigran Ekle", - "desc": "PDF belgenize özel bir filigran ekleyin." - }, "permissions": { "title": "İzinleri Değiştir", "desc": "PDF belgenizin izinlerini değiştirin" @@ -375,38 +794,10 @@ "title": "Kaldır", "desc": "PDF belgenizden istenmeyen sayfaları silin." }, - "addPassword": { - "title": "Parola Ekle", - "desc": "PDF belgenizi bir parola ile şifreleyin." - }, - "removePassword": { - "title": "Parolayı Kaldır", - "desc": "PDF belgenizden parola korumasını kaldırın." - }, - "compress": { - "title": "Sıkıştır", - "desc": "PDF'lerin dosya boyutunu azaltmak için sıkıştırın." - }, - "unlockPDFForms": { - "title": "PDF Formlarının Kilidini Kaldır", - "desc": "Form alanlarını düzenlenebilir hâle getir." - }, - "changeMetadata": { - "title": "Metaveriyi Değiştir", - "desc": "Bir PDF belgesinden metaveriyi değiştir/kaldır/ekle" - }, "fileToPDF": { "title": "Dosyayı PDF'e Dönüştür", "desc": "Hemen hemen her dosyayı PDF'e dönüştürün (DOCX, PNG, XLS, PPT, TXT ve daha fazlası)" }, - "ocr": { - "title": "OCR / Taramaları Temizle", - "desc": "Taramaları temizler ve bir PDF içindeki resimlerden metni algılar ve tekrar metin olarak ekler." - }, - "extractImages": { - "title": "Resimleri Çıkar", - "desc": "Bir PDF'ten tüm resimleri çıkarır ve bunları zip olarak kaydeder." - }, "pdfToPDFA": { "title": "PDF'den PDF/A'ya", "desc": "PDF'yi uzun vadeli saklama için PDF/A'ya dönüştürün" @@ -435,70 +826,14 @@ "title": "Taranmış Fotoğrafları Tespit Et/Böl", "desc": "Bir fotoğraf/PDF içerisindeki birden fazla fotoğrafı ayırır" }, - "sign": { - "title": "İmzala", - "desc": "Çizim, metin veya resim ile PDF'e imza ekler" - }, - "flatten": { - "title": "Düzleştir", - "desc": "PDF'ten tüm etkileşimli öğeleri ve formları kaldırır" - }, - "repair": { - "title": "Onar", - "desc": "Bozuk/kırık bir PDF'i onarmaya çalışır" - }, - "removeBlanks": { - "title": "Boş Sayfaları Kaldır", - "desc": "Bir belgeden boş sayfaları tespit eder ve kaldırır" - }, - "removeAnnotations": { - "title": "Ek Açıklamaları Kaldır", - "desc": "PDF'deki tüm yorumları/açıklamaları kaldırır" - }, - "compare": { - "title": "Karşılaştır", - "desc": "2 PDF Belgesi arasındaki farkları karşılaştırır ve gösterir" - }, - "certSign": { - "title": "Sertifika ile İmzala", - "desc": "Bir PDF'i Sertifika/Anahtar (PEM/P12) ile imzalar" - }, - "removeCertSign": { - "title": "Sertifika İmzasını Kaldır", - "desc": "PDF'ten sertifika imzasını kaldırır" - }, - "pageLayout": { - "title": "Çoklu-Sayfa Düzeni", - "desc": "Bir PDF belgesinin çoklu sayfalarını tek bir sayfada birleştirir" - }, - "scalePages": { - "title": "Sayfa boyutunu/ölçeğini ayarla", - "desc": "Bir sayfanın ve/veya içeriğinin boyutunu/ölçeğini değiştirir" - }, "pipeline": { "title": "Çoklu İşlemler", "desc": "Çoklu İşlemler tanımlayarak PDF'lere birden fazla işlemi çalıştır" }, - "addPageNumbers": { - "title": "Sayfa Numaraları Ekle", - "desc": "Bir belgeye belirli bir konuma sayfa numaraları ekler" - }, "auto-rename": { "title": "PDF Dosyasını Otomatik Yeniden Adlandır", "desc": "Tespit edilen başlığa dayanarak bir PDF dosyasını otomatik olarak yeniden adlandırır" }, - "adjustContrast": { - "title": "Renkleri/Kontrastı Ayarla", - "desc": "Bir PDF'in Kontrastını, Doygunluğunu ve Parlaklığını ayarlar" - }, - "crop": { - "title": "PDF'i Kırp", - "desc": "Boyutunu azaltmak için bir PDF'i kırpar (metni korur!)" - }, - "autoSplitPDF": { - "title": "Sayfaları Otomatik Böl", - "desc": "Fiziksel taranmış sayfa bölücü QR Kod ile Taranmış PDF'i Otomatik Böl" - }, "sanitizePDF": { "title": "Temizle", "desc": "PDF dosyalarından betikleri ve diğer öğeleri kaldırır" @@ -519,30 +854,14 @@ "title": "PDF'den Markdown'a", "desc": "Herhangi bir PDF'yi Markdown formatına dönüştürür" }, - "getPdfInfo": { - "title": "PDF Hakkında TÜM Bilgiyi Al", - "desc": "PDF'ler hakkında mümkün olan her türlü bilgiyi toplar" - }, "pageExtracter": { "title": "Sayfa(ları) Çıkar", "desc": "PDF'ten seçili sayfaları çıkarır" }, - "pdfToSinglePage": { - "title": "PDF'i Tek Büyük Sayfaya", - "desc": "Tüm PDF sayfalarını tek büyük bir sayfada birleştirir" - }, - "showJS": { - "title": "Javascript'i Göster", - "desc": "Bir PDF'e enjekte edilen herhangi bir JS'i araştırır ve gösterir" - }, "autoRedact": { "title": "Otomatik Karartma", "desc": "Giriş metnine dayanarak bir PDF'teki metni Otomatik Karartır (Redakte)" }, - "redact": { - "title": "Manuel Sansürleme", - "desc": "Seçilen metinler, çizilen şekiller ve/veya belirli sayfalar üzerinden PDF'yi sansürler" - }, "PDFToCSV": { "title": "PDF'den CSV'ye", "desc": "PDF'den Tabloları çıkarır ve CSV'ye dönüştürür" @@ -551,10 +870,6 @@ "title": "Boyut/Sayıya Göre Otomatik Bölme", "desc": "Tek bir PDF'yi boyut, sayfa sayısı veya belge sayısına göre birden fazla belgeye bölün" }, - "overlay-pdfs": { - "title": "PDF'leri Bindirme", - "desc": "PDF'leri başka bir PDF'nin üzerine bindirir" - }, "split-by-sections": { "title": "PDF'yi Bölümlere Ayırma", "desc": "PDF'nin her sayfasını daha küçük yatay ve dikey bölümlere ayırın" @@ -563,47 +878,17 @@ "title": "PDF'ye Damga Ekleme", "desc": "Belirlenen konumlara metin veya resim damgaları ekleyin" }, - "removeImage": { - "title": "Resmi kaldır", - "desc": "Dosya boyutunu küçültmek için PDF'den resmi kaldırın" - }, - "splitByChapters": { - "title": "PDF'yi Bölümlere Göre Böl", - "desc": "PDF'yi bölüm yapısına göre birden fazla dosyaya ayırın." - }, - "validateSignature": { - "title": "PDF İmzasını Doğrula", - "desc": "PDF belgelerindeki dijital imzaları ve sertifikaları doğrulayın" - }, "replace-color": { "title": "Renkleri Değiştir ve Tersine Çevir", "desc": "PDF'deki metin ve arka plan renklerini değiştirin ve PDF'nin tüm renklerini tersine çevirerek dosya boyutunu azaltın" }, - "convert": { - "title": "Dönüştür" - }, "attachments": { "title": "Add attachments" }, - "editTableOfContents": { - "title": "İçindekiler Tablosunu Düzenle", - "desc": "PDF belgelerinde yer işaretleri ve içindekiler tablosu ekleyin veya düzenleyin" - }, - "extractPages": { - "title": "Sayfaları Çıkar" - }, - "removePages": { - "title": "Kaldır", - "desc": "PDF belgenizden istenmeyen sayfaları silin." - }, "removeImagePdf": { "title": "Resmi kaldır", "desc": "Dosya boyutunu küçültmek için PDF'den resmi kaldırın" }, - "autoSizeSplitPDF": { - "title": "Boyut/Sayıya Göre Otomatik Bölme", - "desc": "Tek bir PDF'yi boyut, sayfa sayısı veya belge sayısına göre birden fazla belgeye bölün" - }, "adjust-contrast": { "title": "Renkleri/Kontrastı Ayarla", "desc": "Bir PDF'in Kontrastını, Doygunluğunu ve Parlaklığını ayarlar" @@ -611,11 +896,12 @@ "replaceColorPdf": { "title": "Renkleri Değiştir ve Tersine Çevir", "desc": "PDF'deki metin ve arka plan renklerini değiştirin ve PDF'nin tüm renklerini tersine çevirerek dosya boyutunu azaltın" - }, - "changePermissions": { - "title": "İzinleri Değiştir" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "görüntüle,oku,açıklama ekle,metin,görüntü", "title": "PDF Görüntüle/Düzenle", @@ -649,17 +935,39 @@ "merge": { "tags": "birleştir,Sayfa işlemleri,Arka uç,sunucu tarafı", "title": "Birleştir", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Birleştir", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Dosya Adı", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Çoklu PDF'leri Birleştir (2+)", "sortByName": "İsme göre sırala", "sortByDate": "Tarihe göre sırala", - "removeCertSign": "Birleştirilen dosyadaki dijital imza kaldırılsın mı?", - "submit": "Birleştir", - "sortBy": { - "filename": "Dosya Adı" - } + "removeCertSign": "Birleştirilen dosyadaki dijital imza kaldırılsın mı?" }, "split": { - "tags": "Sayfa işlemleri,böl,Çoklu Sayfa,kes,sunucu tarafı", "title": "PDF Ayır", "header": "PDF Ayır", "desc": { @@ -675,25 +983,249 @@ "splitPages": "Ayrılacak sayfaları girin:", "submit": "Ayır", "steps": { + "chooseMethod": "Choose Method", "settings": "Ayarlar" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Dosya Boyutu" + "name": "Dosya Boyutu", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Dosya Boyutu" + "label": "Dosya Boyutu", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Sayfa işlemleri,böl,Çoklu Sayfa,kes,sunucu tarafı" }, "rotate": { - "tags": "sunucu tarafı", "title": "PDF Döndür", + "submit": "Döndür", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "sunucu tarafı", "header": "PDF Döndür", - "selectAngle": "Döndürme açısını seçin (90 derecenin katları olarak):", - "submit": "Döndür" + "selectAngle": "Döndürme açısını seçin (90 derecenin katları olarak):" + }, + "convert": { + "title": "Dönüştür", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Ayarlar", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Renk", + "greyscale": "Gri tonlama", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Sayfayı Doldur", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF dijital imza içeriyor. Bu bir sonraki adımda kaldırılacak.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Gri tonlama", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "dönüşüm,img,jpg,fotoğraf,resim" @@ -731,7 +1263,33 @@ "8": "Sonuncuyu Kaldır", "9": "İlk ve Sonu Kaldır", "10": "Tek-Çift Birleştirme", - "11": "Tüm sayfaları çoğalt" + "11": "Tüm sayfaları çoğalt", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(örn. 1,3,2 veya 4-8,2,10-12 veya 2n-1)" }, @@ -743,9 +1301,198 @@ "upload": "Resim ekle", "submit": "Resim ekle" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Metin,tekrarlayan,etiket,kendi,telif hakkı,marka,img,jpg,fotoğraf,resim", "title": "Filigran Ekle", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Filigran Ekle", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Metin", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Font Büyüklüğü", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Metin", + "2": "Resim" + }, + "tags": "Metin,tekrarlayan,etiket,kendi,telif hakkı,marka,img,jpg,fotoğraf,resim", "header": "Filigran Ekle", "customColor": "Özel Metin Rengi", "selectText": { @@ -759,17 +1506,6 @@ "8": "Filigran Türü:", "9": "Filigran Resmi:", "10": "PDF'yi PDF-Resim'e Dönüştür" - }, - "submit": "Filigran Ekle", - "type": { - "1": "Metin", - "2": "Resim" - }, - "watermarkType": { - "text": "Metin" - }, - "settings": { - "fontSize": "Font Büyüklüğü" } }, "permissions": { @@ -794,50 +1530,201 @@ "removePages": { "tags": "Sayfaları kaldır,sayfaları sil", "title": "Kaldır", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Kaldır" }, - "addPassword": { - "tags": "güvenli, güvenlik", - "title": "Parola Ekle", - "header": "Parola Ekle (Şifrele)", - "selectText": { - "1": "Şifrelenecek PDF'i seçin", - "2": "Kullanıcı Parolası", - "3": "Şifreleme Anahtar Uzunluğu", - "4": "Daha yüksek değerler daha güçlüdür, ancak daha düşük değerler daha iyi uyumluluğa sahiptir.", - "5": "İzinlerin ayarlanması (Sahip parolası ile birlikte kullanılması önerilir)", - "6": "Belgenin birleştirilmesini önle", - "7": "İçeriğin çıkarılmasını önle", - "8": "Erişilebilirlik için çıkarmanın önlenmesi", - "9": "Formun doldurulmasını önle", - "10": "Değişikliği önle", - "11": "Açıklama değişikliğini önle", - "12": "Yazdırmayı önle", - "13": "Farklı formatlarda yazdırmayı önle", - "14": "Sahip Parolası", - "15": "Açıldığında belgeyle ne yapılacağını kısıtlar (Tüm okuyucular tarafından desteklenmez)", - "16": "Belgenin kendisinin açılmasını kısıtlar" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Şifrele", "tooltip": { - "permissions": { - "title": "İzinleri Değiştir" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "güvenli,Şifreyi çöz,güvenlik,parolasız,parolayı sil", - "title": "Parola Kaldır", - "header": "Parola Kaldır (Şifre Çöz)", - "selectText": { - "1": "Şifreyi Çözmek için PDF Seçin", - "2": "Parola" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Kaldır", - "desc": "PDF belgenizden parola korumasını kaldırın.", - "password": { - "stepTitle": "Parolayı Kaldır", - "label": "Mevcut Şifre" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -847,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Form Alanlarının Salt Okunur Özelliğini Kaldır", "header": "PDF Formlarının Kilidini Aç", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Başlık,yazar,tarih,oluşturma,zaman,yayıncı,üretici,istatistikler", - "title": "Başlık:", "header": "Metaveriyi Değiştir", + "submit": "Değiştir", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Başlık,yazar,tarih,oluşturma,zaman,yayıncı,üretici,istatistikler", "selectText": { "1": "Değiştirmek istediğiniz değişkenleri düzenleyin", "2": "Tüm metaveriyi sil", @@ -860,15 +1877,7 @@ "4": "Diğer Metaveri:", "5": "Özel Metaveri Girişi Ekle" }, - "author": "Yazar:", - "creationDate": "Oluşturma Tarihi (yyyy/MM/dd HH:mm:ss):", - "creator": "Oluşturan:", - "keywords": "Anahtar Kelimeler:", - "modDate": "Değişiklik Tarihi (yyyy/MM/dd HH:mm:ss):", - "producer": "Üretici:", - "subject": "Konu:", - "trapped": "Tuzak:", - "submit": "Değiştir" + "modDate": "Değişiklik Tarihi (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "dönüşüm,format,belge,fotoğraf,slayt,metin,dönüşüm,ofis,doküman,word,excel,powerpoint", @@ -882,6 +1891,7 @@ "ocr": { "tags": "tanıma,metin,resim,tarama,okuma,tanımlama,algılama,düzenlenebilir", "title": "OCR / Tarama Temizleme", + "desc": "Taramaları temizler ve bir PDF içindeki resimlerden metni algılar ve tekrar metin olarak ekler.", "header": "Taramaları Temizle / OCR (Optik Karakter Tanıma)", "selectText": { "1": "PDF içinde tespit edilecek dilleri seçin (Listelenenler şu anda tespit edilenlerdir):", @@ -900,23 +1910,89 @@ "help": "Lütfen bu belgede başka dillerde nasıl kullanılacağı ve/veya docker'da kullanılmaması hakkında bilgi edinin", "credit": "Bu hizmet OCR için qpdf ve Tesseract'ı kullanır.", "submit": "PDF'i OCR(Metin Tanıma) ile İşle", - "desc": "Taramaları temizler ve bir PDF içindeki resimlerden metni algılar ve tekrar metin olarak ekler.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Ayarlar", "ocrMode": { - "label": "OCR Modu" + "label": "OCR Modu", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Diller" + "label": "Diller", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR Modu" + "title": "OCR Modu", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Diller" + "title": "Diller", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -925,7 +2001,13 @@ "header": "Resimleri Çıkar", "selectText": "Çıkarılan resimleri dönüştürmek için resim formatını seçin", "allowDuplicates": "Yinelenen görselleri kaydet", - "submit": "Çıkar" + "submit": "Çıkar", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arşiv,uzun vadeli,standart,dönüşüm,saklama,koruma", @@ -997,17 +2079,53 @@ }, "info": "Python kurulu değil. Çalışması için gereklidir." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "onayla,başharfler,çizili-imza,metin-imza,resim-imza", "title": "İmzala", "header": "PDF'lere İmza At", "upload": "Resim Yükle", - "draw": "İmza Çiz", - "text": "Metin Girişi", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Temizle", "add": "Ekle", "saved": "Kaydedilmiş İmzalar", "save": "İmzayı Kaydet", + "applySignatures": "Apply Signatures", "personalSigs": "Kişisel İmzalar", "sharedSigs": "Paylaşılan İmzalar", "noSavedSigs": "Kayıtlı imza bulunamadı", @@ -1019,42 +2137,179 @@ "previous": "Önceki sayfa", "maintainRatio": "Oranı korumayı değiştir", "undo": "Geri Al", - "redo": "Yinele" + "redo": "Yinele", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "onayla,başharfler,çizili-imza,metin-imza,resim-imza" }, "flatten": { - "tags": "statik,devre dışı bırak,etkileşimsiz,sadeleştir", "title": "Düzleştir", "header": "PDF'leri Düzleştir", "flattenOnlyForms": "Yalnızca formları düzleştir", "submit": "Düzleştir", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Ayarlar" }, "options": { - "flattenOnlyForms": "Yalnızca formları düzleştir" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Yalnızca formları düzleştir", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statik,devre dışı bırak,etkileşimsiz,sadeleştir" }, "repair": { "tags": "onar,geri yükle,düzelt,geri getir", "title": "Onar", "header": "PDF'leri Onar", - "submit": "Onar" + "submit": "Onar", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "temizle,sadeleştir,içeriksiz,düzenle", "title": "Boşları Kaldır", "header": "Boş Sayfaları Kaldır", - "threshold": "Pixel Beyazlık Eşiği:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Boşları Kaldır", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "temizle,sadeleştir,içeriksiz,düzenle", "thresholdDesc": "Bir beyaz pixelin 'Beyaz' olarak sınıflandırılması için ne kadar beyaz olması gerektiğini belirlemek için eşik. 0 = Siyah, 255 saf beyaz.", - "whitePercent": "Beyaz Yüzde (%):", - "whitePercentDesc": "Bir sayfanın 'beyaz' pixel olması gereken yüzdesi", - "submit": "Boşları Kaldır" + "whitePercentDesc": "Bir sayfanın 'beyaz' pixel olması gereken yüzdesi" }, "removeAnnotations": { "tags": "yorumlar,vurgulama,notlar,işaretleme,kaldırma", "title": "Ek Açıklamaları Kaldır", "header": "Ek Açıklamaları Kaldır", - "submit": "Kaldır" + "submit": "Kaldır", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "farklılaştır,karşılaştır,değişiklikler,analiz", @@ -1086,6 +2341,142 @@ "certSign": { "tags": "doğrula,PEM,P12,resmi,şifrele", "title": "Sertifika İmzalama", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Konum", + "logoTitle": "Logo", + "name": "İsim", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Anahtar Deposu veya Özel Anahtar Şifrenizi Girin (Varsa):", + "passwordOptional": "Leave empty if no password", + "reason": "Neden", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo", "header": "Sertifikanızla bir PDF imzalayın (Devam eden iş)", "selectPDF": "İmzalamak için bir PDF Dosyası seçin:", "jksNote": "Not: Sertifika türünüz aşağıda listelenmemişse, lütfen keytool komut satırı aracını kullanarak sertifikanızı bir Java Keystore (.jks) dosyasına dönüştürün. Ardından, aşağıdaki .jks dosyası seçeneğini seçin.", @@ -1093,13 +2484,7 @@ "selectCert": "Sertifika Dosyanızı Seçin (X.509 formatında, .pem veya .der olabilir):", "selectP12": "PKCS#12 Anahtar Deposu Dosyanızı Seçin (.p12 veya .pfx) (İsteğe bağlı, sağlanırsa, özel anahtarınızı ve sertifikanızı içermelidir):", "selectJKS": "Java Keystore Dosyanızı (.jks veya .keystore) seçin:", - "certType": "Sertifika Türü", - "password": "Anahtar Deposu veya Özel Anahtar Şifrenizi Girin (Varsa):", "showSig": "İmzayı Göster", - "reason": "Neden", - "location": "Konum", - "name": "İsim", - "showLogo": "Show Logo", "submit": "PDF'i İmzala" }, "removeCertSign": { @@ -1107,7 +2492,18 @@ "title": "Sertifika İmzasını Kaldır", "header": "PDF'ten dijital sertifikayı kaldırın", "selectPDF": "PDF dosyası seçin:", - "submit": "İmzayı Kaldır" + "submit": "İmzayı Kaldır", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "birleştir,kompozit,tek-görünüm,düzenle", @@ -1115,16 +2511,157 @@ "header": "Çoklu Sayfa Düzeni", "pagesPerSheet": "Sayfa başına sayfalar:", "addBorder": "Kenarlık Ekle", - "submit": "Gönder" + "submit": "Gönder", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "boyutlandır,değiştir,boyut,uyarla", "title": "Sayfa Ölçeğini Ayarla", "header": "Sayfa Ölçeğini Ayarla", "pageSize": "Belgenin bir sayfa boyutu.", "keepPageSize": "Original Size", "scaleFactor": "Bir sayfanın yakınlaştırma seviyesi (kırpma).", - "submit": "Gönder" + "submit": "Gönder", + "tags": "boyutlandır,değiştir,boyut,uyarla" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "sayfalandır,etiket,düzenle,dizin" @@ -1133,16 +2670,83 @@ "tags": "otomatik-tespit,başlık-tabanlı,düzenle,yeniden-etiketle", "title": "Otomatik Yeniden Adlandır", "header": "PDF'i Otomatik Yeniden Adlandır", - "submit": "Otomatik Yeniden Adlandır" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Otomatik Yeniden Adlandır", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "renk-düzeltme,ayarla,değiştir,artır" }, "crop": { - "tags": "kırp,küçült,düzenle,şekillendir", "title": "Kırp", "header": "PDF'i Kırp", - "submit": "Gönder" + "submit": "Gönder", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "kırp,küçült,düzenle,şekillendir" }, "autoSplitPDF": { "tags": "QR-tabanlı,ayır,tarama-segmenti,düzenle", @@ -1225,24 +2829,124 @@ "downloadJS": "Javascript İndir", "submit": "Göster" }, - "autoRedact": { - "tags": "Karart,Gizle,karartma,siyah,markör,gizli", - "title": "Otomatik Karartma", - "header": "Otomatik Karartma", - "colorLabel": "Renk", - "textsToRedactLabel": "Karartılacak Metin (satır ayrılmış)", - "textsToRedactPlaceholder": "Örn. \\nGizli \\nÇok Gizli", - "useRegexLabel": "Regex Kullan", - "wholeWordSearchLabel": "Tam Kelime Arama", - "customPaddingLabel": "Özel Ekstra Dolgu", - "convertPDFToImageLabel": "PDF'i PDF-Görüntü'ye dönüştür (Kutunun arkasındaki metni kaldırmak için kullanılır)", - "submitButton": "Gönder" - }, "redact": { "tags": "Sansürle,Gizle,karart,karartma,işaretleyici,gizli,manuel", "title": "Manuel Sansürleme", - "header": "Manuel Sansürleme", "submit": "Sansürle", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Gelişmiş" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Ekle", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Sayfalar", + "placeholder": "(örneğin 1,2,8 veya 4,7,12-16 ya da 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Dışa Aktar", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manuel Sansürleme", "textBasedRedaction": "Metin Tabanlı Sansürleme", "pageBasedRedaction": "Sayfa Tabanlı Sansürleme", "convertPDFToImageLabel": "PDF'yi Görsel PDF'ye Dönüştür (Kutunun arkasındaki metni kaldırmak için kullanılır)", @@ -1268,22 +2972,7 @@ "showLayers": "Katmanları Göster (tüm katmanları varsayılana döndürmek için çift tıklayın)", "colourPicker": "Renk Seçici", "findCurrentOutlineItem": "Geçerli Anahat Öğesini Bul", - "applyChanges": "Değişiklikleri Uygula", - "auto": { - "settings": { - "advancedTitle": "Gelişmiş" - }, - "wordsToRedact": { - "add": "Ekle" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Sayfalar", - "placeholder": "(örneğin 1,2,8 veya 4,7,12-16 ya da 2n-1)" - }, - "export": "Dışa Aktar" - } + "applyChanges": "Değişiklikleri Uygula" }, "tableExtraxt": { "tags": "CSV, Tablo Çıkarma, ayıklama, dönüştürme" @@ -1294,11 +2983,15 @@ "overlay-pdfs": { "tags": "Bindirme", "header": "PDF Dosyalarını Bindirme", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Temel PDF Dosyasını Seçin" }, "overlayFiles": { - "label": "İkinci PDF Dosyalarını Seçin" + "label": "İkinci PDF Dosyalarını Seçin", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Bindirme Modunu Seçin", @@ -1308,14 +3001,53 @@ }, "counts": { "label": "Bindirme Sayıları (Sabit Tekrar Modu için)", - "placeholder": "Virgülle ayrılmış sayıları girin (örn. 2,3,1)" + "placeholder": "Virgülle ayrılmış sayıları girin (örn. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Bindirme Konumunu Seçin", "foreground": "Ön plan", "background": "Arka plan" }, - "submit": "Gönder" + "submit": "Gönder", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Bölümlere Ayırma, Bölme, Özelleştirme", @@ -1336,6 +3068,7 @@ "tags": "Damga, Görüntü ekle, Görüntüyü ortala, Filigran, PDF, Göm, Özelleştir", "header": "Damga PDF", "title": "Damga PDF", + "stampSetup": "Stamp Setup", "stampType": "Damga Türü", "stampText": "Damga Metni", "stampImage": "Damga Resmi", @@ -1348,7 +3081,19 @@ "overrideY": "Y Koordinatını Geçersiz Kıl", "customMargin": "Özel Kenar Boşluğu", "customColor": "Özel Metin Rengi", - "submit": "Gönder" + "submit": "Gönder", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Resmi Kaldır,Sayfa İşlemleri,Arka uç,sunucu tarafı" @@ -1366,7 +3111,8 @@ "status": { "_value": "Durum", "valid": "Geçerli", - "invalid": "Geçersiz" + "invalid": "Geçersiz", + "complete": "Validation complete" }, "signer": "İmzalayan", "date": "Tarih", @@ -1393,40 +3139,122 @@ "version": "Sürüm", "keyUsage": "Anahtar Kullanımı", "selfSigned": "Kendi Kendine İmzalı", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "İmza Bilgisi", "_value": "İmza", "mathValid": "İmza matematiksel olarak geçerli, ANCAK:" }, - "selectCustomCert": "Özel Sertifika Dosyası X.509 (İsteğe Bağlı)" - }, - "replace-color": { - "title": "Renk Değiştir-Tersine Çevir", - "header": "PDF Renklerini Değiştir veya Tersine Çevir", - "selectText": { - "1": "Renk Değiştir veya Tersine Çevirme Seçenekleri", - "2": "Varsayılan (Yüksek kontrastlı varsayılan renkler)", - "3": "Özel (Kişiselleştirilmiş renkler)", - "4": "Tümü Tersine Çevir (Tüm renkleri tersine çevir)", - "5": "Yüksek kontrastlı renk seçenekleri", - "6": "Siyah arka plan üzerine beyaz metin", - "7": "Beyaz arka plan üzerine siyah metin", - "8": "Siyah arka plan üzerine sarı metin", - "9": "Siyah arka plan üzerine yeşil metin", - "10": "Metin Rengini Seç", - "11": "Arka Plan Rengini Seç" + "selectCustomCert": "Özel Sertifika Dosyası X.509 (İsteğe Bağlı)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Değiştir" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Renk Değiştir, Sayfa işlemleri, Arka yüz, Sunucu tarafı" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Giriş Yap", "header": "Giriş Yap", "signin": "Giriş Yap", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Beni hatırla", "invalid": "Geçersiz kullanıcı adı veya şifre.", "locked": "Hesabınız kilitlendi.", @@ -1445,12 +3273,83 @@ "alreadyLoggedIn": "Zaten şu cihazlarda oturum açılmış:", "alreadyLoggedIn2": "Lütfen bu cihazlardan çıkış yaparak tekrar deneyin.", "toManySessions": "Çok fazla aktif oturumunuz var", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF'i Tek Sayfaya", "header": "PDF'i Tek Sayfaya", - "submit": "Tek Sayfaya Dönüştür" + "submit": "Tek Sayfaya Dönüştür", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Sayfaları Çıkar", @@ -1474,18 +3373,59 @@ "adjustContrast": { "title": "Kontrastı Ayarla", "header": "Kontrastı Ayarla", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Parlaklık:", "saturation": "Doygunluk:", - "download": "İndir" + "download": "İndir", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Sıkıştır", + "desc": "Compress PDFs to reduce their file size.", "header": "PDF'i Sıkıştır", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Dosya Boyutu" + }, "credit": "Bu hizmet PDF Sıkıştırma/Optimizasyonu için qpdf kullanır.", "grayscale": { "label": "Sıkıştırma için Gri Ton Uygula" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1495,10 +3435,7 @@ "4": "Otomatik mod - PDF'in tam boyutuna ulaşmak için kaliteyi otomatik ayarlar", "5": "Beklenen PDF Boyutu (örn. 25MB, 10.8MB, 25KB)" }, - "submit": "Sıkıştır", - "method": { - "filesize": "Dosya Boyutu" - } + "submit": "Sıkıştır" }, "decrypt": { "passwordPrompt": "Bu dosya parola korumalı. Lütfen parolayı girin:", @@ -1599,7 +3536,13 @@ "title": "Resmi kaldır", "header": "Resmi kaldır", "removeImage": "Resmi kaldır", - "submit": "Resmi kaldır" + "submit": "Resmi kaldır", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "PDF'yi Bölümlere Ayır", @@ -1633,6 +3576,12 @@ }, "note": "Sürüm notları yalnızca İngilizce dilinde mevcuttur" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "Çerezleri Nasıl Kullanıyoruz", @@ -1668,54 +3617,943 @@ "title": "Analitik", "description": "Bu çerezler, araçlarımızın nasıl kullanıldığını anlamamıza yardımcı olur, böylece topluluğumuzun en çok değer verdiği özellikleri geliştirmeye odaklanabiliriz. İçiniz rahat olsun — Stirling PDF, belgelerinizin içeriğini asla takip etmez ve etmeyecektir." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "İndir", - "undo": "Geri Al", - "convert": { - "title": "Dönüştür", - "settings": "Ayarlar", - "color": "Renk", - "greyscale": "Gri tonlama", - "fillPage": "Sayfayı Doldur", - "pdfaDigitalSignatureWarning": "PDF dijital imza içeriyor. Bu bir sonraki adımda kaldırılacak.", - "grayscale": "Gri tonlama" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Tümünü Seç", - "deselectAll": "Seçimi Kaldır" + "deselectAll": "Seçimi Kaldır", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "İmzala" + "read": "Read", + "sign": "İmzala", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Yükleniyor...", - "or": "veya" + "or": "veya", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "İsim", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Sürüm", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Tümünü Seç", "deselectAll": "Seçimi Kaldır", "deleteSelected": "Seçilenleri Sil", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "İndir", - "delete": "Sil" + "delete": "Sil", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDF'i Temizle", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Ayarlar" + "files": "Files", + "settings": "Ayarlar", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Parola Ekle", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Şifrele", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "İzinleri Değiştir", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "güvenli, güvenlik", + "header": "Parola Ekle (Şifrele)", + "selectText": { + "1": "Şifrelenecek PDF'i seçin", + "2": "Kullanıcı Parolası", + "3": "Şifreleme Anahtar Uzunluğu", + "4": "Daha yüksek değerler daha güçlüdür, ancak daha düşük değerler daha iyi uyumluluğa sahiptir.", + "5": "İzinlerin ayarlanması (Sahip parolası ile birlikte kullanılması önerilir)", + "6": "Belgenin birleştirilmesini önle", + "7": "İçeriğin çıkarılmasını önle", + "8": "Erişilebilirlik için çıkarmanın önlenmesi", + "9": "Formun doldurulmasını önle", + "10": "Değişikliği önle", + "11": "Açıklama değişikliğini önle", + "12": "Yazdırmayı önle", + "13": "Farklı formatlarda yazdırmayı önle", + "14": "Sahip Parolası", + "15": "Açıldığında belgeyle ne yapılacağını kısıtlar (Tüm okuyucular tarafından desteklenmez)", + "16": "Belgenin kendisinin açılmasını kısıtlar" } }, "changePermissions": { "title": "İzinleri Değiştir", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "İzinleri Değiştir", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Belgenin birleştirilmesini önle" @@ -1742,10 +4580,784 @@ "label": "Farklı formatlarda yazdırmayı önle" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "İzinleri Değiştir" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Parola Kaldır", + "desc": "PDF belgenizden parola korumasını kaldırın.", + "tags": "güvenli,Şifreyi çöz,güvenlik,parolasız,parolayı sil", + "password": { + "stepTitle": "Parolayı Kaldır", + "label": "Mevcut Şifre", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Kaldır", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Parola Kaldır (Şifre Çöz)", + "selectText": { + "1": "Şifreyi Çözmek için PDF Seçin", + "2": "Parola" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Renk Değiştir veya Tersine Çevirme Seçenekleri", + "2": "Varsayılan (Yüksek kontrastlı varsayılan renkler)", + "3": "Özel (Kişiselleştirilmiş renkler)", + "4": "Tümü Tersine Çevir (Tüm renkleri tersine çevir)", + "5": "Yüksek kontrastlı renk seçenekleri", + "6": "Siyah arka plan üzerine beyaz metin", + "7": "Beyaz arka plan üzerine siyah metin", + "8": "Siyah arka plan üzerine sarı metin", + "9": "Siyah arka plan üzerine yeşil metin", + "10": "Metin Rengini Seç", + "11": "Arka Plan Rengini Seç", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Değiştir", + "title": "Renk Değiştir-Tersine Çevir", + "header": "PDF Renklerini Değiştir veya Tersine Çevir" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Karart,Gizle,karartma,siyah,markör,gizli", + "title": "Otomatik Karartma", + "header": "Otomatik Karartma", + "colorLabel": "Renk", + "textsToRedactLabel": "Karartılacak Metin (satır ayrılmış)", + "textsToRedactPlaceholder": "Örn. \\nGizli \\nÇok Gizli", + "useRegexLabel": "Regex Kullan", + "wholeWordSearchLabel": "Tam Kelime Arama", + "customPaddingLabel": "Özel Ekstra Dolgu", + "convertPDFToImageLabel": "PDF'i PDF-Görüntü'ye dönüştür (Kutunun arkasındaki metni kaldırmak için kullanılır)", + "submitButton": "Gönder" + }, + "replaceColorPdf": { + "tags": "Renk Değiştir, Sayfa işlemleri, Arka yüz, Sunucu tarafı" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/uk-UA/translation.json b/frontend/public/locales/uk-UA/translation.json index 47c7f408d..043c82914 100644 --- a/frontend/public/locales/uk-UA/translation.json +++ b/frontend/public/locales/uk-UA/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Користувацький текст", "numberPagesDesc": "Які сторінки нумерувати, за замовчуванням 'всі', також приймає 1-5 або 2,5,9 тощо.", "customNumberDesc": "За замовчуванням {n}, також можна використовувати 'Сторінка {n} з {total}', 'Текст-{n}', '{filename}-{n}'", - "submit": "Додати номери сторінок" + "submit": "Додати номери сторінок", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Користувацький вибір сторінки (введіть список номерів сторінок через кому 1,5,6 або функції типу 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Оберіть PDF(и)", "multiPdfPrompt": "Оберіть PDFи (2+)", "multiPdfDropPrompt": "Оберіть (або перетягніть) всі необхідні PDFи", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Увага: Цей процес може тривати до хвилини в залежності від розміру файлу.", "pageOrderPrompt": "Порядок сторінок (введіть список номерів сторінок через кому):", - "pageSelectionPrompt": "Користувацький вибір сторінки (введіть список номерів сторінок через кому 1,5,6 або функції типу 2n+1) :", "goToPage": "Вперед", "true": "Правда", "false": "Брехня", "unknown": "Невідомо", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Зберегти", "saveToBrowser": "Зберегти в браузері", + "download": "Завантажити", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Скасувати", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Закрити", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "файлів обрано", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Немає вибраного", "downloadComplete": "Завантаження завершено", "bored": "Нудно чекати?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "Документ PDF захищено паролем, і пароль не був наданий або був невірним", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Помилка", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Вибачте за незручності!", "needHelp": "Потрібна допомога / Знайшли проблему?", "contactTip": "Якщо у вас досі виникають проблеми, не соромтеся звертатися до нас за допомогою. Ви можете надіслати запит на нашій сторінці GitHub або зв'язатися з нами через Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Надіслати запит", "discordSubmit": "Discord - Надіслати повідомлення підтримки" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Видалити", "username": "Ім'я користувача", "password": "Пароль", @@ -82,6 +169,7 @@ "green": "Зелений", "blue": "Синій", "custom": "Звичай...", + "comingSoon": "Coming soon", "WorkInProgess": "Робота триває, може не працювати або глючити, будь ласка, повідомляйте про будь-які проблеми!", "poweredBy": "Працює на", "yes": "Так", @@ -115,12 +203,14 @@ "page": "Сторінка", "pages": "Сторінки", "loading": "Завантаження...", + "review": "Review", "addToDoc": "Додати до документу", "reset": "Скинути", "apply": "Застосувати", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Політика конфіденційності", + "iAgreeToThe": "I agree to all of the", "terms": "Правила та умови", "accessibility": "Доступність", "cookie": "Політика використання файлів cookie", @@ -160,6 +250,7 @@ "title": "Бажаєте покращити Stirling PDF?", "paragraph1": "Stirling PDF увімкнув аналітику, щоб допомогти нам покращити продукт. Ми не відстежуємо жодну особисту інформацію чи вміст файлів.", "paragraph2": "Увімкніть аналітику, щоб допомогти Stirling-PDF розвиватися та дозволити нам краще розуміти наших користувачів.", + "learnMore": "Learn more", "enable": "Увімкнути аналітику", "disable": "Вимкнути аналітику", "settings": "Ви можете змінити параметри аналітики у файлі config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Зберігати дані форм", "help": "Увімкнути для збереження раніше використаних вхідних даних для майбутніх прогонів" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Топ 20", "all": "Всі", "refresh": "Оновити", - "includeHomepage": "Включити головну сторінку ('/')", - "includeLoginPage": "Включити сторінку входу ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Всього кінцевих точок", "totalVisits": "Всього відвідувань", "showing": "Показано", @@ -290,7 +431,9 @@ "top": "Топ", "numberOfVisits": "Кількість відвідувань", "visitsTooltip": "Відвідування: {0} ({1}% від загальної кількості)", - "retry": "Повторити" + "retry": "Повторити", + "includeHomepage": "Включити головну сторінку ('/')", + "includeLoginPage": "Включити сторінку входу ('/login')" }, "database": { "title": "Імпорт/експорт бази даних", @@ -331,22 +474,310 @@ "alphabetical": "Абеткою", "globalPopularity": "Глобальною поулярністю", "sortBy": "Сортувати за:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Мультіінструмент PDF", "desc": "Об'єднання, поворот, зміна порядку та видалення сторінок" }, "merge": { + "tags": "combine,join,unite", "title": "Об'єднати", "desc": "Легко об'єднуйте кілька PDF-файлів у один." }, "split": { + "tags": "divide,separate,break", "title": "Розділити", "desc": "Розділіть PDF-файли на кілька документів" }, "rotate": { + "tags": "turn,flip,orient", "title": "Повернути", "desc": "Легко повертайте ваші PDF-файли." }, + "convert": { + "tags": "transform,change", + "title": "Конвертувати", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Реорганізація", + "desc": "Видалення/перестановка сторінок у будь-якому порядку" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Додати зображення", + "desc": "Додає зображення у вказане місце в PDF (в розробці)" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Додати водяний знак", + "desc": "Додайте свій водяний знак до документа PDF." + }, + "removePassword": { + "tags": "unlock", + "title": "Видалити пароль", + "desc": "Зніміть захист паролем з вашого документа PDF." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Стиснути", + "desc": "Стискайте PDF-файли, щоб зменшити їх розмір." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Змінити метадані", + "desc": "Змінити/видалити/додати метадані з документа PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR/Очищення сканування", + "desc": "Очищення сканування та виявлення тексту на зображеннях у файлі PDF та повторне додавання його як текст." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Витягнути зображення", + "desc": "Витягує всі зображення з PDF і зберігає їх у zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Підпис", + "desc": "Додає підпис до PDF за допомогою малюнка, тексту або зображення" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Знеактивування", + "desc": "Видалення всіх інтерактивних елементів та форм з PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Підписати сертифікатом", + "desc": "Підписати PDF сертифікатом/ключем (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Ремонт", + "desc": "Намагається відновити пошкоджений/зламаний PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Видалити порожні сторінки", + "desc": "Виявляє та видаляє порожні сторінки з документа" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Видалити анотації", + "desc": "Видаляє всі коментарі/анотації з PDF" + }, + "compare": { + "tags": "difference", + "title": "Порівняння", + "desc": "Порівнює та показує різницю між двома PDF-документами" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Видалити підпис сертифікатом", + "desc": "Видалити підпис сертифікатом з PDF-документу" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Об'єднати сторінки", + "desc": "Об'єднання кількох сторінок документа PDF в одну сторінку" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Змінити розмір/масштаб сторінки", + "desc": "Змінити розмір/масштаб сторінки та/або її вмісту." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Додати номера сторінок", + "desc": "Додає номера сторінок по всьому документу в заданому місці" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Налаштування кольорів/контрастності", + "desc": "Налаштування контрастності, насиченості та яскравості файлу PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Обрізати PDF-файл", + "desc": "Обрізати PDF-файл, щоб зменшити його розмір (текст залишається!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Автоматичне розділення сторінок", + "desc": "Автоматичне розділення відсканованого PDF-файлу за допомогою фізичного роздільника відсканованих сторінок QR-коду" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Отримати ВСЮ інформацію у форматі PDF", + "desc": "Збирає будь-яку можливу інформацію у PDF-файлах." + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF на одну велику сторінку", + "desc": "Об'єднує всі сторінки PDF в одну велику сторінку." + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Показати JavaScript", + "desc": "Шукає та відображає будь-який JS, вбудований у PDF-файл." + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Ручне редагування", + "desc": "Редагує PDF-файл на основі виділеного тексту, намальованих форм і/або вибраних сторінок" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Видалити зображення", + "desc": "Видаляє зображення з PDF для зменшення розміру файлу" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Розділити PDF за розділами", + "desc": "Розділяє PDF на кілька файлів на основі структури його розділів" + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Перевірка підпису PDF", + "desc": "Перевірка цифрових підписів та сертифікатів у PDF-документах" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Видобути сторінки", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Видалення", + "desc": "Видаліть непотрібні сторінки з документа PDF." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Автоматичне розділення за розміром/кількістю", + "desc": "Розділяє один PDF на кілька документів на основі розміру, кількості сторінок або кількості документів" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Додати пароль", + "desc": "Зашифруйте документ PDF паролем." + }, + "changePermissions": { + "title": "Змінити дозволи", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Накладення одного PDF поверх іншого PDF", + "title": "Накладення PDF" + }, "imageToPDF": { "title": "Зображення в PDF", "desc": "Перетворення зображення (PNG, JPEG, GIF) в PDF." @@ -355,18 +786,6 @@ "title": "PDF в зображення", "desc": "Перетворення PDF в зображення. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Реорганізація", - "desc": "Видалення/перестановка сторінок у будь-якому порядку" - }, - "addImage": { - "title": "Додати зображення", - "desc": "Додає зображення у вказане місце в PDF (в розробці)" - }, - "watermark": { - "title": "Додати водяний знак", - "desc": "Додайте свій водяний знак до документа PDF." - }, "permissions": { "title": "Змінити дозволи", "desc": "Змініть дозволи вашого документа PDF" @@ -375,38 +794,10 @@ "title": "Видалення", "desc": "Видаліть непотрібні сторінки з документа PDF." }, - "addPassword": { - "title": "Додати пароль", - "desc": "Зашифруйте документ PDF паролем." - }, - "removePassword": { - "title": "Видалити пароль", - "desc": "Зніміть захист паролем з вашого документа PDF." - }, - "compress": { - "title": "Стиснути", - "desc": "Стискайте PDF-файли, щоб зменшити їх розмір." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Змінити метадані", - "desc": "Змінити/видалити/додати метадані з документа PDF" - }, "fileToPDF": { "title": "Конвертувати файл в PDF", "desc": "Конвертуйте майже будь-який файл в PDF (DOCX, PNG, XLS, PPT, TXT та інші)" }, - "ocr": { - "title": "OCR/Очищення сканування", - "desc": "Очищення сканування та виявлення тексту на зображеннях у файлі PDF та повторне додавання його як текст." - }, - "extractImages": { - "title": "Витягнути зображення", - "desc": "Витягує всі зображення з PDF і зберігає їх у zip" - }, "pdfToPDFA": { "title": "PDF в PDF/A", "desc": "Перетворення PDF в PDF/A для довготривалого зберігання" @@ -435,70 +826,14 @@ "title": "Виявлення/розділення відсканованих фотографій", "desc": "Розділяє кілька фотографій з фото/PDF" }, - "sign": { - "title": "Підпис", - "desc": "Додає підпис до PDF за допомогою малюнка, тексту або зображення" - }, - "flatten": { - "title": "Знеактивування", - "desc": "Видалення всіх інтерактивних елементів та форм з PDF" - }, - "repair": { - "title": "Ремонт", - "desc": "Намагається відновити пошкоджений/зламаний PDF" - }, - "removeBlanks": { - "title": "Видалити порожні сторінки", - "desc": "Виявляє та видаляє порожні сторінки з документа" - }, - "removeAnnotations": { - "title": "Видалити анотації", - "desc": "Видаляє всі коментарі/анотації з PDF" - }, - "compare": { - "title": "Порівняння", - "desc": "Порівнює та показує різницю між двома PDF-документами" - }, - "certSign": { - "title": "Підписати сертифікатом", - "desc": "Підписати PDF сертифікатом/ключем (PEM/P12)" - }, - "removeCertSign": { - "title": "Видалити підпис сертифікатом", - "desc": "Видалити підпис сертифікатом з PDF-документу" - }, - "pageLayout": { - "title": "Об'єднати сторінки", - "desc": "Об'єднання кількох сторінок документа PDF в одну сторінку" - }, - "scalePages": { - "title": "Змінити розмір/масштаб сторінки", - "desc": "Змінити розмір/масштаб сторінки та/або її вмісту." - }, "pipeline": { "title": "Конвеєр (розширений)", "desc": "Виконуйте кілька дій з PDF-файлами, визначаючи сценарії конвеєрної обробки." }, - "addPageNumbers": { - "title": "Додати номера сторінок", - "desc": "Додає номера сторінок по всьому документу в заданому місці" - }, "auto-rename": { "title": "Автоматичне перейменування PDF-файлу", "desc": "Автоматичне перейменування файлу PDF на основі його виявленого заголовку" }, - "adjustContrast": { - "title": "Налаштування кольорів/контрастності", - "desc": "Налаштування контрастності, насиченості та яскравості файлу PDF" - }, - "crop": { - "title": "Обрізати PDF-файл", - "desc": "Обрізати PDF-файл, щоб зменшити його розмір (текст залишається!)" - }, - "autoSplitPDF": { - "title": "Автоматичне розділення сторінок", - "desc": "Автоматичне розділення відсканованого PDF-файлу за допомогою фізичного роздільника відсканованих сторінок QR-коду" - }, "sanitizePDF": { "title": "Санітарна обробка", "desc": "Видалення скриптів та інших елементів з PDF-файлів" @@ -519,30 +854,14 @@ "title": "PDF в Markdown", "desc": "Конвертує будь-який файл PDF у Markdown" }, - "getPdfInfo": { - "title": "Отримати ВСЮ інформацію у форматі PDF", - "desc": "Збирає будь-яку можливу інформацію у PDF-файлах." - }, "pageExtracter": { "title": "Видобути сторінку(и)", "desc": "Видобуває обрані сторінки з PDF" }, - "pdfToSinglePage": { - "title": "PDF на одну велику сторінку", - "desc": "Об'єднує всі сторінки PDF в одну велику сторінку." - }, - "showJS": { - "title": "Показати JavaScript", - "desc": "Шукає та відображає будь-який JS, вбудований у PDF-файл." - }, "autoRedact": { "title": "Автоматичне редагування", "desc": "Автоматичне затемнення (чорніння) тексту в PDF на основі вхідного тексту" }, - "redact": { - "title": "Ручне редагування", - "desc": "Редагує PDF-файл на основі виділеного тексту, намальованих форм і/або вибраних сторінок" - }, "PDFToCSV": { "title": "PDF в CSV", "desc": "Видобуває таблиці з PDF та перетворює їх у CSV" @@ -551,10 +870,6 @@ "title": "Автоматичне розділення за розміром/кількістю", "desc": "Розділяє один PDF на кілька документів на основі розміру, кількості сторінок або кількості документів" }, - "overlay-pdfs": { - "title": "Накладення PDF", - "desc": "Накладення одного PDF поверх іншого PDF" - }, "split-by-sections": { "title": "Розділення PDF за секціями", "desc": "Розділення кожної сторінки PDF на менші горизонтальні та вертикальні секції" @@ -563,43 +878,17 @@ "title": "Додати печатку на PDF", "desc": "Додавання текстової або зображення печатки у вказані місця" }, - "removeImage": { - "title": "Видалити зображення", - "desc": "Видаляє зображення з PDF для зменшення розміру файлу" - }, - "splitByChapters": { - "title": "Розділити PDF за розділами", - "desc": "Розділяє PDF на кілька файлів на основі структури його розділів" - }, - "validateSignature": { - "title": "Перевірка підпису PDF", - "desc": "Перевірка цифрових підписів та сертифікатів у PDF-документах" - }, "replace-color": { "title": "Заміна та інверсія кольору", "desc": "Замінює колір тексту та фону у PDF та інвертує всі кольори PDF для зменшення розміру файлу" }, - "convert": { - "title": "Конвертувати" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Видобути сторінки" - }, - "removePages": { - "title": "Видалення", - "desc": "Видаліть непотрібні сторінки з документа PDF." - }, "removeImagePdf": { "title": "Видалити зображення", "desc": "Видаляє зображення з PDF для зменшення розміру файлу" }, - "autoSizeSplitPDF": { - "title": "Автоматичне розділення за розміром/кількістю", - "desc": "Розділяє один PDF на кілька документів на основі розміру, кількості сторінок або кількості документів" - }, "adjust-contrast": { "title": "Налаштування кольорів/контрастності", "desc": "Налаштування контрастності, насиченості та яскравості файлу PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Заміна та інверсія кольору", "desc": "Замінює колір тексту та фону у PDF та інвертує всі кольори PDF для зменшення розміру файлу" - }, - "changePermissions": { - "title": "Змінити дозволи" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "перегляд,читання,анотації,текст,зображення", "title": "Перегляд/редагування PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "об'єднання,операції зі сторінками,серверна частина", "title": "Об'єднати", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Об'єднати", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Ім'я файлу", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Об'єднання кількох PDF-файлів (2+)", "sortByName": "Сортування за ім'ям", "sortByDate": "Сортування за датою", - "removeCertSign": "Видалити цифровий підпис у об’єднаному файлі?", - "submit": "Об'єднати", - "sortBy": { - "filename": "Ім'я файлу" - } + "removeCertSign": "Видалити цифровий підпис у об’єднаному файлі?" }, "split": { - "tags": "операції зі сторінками,розділення,багатосторінковий,вирізання,серверна частина", "title": "Розділити PDF", "header": "Розділити PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Введіть сторінки для розділення:", "submit": "Розділити", "steps": { + "chooseMethod": "Choose Method", "settings": "Налаштування" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Розмір файлу" + "name": "Розмір файлу", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Розмір файлу" + "label": "Розмір файлу", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "операції зі сторінками,розділення,багатосторінковий,вирізання,серверна частина" }, "rotate": { - "tags": "серверна частина", "title": "Повернути PDF", + "submit": "Повернути", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "серверна частина", "header": "Повернути PDF", - "selectAngle": "Виберіть кут повороту (кратний 90 градусам):", - "submit": "Повернути" + "selectAngle": "Виберіть кут повороту (кратний 90 градусам):" + }, + "convert": { + "title": "Конвертувати", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Налаштування", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Колір", + "greyscale": "Відтінки сірого", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Заповнення сторінки", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "Цей PDF документ має цифровий підпис. Цей підпис буде видалений у наступному кроці.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Відтінки сірого", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "конвертація,зображення,jpg,картинка,фото" @@ -727,7 +1263,33 @@ "8": "Видалити останню", "9": "Видалити першу та останню", "10": "Об'єднання парних-непарних", - "11": "Дублювати всі сторінки" + "11": "Дублювати всі сторінки", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(наприклад, 1,3,2 або 4-8,2,10-12 або 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Додати зображення", "submit": "Додати зображення" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "текст,повторний,мітка,власний,авторське право,торговельна марка,зображення,jpg,картинка,фото", "title": "Додати водяний знак", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Додати водяний знак", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Текст", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Розмір шрифту", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Текст", + "2": "Зображення" + }, + "tags": "текст,повторний,мітка,власний,авторське право,торговельна марка,зображення,jpg,картинка,фото", "header": "Додати водяний знак", "customColor": "Користувацький колір тексту", "selectText": { @@ -755,17 +1506,6 @@ "8": "Тип водяного знаку:", "9": "Зображення водяного знаку:", "10": "Кевертувати PDF в PDF-Image" - }, - "submit": "Додати водяний знак", - "type": { - "1": "Текст", - "2": "Зображення" - }, - "watermarkType": { - "text": "Текст" - }, - "settings": { - "fontSize": "Розмір шрифту" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "видалити сторінки,видалення сторінок", "title": "Видалення", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Видалення" }, - "addPassword": { - "tags": "безпека,захист", - "title": "Додати пароль", - "header": "Додати пароль (зашифрувати)", - "selectText": { - "1": "Оберіть PDF для шифрування", - "2": "Пароль", - "3": "Довжина ключа шифрування", - "4": "Вищі значення сильніші, але нижчі значення мають кращу сумісність.", - "5": "Дозволи на встановлення", - "6": "Запобігти збірці документа", - "7": "Запобігти вилученню контенту", - "8": "Запобігти вилученню для доступності", - "9": "Заборонити заповнення форм", - "10": "Запобігти модифікації", - "11": "Заборонити модифікацію анотацій", - "12": "Заборонити друк", - "13": "Заборонити друк різних форматів", - "14": "Власницький пароль", - "15": "Обмежує, що можна робити з документом після його відкриття (не підтримується всіма програмами читання)", - "16": "Обмежує відкриття самого документа" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Шифрувати", "tooltip": { - "permissions": { - "title": "Змінити дозволи" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "безпека,розшифровка,захист,видалення пароля", - "title": "Видалити пароль", - "header": "Видалити пароль (Розшифрувати)", - "selectText": { - "1": "Виберіть PDF для розшифрування", - "2": "Пароль" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Видалити", - "desc": "Зніміть захист паролем з вашого документа PDF.", - "password": { - "stepTitle": "Видалити пароль", - "label": "Поточний пароль" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "заголовок,автор,дата,створення,час,видавець,виробник,статистика", - "title": "Заголовок:", "header": "Змінити метадані", + "submit": "Змінити", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "заголовок,автор,дата,створення,час,видавець,виробник,статистика", "selectText": { "1": "Будь ласка, відредагуйте змінні, які ви хочете змінити", "2": "Видалити всі метадані", @@ -856,15 +1877,7 @@ "4": "Інші метадані:", "5": "Додати користувацький запис метаданих" }, - "author": "Автор:", - "creationDate": "Дата створення (yyyy/MM/dd HH:mm:ss):", - "creator": "Створювач:", - "keywords": "Ключові слова:", - "modDate": "Дата зміни (yyyy/MM/dd HH:mm:ss):", - "producer": "Виробник:", - "subject": "Тема:", - "trapped": "Пастка:", - "submit": "Змінити" + "modDate": "Дата зміни (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "перетворення,формат,документ,картинка,презентація,текст,конвертація,офіс,документи,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "розпізнавання,текст,зображення,сканування,читання,ідентифікація,виявлення,редагований", "title": "OCR/Очищення сканування", + "desc": "Очищення сканування та виявлення тексту на зображеннях у файлі PDF та повторне додавання його як текст.", "header": "Очищення сканування / OCR (Optical Character Recognition) Розпізнавання тексту", "selectText": { "1": "Виберіть мови, які повинні бути виявлені у PDF-файлі (перелічені ті, які виявлені на даний момент):", @@ -896,23 +1910,89 @@ "help": "Прочитайте цю документацію про те, як використовувати це для інших мов і/або використовувати не в докері.", "credit": "Цей сервіс використовує qpdf та Tesseract для OCR.", "submit": "Обробка PDF з OCR", - "desc": "Очищення сканування та виявлення тексту на зображеннях у файлі PDF та повторне додавання його як текст.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Налаштування", "ocrMode": { - "label": "Режим OCR" + "label": "Режим OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Мови" + "label": "Мови", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Режим OCR" + "title": "Режим OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Мови" + "title": "Мови", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Витягнути зображення", "selectText": "Виберіть формат зображення для перетворення витягнутих зображень у", "allowDuplicates": "Зберігати дублікати зображень", - "submit": "Витягнути" + "submit": "Витягнути", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "архів,довгостроковий,стандартний,конверсія,зберігання,консервація", @@ -993,17 +2079,53 @@ }, "info": "Python не встановлено. Він необхідний роботи." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "авторизувати,ініціали,намальований-підпис,текстовий-підпис,зображення-підпис", "title": "Підпис", "header": "Підписати PDF", "upload": "Завантажити зображення", - "draw": "Намалювати підпис", - "text": "Ввід тексту", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Очистити", "add": "Додати", "saved": "Збережені підписи", "save": "Зберегти підпис", + "applySignatures": "Apply Signatures", "personalSigs": "Особисті підписи", "sharedSigs": "Загальні підписи", "noSavedSigs": "Збережені підписи не знайдено", @@ -1015,42 +2137,179 @@ "previous": "Попередня сторінка", "maintainRatio": "Переключити збереження пропорцій", "undo": "Скасувати", - "redo": "Повторити" + "redo": "Повторити", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "авторизувати,ініціали,намальований-підпис,текстовий-підпис,зображення-підпис" }, "flatten": { - "tags": "flatten,статичний,дезактивувати,неінтерактивний, упорядкувати", "title": "Згладжування", "header": "Згладжування PDF", "flattenOnlyForms": "Згладити тільки форми", "submit": "Згладити", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Налаштування" }, "options": { - "flattenOnlyForms": "Згладити тільки форми" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Згладити тільки форми", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "flatten,статичний,дезактивувати,неінтерактивний, упорядкувати" }, "repair": { "tags": "виправити,відновити,виправити,відновити", "title": "Ремонт", "header": "Ремонт PDF", - "submit": "Ремонтувати" + "submit": "Ремонтувати", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "очищення,упорядкування,без вмісту,упорядкування", "title": "Видалити порожні", "header": "Видалити порожні сторінки", - "threshold": "Поріг:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Видалити порожні", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "очищення,упорядкування,без вмісту,упорядкування", "thresholdDesc": "Поріг для визначення того, наскільки білим має бути білий піксель", - "whitePercent": "Відсоток білого (%):", - "whitePercentDesc": "Загальний відсоток білого на сторінці, для видалення", - "submit": "Видалити порожні" + "whitePercentDesc": "Загальний відсоток білого на сторінці, для видалення" }, "removeAnnotations": { "tags": "коментарі,виділення,примітки,розмітка,видалення", "title": "Видалити анотації", "header": "Видалити анотації", - "submit": "Видалити" + "submit": "Видалити", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "диференціація,контраст,зміни,аналіз", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "автентифікація,pem,p12,офіційний,шифрування", "title": "Підпис сертифікатом", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Місцезнаходження", + "logoTitle": "Logo", + "name": "Ім'я", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Введіть пароль до сховища ключів або особистого ключа (якщо є):", + "passwordOptional": "Leave empty if no password", + "reason": "Причина", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Показати логотип", "header": "Підпишіть PDF своїм сертифікатом (робота в процесі)", "selectPDF": "Виберіть файл PDF для підпису:", "jksNote": "Примітка: Якщо ваш тип сертифіката не зазначений нижче, будь ласка, конвертуйте його в файл сховища Java Keystore (.jks), використовуючи утиліту командного рядка keytool. Потім виберіть опцію файлу .jks нижче.", @@ -1089,13 +2484,7 @@ "selectCert": "Виберіть файл сертифіката (формат X.509, може бути .pem або .der):", "selectP12": "Виберіть файл сховища ключів PKCS#12 (.p12 або .pfx) (необов'язково, якщо він наданий, він повинен містити ваш закритий ключ і сертифікат):", "selectJKS": "Виберіть файл сховища Java Keystore (.jks або .keystore):", - "certType": "Тип сертифіката", - "password": "Введіть пароль до сховища ключів або особистого ключа (якщо є):", "showSig": "Показати підпис", - "reason": "Причина", - "location": "Місцезнаходження", - "name": "Ім'я", - "showLogo": "Показати логотип", "submit": "Підписати PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Видалення підпису сертифікатом", "header": "Видалення підпису сертифікатом з PDF документу", "selectPDF": "Оберіть PDF-файл:", - "submit": "Видалити підпис" + "submit": "Видалити підпис", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "об'єднати,скласти,єдиний перегляд,упорядкувати", @@ -1111,16 +2511,157 @@ "header": "Многосторінковий макет", "pagesPerSheet": "Сторінок на одному аркуші:", "addBorder": "Додати рамки", - "submit": "Відправити" + "submit": "Відправити", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "змінити розмір,змінити,розмір,адаптувати", "title": "Відрегулювати масштаб сторінки", "header": "Відрегулювати масштаб сторінки", "pageSize": "Розмір сторінки документа.", "keepPageSize": "Оригінальний розмір", "scaleFactor": "Рівень масштабування (обрізки) сторінки.", - "submit": "Відправити" + "submit": "Відправити", + "tags": "змінити розмір,змінити,розмір,адаптувати" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "розбити на сторінки,позначити,упорядкувати,індексувати" @@ -1129,16 +2670,83 @@ "tags": "автоматичне визначення,на основі заголовка,організація,зміна міток", "title": "Автоматичне перейменування", "header": "Автоматичне перейменування PDF", - "submit": "Автоматичне перейменування" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Автоматичне перейменування", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "корекція кольору,налаштування,зміна,покращення" }, "crop": { - "tags": "обрізати,зменшувати,редагувати,формувати", "title": "Обрізати", "header": "Обрізати PDF-файл", - "submit": "Надіслати" + "submit": "Надіслати", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "обрізати,зменшувати,редагувати,формувати" }, "autoSplitPDF": { "tags": "на основі qr,відокремити,сканувати сегмент,упорядкувати", @@ -1221,24 +2829,124 @@ "downloadJS": "Завантажити JavaScript", "submit": "Показати" }, - "autoRedact": { - "tags": "редагувати,приховати,затемнити,чорний,маркер,приховано", - "title": "Автоматичне редагування", - "header": "Автоматичне редагування", - "colorLabel": "Колір", - "textsToRedactLabel": "Текст для приховування (кожен рядок окремо)", - "textsToRedactPlaceholder": "наприклад \\nКонфіденційно \\nЦілком таємно", - "useRegexLabel": "Використовувати регулярні вирази", - "wholeWordSearchLabel": "Пошук цілих слів", - "customPaddingLabel": "Додаткове заповнення за користувацьким значенням", - "convertPDFToImageLabel": "Перетворити PDF в зображення PDF (використовується для видалення тексту поза межами)", - "submitButton": "Надіслати" - }, "redact": { "tags": "редагувати,приховати,затемнити,чорний,маркер,приховано,вручну", "title": "Ручне редагування", - "header": "Ручне редагування", "submit": "Редагувати", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Додаткове" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Додати", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Сторінки", + "placeholder": "(наприклад 1,2,8 або 4,7,12-16 або 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Експорт", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Ручне редагування", "textBasedRedaction": "Редагування на основі тексту", "pageBasedRedaction": "Редагування на основі сторінок", "convertPDFToImageLabel": "Перетворити PDF на PDF-зображення (використовується для видалення тексту за рамкою)", @@ -1264,22 +2972,7 @@ "showLayers": "Показати шари (подвійне клацання для скидання всіх шарів до стану за умовчанням)", "colourPicker": "Вибір кольору", "findCurrentOutlineItem": "Знайти поточний елемент структури", - "applyChanges": "Застосувати зміни", - "auto": { - "settings": { - "advancedTitle": "Додаткове" - }, - "wordsToRedact": { - "add": "Додати" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Сторінки", - "placeholder": "(наприклад 1,2,8 або 4,7,12-16 або 2n-1)" - }, - "export": "Експорт" - } + "applyChanges": "Застосувати зміни" }, "tableExtraxt": { "tags": "csv,видобуток таблиці,вилучення,конвертація" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "накладання", "header": "Накладення файлів PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Виберіть основний файл PDF" }, "overlayFiles": { - "label": "Виберіть файл(и) для накладення" + "label": "Виберіть файл(и) для накладення", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Виберіть режим накладення", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "Кількість накладень (для режиму з фіксованим повторенням)", - "placeholder": "Введіть через кому кількість повторень (наприклад, 2,3,1)" + "placeholder": "Введіть через кому кількість повторень (наприклад, 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Виберіть позицію накладення", "foreground": "Над основним", "background": "За основним" }, - "submit": "Надіслати" + "submit": "Надіслати", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "розділ розділу,розділення,налаштування", @@ -1332,6 +3068,7 @@ "tags": "штамп,додати зображення,центральне зображення,водяний знак,pdf,вставити,налаштувати", "header": "Поставити печатку на PDF", "title": "Поставити печатку на PDF", + "stampSetup": "Stamp Setup", "stampType": "Тип печатки", "stampText": "Текст печатки", "stampImage": "Зображення печатки", @@ -1344,7 +3081,19 @@ "overrideY": "Перевизначити координату Y", "customMargin": "Користувацький відступ", "customColor": "Користувацький колір тексту", - "submit": "Надіслати" + "submit": "Надіслати", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "видалення зображення,операції зі сторінками,серверна частина" @@ -1362,7 +3111,8 @@ "status": { "_value": "Статус", "valid": "Дійна", - "invalid": "Недійсна" + "invalid": "Недійсна", + "complete": "Validation complete" }, "signer": "Підписант", "date": "Дата", @@ -1389,40 +3139,122 @@ "version": "Версія", "keyUsage": "Використання ключа", "selfSigned": "Самоподписанный", - "bits": "біт" + "bits": "біт", + "details": "Certificate Details" }, "signature": { "info": "Інформація про підписи", "_value": "Подпись", "mathValid": "Подпись математически корректна, НО:" }, - "selectCustomCert": "Користувачський файл сертифіката X.509 (Необов'язково)" - }, - "replace-color": { - "title": "Заміна-інверсія кольору", - "header": "Заміна-інверсія кольору PDF", - "selectText": { - "1": "Параметри заміни або інверсії кольору", - "2": "За замовчуванням (кольори високого розмаїття)", - "3": "Користувальницькі (настроювані кольори)", - "4": "Повна інверсія (інвертувати всі кольори)", - "5": "Параметри високого розмаїття", - "6": "білий текст на чорному тлі", - "7": "чорний текст на білому тлі", - "8": "жовтий текст на чорному тлі", - "9": "зелений текст на чорному тлі", - "10": "Вибрати колір тексту", - "11": "Вибрати колір тла" + "selectCustomCert": "Користувачський файл сертифіката X.509 (Необов'язково)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Замінити" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Заміна кольору, операції зі сторінками, Серверна частина" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Вхід", "header": "Вхід", "signin": "Увійти", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Запам'ятати мене", "invalid": "Недійсне ім'я користувача або пароль.", "locked": "Ваш обліковий запис заблоковано.", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "Ви вже увійшли до", "alreadyLoggedIn2": "пристроїв (а). Будь ласка, вийдіть із цих пристроїв і спробуйте знову.", "toManySessions": "У вас дуже багато активних сесій", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF на одну сторінку", "header": "PDF на одну сторінку", - "submit": "Перетворити на одну сторінку" + "submit": "Перетворити на одну сторінку", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Видобути сторінки", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "Налаштування контрастності", "header": "Налаштування контрастності", + "basic": "Basic Adjustments", "contrast": "Контраст:", "brightness": "Яскравість:", "saturation": "Насиченість:", - "download": "Завантажити" + "download": "Завантажити", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Стиснути", + "desc": "Compress PDFs to reduce their file size.", "header": "Стиснути PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Розмір файлу" + }, "credit": "Ця служба використовує qpdf для стиснення/оптимізації PDF.", "grayscale": { "label": "Застосувати відтінки сірого для стиснення" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Параметри стиснення", @@ -1491,10 +3435,7 @@ "4": "Автоматичний режим - автоматично налаштовує якість для отримання PDF точного розміру", "5": "Очікуваний розмір PDF (наприклад, 25 МБ, 10,8 МБ, 25 КБ)" }, - "submit": "Стиснути", - "method": { - "filesize": "Розмір файлу" - } + "submit": "Стиснути" }, "decrypt": { "passwordPrompt": "Цей файл захищений паролем. Будь ласка, введіть пароль:", @@ -1595,7 +3536,13 @@ "title": "Видалити зображення", "header": "Видалити зображення", "removeImage": "Видалити зображення", - "submit": "Видалити зображення" + "submit": "Видалити зображення", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Розділити PDF по главам", @@ -1629,6 +3576,12 @@ }, "note": "Примітка до релізу доступна тільки на англійській мові" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,54 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Завантажити", - "undo": "Скасувати", - "convert": { - "title": "Конвертувати", - "settings": "Налаштування", - "color": "Колір", - "greyscale": "Відтінки сірого", - "fillPage": "Заповнення сторінки", - "pdfaDigitalSignatureWarning": "Цей PDF документ має цифровий підпис. Цей підпис буде видалений у наступному кроці.", - "grayscale": "Відтінки сірого" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Вибрати все", - "deselectAll": "Скасувати вибір усіх" + "deselectAll": "Скасувати вибір усіх", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Підпис" + "read": "Read", + "sign": "Підпис", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Завантаження...", - "or": "або" + "or": "або", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Ім'я", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Версія", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Вибрати все", "deselectAll": "Скасувати вибір усіх", "deleteSelected": "Видалити вибрані", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Завантажити", - "delete": "Видалити" + "delete": "Видалити", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Дезінфекція PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Налаштування" + "files": "Files", + "settings": "Налаштування", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Додати пароль", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Шифрувати", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Змінити дозволи", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "безпека,захист", + "header": "Додати пароль (зашифрувати)", + "selectText": { + "1": "Оберіть PDF для шифрування", + "2": "Пароль", + "3": "Довжина ключа шифрування", + "4": "Вищі значення сильніші, але нижчі значення мають кращу сумісність.", + "5": "Дозволи на встановлення", + "6": "Запобігти збірці документа", + "7": "Запобігти вилученню контенту", + "8": "Запобігти вилученню для доступності", + "9": "Заборонити заповнення форм", + "10": "Запобігти модифікації", + "11": "Заборонити модифікацію анотацій", + "12": "Заборонити друк", + "13": "Заборонити друк різних форматів", + "14": "Власницький пароль", + "15": "Обмежує, що можна робити з документом після його відкриття (не підтримується всіма програмами читання)", + "16": "Обмежує відкриття самого документа" } }, "changePermissions": { "title": "Змінити дозволи", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Змінити дозволи", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Запобігти збірці документа" @@ -1738,10 +4580,784 @@ "label": "Заборонити друк різних форматів" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Змінити дозволи" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Видалити пароль", + "desc": "Зніміть захист паролем з вашого документа PDF.", + "tags": "безпека,розшифровка,захист,видалення пароля", + "password": { + "stepTitle": "Видалити пароль", + "label": "Поточний пароль", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Видалити", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Видалити пароль (Розшифрувати)", + "selectText": { + "1": "Виберіть PDF для розшифрування", + "2": "Пароль" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Параметри заміни або інверсії кольору", + "2": "За замовчуванням (кольори високого розмаїття)", + "3": "Користувальницькі (настроювані кольори)", + "4": "Повна інверсія (інвертувати всі кольори)", + "5": "Параметри високого розмаїття", + "6": "білий текст на чорному тлі", + "7": "чорний текст на білому тлі", + "8": "жовтий текст на чорному тлі", + "9": "зелений текст на чорному тлі", + "10": "Вибрати колір тексту", + "11": "Вибрати колір тла", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Замінити", + "title": "Заміна-інверсія кольору", + "header": "Заміна-інверсія кольору PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "редагувати,приховати,затемнити,чорний,маркер,приховано", + "title": "Автоматичне редагування", + "header": "Автоматичне редагування", + "colorLabel": "Колір", + "textsToRedactLabel": "Текст для приховування (кожен рядок окремо)", + "textsToRedactPlaceholder": "наприклад \\nКонфіденційно \\nЦілком таємно", + "useRegexLabel": "Використовувати регулярні вирази", + "wholeWordSearchLabel": "Пошук цілих слів", + "customPaddingLabel": "Додаткове заповнення за користувацьким значенням", + "convertPDFToImageLabel": "Перетворити PDF в зображення PDF (використовується для видалення тексту поза межами)", + "submitButton": "Надіслати" + }, + "replaceColorPdf": { + "tags": "Заміна кольору, операції зі сторінками, Серверна частина" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/vi-VN/translation.json b/frontend/public/locales/vi-VN/translation.json index f5fa86f40..fd0dcc40c 100644 --- a/frontend/public/locales/vi-VN/translation.json +++ b/frontend/public/locales/vi-VN/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Văn bản tùy chỉnh", "numberPagesDesc": "Những trang cần đánh số, mặc định là 'all', cũng chấp nhận 1-5 hoặc 2,5,9 v.v.", "customNumberDesc": "Mặc định là {n}, cũng chấp nhận 'Trang {n} / {total}', 'Văn bản-{n}', '{filename}-{n}", - "submit": "Thêm số trang" + "submit": "Thêm số trang", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Lựa chọn trang tùy chỉnh (Nhập danh sách số trang được phân tách bằng dấu phẩy 1,5,6 hoặc Các hàm như 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Chọn (các) tệp PDF", "multiPdfPrompt": "Chọn các tệp PDF (2+)", "multiPdfDropPrompt": "Chọn (hoặc kéo và thả) tất cả các tệp PDF bạn cần", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Cảnh báo: Quá trình này có thể mất đến một phút tùy thuộc vào kích thước tệp", "pageOrderPrompt": "Thứ tự trang tùy chỉnh (Nhập danh sách số trang được phân tách bằng dấu phẩy hoặc Các hàm như 2n+1) :", - "pageSelectionPrompt": "Lựa chọn trang tùy chỉnh (Nhập danh sách số trang được phân tách bằng dấu phẩy 1,5,6 hoặc Các hàm như 2n+1) :", "goToPage": "Đi đến", "true": "Đúng", "false": "Sai", "unknown": "Không xác định", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Lưu", "saveToBrowser": "Lưu vào trình duyệt", + "download": "Tải xuống", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Đóng", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "tệp đã chọn", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Không có mục yêu thích nào được thêm", "downloadComplete": "Tải xuống hoàn tất", "bored": "Chán phải chờ đợi?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "Tài liệu PDF được bảo vệ bằng mật khẩu và mật khẩu không được cung cấp hoặc không chính xác", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Lỗi", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Xin lỗi vì sự cố!", "needHelp": "Cần trợ giúp / Phát hiện sự cố?", "contactTip": "Nếu bạn vẫn gặp khó khăn, đừng ngần ngại liên hệ với chúng tôi để được trợ giúp. Bạn có thể gửi ticket trên trang GitHub của chúng tôi hoặc liên hệ qua Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Gửi ticket", "discordSubmit": "Discord - Gửi bài đăng hỗ trợ" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Xóa", "username": "Tên người dùng", "password": "Mật khẩu", @@ -82,6 +169,7 @@ "green": "Xanh lá", "blue": "Xanh dương", "custom": "Tùy chỉnh...", + "comingSoon": "Coming soon", "WorkInProgess": "Đang trong quá trình phát triển, Có thể không hoạt động hoặc có lỗi, Vui lòng báo cáo mọi vấn đề!", "poweredBy": "Được hỗ trợ bởi", "yes": "Có", @@ -115,12 +203,14 @@ "page": "Page", "pages": "Pages", "loading": "Loading...", + "review": "Review", "addToDoc": "Add to Document", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Privacy Policy", + "iAgreeToThe": "I agree to all of the", "terms": "Terms and Conditions", "accessibility": "Accessibility", "cookie": "Cookie Policy", @@ -160,6 +250,7 @@ "title": "Do you want make Stirling PDF better?", "paragraph1": "Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.", "paragraph2": "Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.", + "learnMore": "Learn more", "enable": "Enable analytics", "disable": "Disable analytics", "settings": "You can change the settings for analytics in the config/settings.yml file" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Lưu đầu vào biểu mẫu", "help": "Bật để lưu trữ các đầu vào đã sử dụng trước đó cho các lần chạy trong tương lai" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Nhập/Xuất cơ sở dữ liệu", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Đa công cụ PDF", "desc": "Ghép nối, Xoay, Sắp xếp lại và Xóa trang" }, "merge": { + "tags": "combine,join,unite", "title": "Ghép nối", "desc": "Dễ dàng ghép nối nhiều PDF thành một." }, "split": { + "tags": "divide,separate,break", "title": "Tách", "desc": "Tách PDF thành nhiều tài liệu" }, "rotate": { + "tags": "turn,flip,orient", "title": "Xoay", "desc": "Dễ dàng xoay PDF của bạn." }, + "convert": { + "tags": "transform,change", + "title": "Chuyển đổi", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Sắp xếp", + "desc": "Xóa/Sắp xếp lại trang theo bất kỳ thứ tự nào" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Thêm hình ảnh", + "desc": "Thêm hình ảnh vào vị trí cố định trên PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Thêm hình mờ", + "desc": "Thêm hình mờ tùy chỉnh vào tài liệu PDF của bạn." + }, + "removePassword": { + "tags": "unlock", + "title": "Xóa mật khẩu", + "desc": "Xóa bảo vệ mật khẩu khỏi tài liệu PDF của bạn." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Nén", + "desc": "Nén PDF để giảm kích thước tệp." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Thay đổi Metadata", + "desc": "Thay đổi/Xóa/Thêm metadata từ tài liệu PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Dọn dẹp bản quét", + "desc": "Dọn dẹp bản quét và phát hiện văn bản từ hình ảnh trong PDF và thêm lại dưới dạng văn bản." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Trích xuất hình ảnh", + "desc": "Trích xuất tất cả hình ảnh từ PDF và lưu chúng vào tệp zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Ký", + "desc": "Thêm chữ ký vào PDF bằng cách vẽ, văn bản hoặc hình ảnh" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Làm phẳng", + "desc": "Xóa tất cả các phần tử tương tác và biểu mẫu từ PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Ký bằng chứng chỉ", + "desc": "Ký PDF bằng Chứng chỉ/Khóa (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Sửa chữa", + "desc": "Cố gắng sửa chữa PDF bị hỏng/lỗi" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Xóa trang trống", + "desc": "Phát hiện và xóa các trang trống khỏi tài liệu" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Xóa chú thích", + "desc": "Xóa tất cả các bình luận/chú thích khỏi PDF" + }, + "compare": { + "tags": "difference", + "title": "So sánh", + "desc": "So sánh và hiển thị sự khác biệt giữa 2 tài liệu PDF" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Xóa chữ ký chứng chỉ", + "desc": "Xóa chữ ký chứng chỉ khỏi PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Bố cục nhiều trang", + "desc": "Ghép nhiều trang của tài liệu PDF thành một trang duy nhất" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Điều chỉnh kích thước/tỷ lệ trang", + "desc": "Thay đổi kích thước/tỷ lệ của trang và/hoặc nội dung của nó." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Thêm số trang", + "desc": "Thêm số trang xuyên suốt tài liệu ở vị trí cố định" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Điều chỉnh màu sắc/tương phản", + "desc": "Điều chỉnh độ tương phản, độ bão hòa và độ sáng của PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Cắt PDF", + "desc": "Cắt PDF để giảm kích thước (giữ nguyên văn bản!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Tự động tách trang", + "desc": "Tự động tách PDF đã quét với mã QR tách trang quét vật lý" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Lấy TẤT CẢ thông tin về PDF", + "desc": "Lấy bất kỳ và tất cả thông tin có thể về PDF" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF sang một trang lớn", + "desc": "Ghép tất cả các trang PDF thành một trang lớn duy nhất" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Hiển thị Javascript", + "desc": "Tìm kiếm và hiển thị bất kỳ JS nào được chèn vào PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Remove image", + "desc": "Remove image from PDF to reduce file size" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Split PDF by Chapters", + "desc": "Split a PDF into multiple files based on its chapter structure." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Trích xuất trang", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Xóa", + "desc": "Xóa các trang không mong muốn khỏi tài liệu PDF của bạn." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Tự động chia theo kích thước/số lượng", + "desc": "Chia một tệp PDF thành nhiều tài liệu dựa trên kích thước, số trang hoặc số lượng tài liệu" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Thêm mật khẩu", + "desc": "Mã hóa tài liệu PDF của bạn bằng mật khẩu." + }, + "changePermissions": { + "title": "Thay đổi quyền", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Chồng lớp PDF lên trên PDF khác", + "title": "Chồng lớp PDF" + }, "imageToPDF": { "title": "Hình ảnh sang PDF", "desc": "Chuyển đổi hình ảnh (PNG, JPEG, GIF) sang PDF." @@ -355,18 +786,6 @@ "title": "PDF sang Hình ảnh", "desc": "Chuyển đổi PDF sang hình ảnh. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Sắp xếp", - "desc": "Xóa/Sắp xếp lại trang theo bất kỳ thứ tự nào" - }, - "addImage": { - "title": "Thêm hình ảnh", - "desc": "Thêm hình ảnh vào vị trí cố định trên PDF" - }, - "watermark": { - "title": "Thêm hình mờ", - "desc": "Thêm hình mờ tùy chỉnh vào tài liệu PDF của bạn." - }, "permissions": { "title": "Thay đổi quyền", "desc": "Thay đổi quyền của tài liệu PDF của bạn" @@ -375,38 +794,10 @@ "title": "Xóa", "desc": "Xóa các trang không mong muốn khỏi tài liệu PDF của bạn." }, - "addPassword": { - "title": "Thêm mật khẩu", - "desc": "Mã hóa tài liệu PDF của bạn bằng mật khẩu." - }, - "removePassword": { - "title": "Xóa mật khẩu", - "desc": "Xóa bảo vệ mật khẩu khỏi tài liệu PDF của bạn." - }, - "compress": { - "title": "Nén", - "desc": "Nén PDF để giảm kích thước tệp." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Thay đổi Metadata", - "desc": "Thay đổi/Xóa/Thêm metadata từ tài liệu PDF" - }, "fileToPDF": { "title": "Chuyển đổi tệp sang PDF", "desc": "Chuyển đổi hầu hết mọi tệp sang PDF (DOCX, PNG, XLS, PPT, TXT và nhiều hơn nữa)" }, - "ocr": { - "title": "OCR / Dọn dẹp bản quét", - "desc": "Dọn dẹp bản quét và phát hiện văn bản từ hình ảnh trong PDF và thêm lại dưới dạng văn bản." - }, - "extractImages": { - "title": "Trích xuất hình ảnh", - "desc": "Trích xuất tất cả hình ảnh từ PDF và lưu chúng vào tệp zip" - }, "pdfToPDFA": { "title": "PDF sang PDF/A", "desc": "Chuyển đổi PDF sang PDF/A để lưu trữ lâu dài" @@ -435,70 +826,14 @@ "title": "Phát hiện/Tách ảnh quét", "desc": "Tách nhiều ảnh từ trong một ảnh/PDF" }, - "sign": { - "title": "Ký", - "desc": "Thêm chữ ký vào PDF bằng cách vẽ, văn bản hoặc hình ảnh" - }, - "flatten": { - "title": "Làm phẳng", - "desc": "Xóa tất cả các phần tử tương tác và biểu mẫu từ PDF" - }, - "repair": { - "title": "Sửa chữa", - "desc": "Cố gắng sửa chữa PDF bị hỏng/lỗi" - }, - "removeBlanks": { - "title": "Xóa trang trống", - "desc": "Phát hiện và xóa các trang trống khỏi tài liệu" - }, - "removeAnnotations": { - "title": "Xóa chú thích", - "desc": "Xóa tất cả các bình luận/chú thích khỏi PDF" - }, - "compare": { - "title": "So sánh", - "desc": "So sánh và hiển thị sự khác biệt giữa 2 tài liệu PDF" - }, - "certSign": { - "title": "Ký bằng chứng chỉ", - "desc": "Ký PDF bằng Chứng chỉ/Khóa (PEM/P12)" - }, - "removeCertSign": { - "title": "Xóa chữ ký chứng chỉ", - "desc": "Xóa chữ ký chứng chỉ khỏi PDF" - }, - "pageLayout": { - "title": "Bố cục nhiều trang", - "desc": "Ghép nhiều trang của tài liệu PDF thành một trang duy nhất" - }, - "scalePages": { - "title": "Điều chỉnh kích thước/tỷ lệ trang", - "desc": "Thay đổi kích thước/tỷ lệ của trang và/hoặc nội dung của nó." - }, "pipeline": { "title": "Pipeline (Nâng cao)", "desc": "Chạy nhiều thao tác trên PDF bằng cách định nghĩa các tập lệnh pipeline" }, - "addPageNumbers": { - "title": "Thêm số trang", - "desc": "Thêm số trang xuyên suốt tài liệu ở vị trí cố định" - }, "auto-rename": { "title": "Tự động đổi tên tệp PDF", "desc": "Tự động đổi tên tệp PDF dựa trên tiêu đề được phát hiện" }, - "adjustContrast": { - "title": "Điều chỉnh màu sắc/tương phản", - "desc": "Điều chỉnh độ tương phản, độ bão hòa và độ sáng của PDF" - }, - "crop": { - "title": "Cắt PDF", - "desc": "Cắt PDF để giảm kích thước (giữ nguyên văn bản!)" - }, - "autoSplitPDF": { - "title": "Tự động tách trang", - "desc": "Tự động tách PDF đã quét với mã QR tách trang quét vật lý" - }, "sanitizePDF": { "title": "Làm sạch", "desc": "Xóa các tập lệnh và phần tử khác khỏi các tệp PDF" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Lấy TẤT CẢ thông tin về PDF", - "desc": "Lấy bất kỳ và tất cả thông tin có thể về PDF" - }, "pageExtracter": { "title": "Trích xuất (các) trang", "desc": "Trích xuất các trang được chọn từ PDF" }, - "pdfToSinglePage": { - "title": "PDF sang một trang lớn", - "desc": "Ghép tất cả các trang PDF thành một trang lớn duy nhất" - }, - "showJS": { - "title": "Hiển thị Javascript", - "desc": "Tìm kiếm và hiển thị bất kỳ JS nào được chèn vào PDF" - }, "autoRedact": { "title": "Tự động biên tập", "desc": "Tự động biên tập (Che đen) văn bản trong PDF dựa trên văn bản đầu vào" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF sang CSV", "desc": "Trích xuất bảng từ PDF chuyển đổi thành CSV" @@ -551,10 +870,6 @@ "title": "Tự động chia theo kích thước/số lượng", "desc": "Chia một tệp PDF thành nhiều tài liệu dựa trên kích thước, số trang hoặc số lượng tài liệu" }, - "overlay-pdfs": { - "title": "Chồng lớp PDF", - "desc": "Chồng lớp PDF lên trên PDF khác" - }, "split-by-sections": { "title": "Chia PDF theo phần", "desc": "Chia mỗi trang của PDF thành các phần nhỏ hơn theo chiều ngang và dọc" @@ -563,43 +878,17 @@ "title": "Thêm dấu vào PDF", "desc": "Thêm văn bản hoặc hình ảnh dấu tại vị trí cố định" }, - "removeImage": { - "title": "Remove image", - "desc": "Remove image from PDF to reduce file size" - }, - "splitByChapters": { - "title": "Split PDF by Chapters", - "desc": "Split a PDF into multiple files based on its chapter structure." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" }, - "convert": { - "title": "Chuyển đổi" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Trích xuất trang" - }, - "removePages": { - "title": "Xóa", - "desc": "Xóa các trang không mong muốn khỏi tài liệu PDF của bạn." - }, "removeImagePdf": { "title": "Remove image", "desc": "Remove image from PDF to reduce file size" }, - "autoSizeSplitPDF": { - "title": "Tự động chia theo kích thước/số lượng", - "desc": "Chia một tệp PDF thành nhiều tài liệu dựa trên kích thước, số trang hoặc số lượng tài liệu" - }, "adjust-contrast": { "title": "Điều chỉnh màu sắc/tương phản", "desc": "Điều chỉnh độ tương phản, độ bão hòa và độ sáng của PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" - }, - "changePermissions": { - "title": "Thay đổi quyền" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "xem,đọc,chú thích,văn bản,hình ảnh", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "ghép nối,Thao tác trang,Phía sau,phía máy chủ", "title": "Trộn", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Trộn", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Tên tệp", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Trộn nhiều PDF (2+)", "sortByName": "Sắp xếp theo tên", "sortByDate": "Sắp xếp theo ngày", - "removeCertSign": "Xóa chữ ký số trong tệp đã trộn?", - "submit": "Trộn", - "sortBy": { - "filename": "Tên tệp" - } + "removeCertSign": "Xóa chữ ký số trong tệp đã trộn?" }, "split": { - "tags": "Thao tác trang,chia,Nhiều trang,cắt,phía máy chủ", "title": "Chia PDF", "header": "Chia PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Nhập các trang cần chia:", "submit": "Chia", "steps": { + "chooseMethod": "Choose Method", "settings": "Cài đặt" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Kích thước tệp" + "name": "Kích thước tệp", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Kích thước tệp" + "label": "Kích thước tệp", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Thao tác trang,chia,Nhiều trang,cắt,phía máy chủ" }, "rotate": { - "tags": "phía máy chủ", "title": "Xoay PDF", + "submit": "Xoay", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "phía máy chủ", "header": "Xoay PDF", - "selectAngle": "Chọn góc xoay (theo bội số của 90 độ):", - "submit": "Xoay" + "selectAngle": "Chọn góc xoay (theo bội số của 90 độ):" + }, + "convert": { + "title": "Chuyển đổi", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Cài đặt", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Màu sắc", + "greyscale": "Thang độ xám", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Lấp đầy trang", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF chứa chữ ký số. Điều này sẽ bị xóa trong bước tiếp theo.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Thang độ xám", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "chuyển đổi,img,jpg,hình ảnh,ảnh" @@ -727,7 +1263,33 @@ "8": "Xóa trang cuối", "9": "Xóa trang đầu và cuối", "10": "Trộn lẻ-chẵn", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(ví dụ: 1,3,2 hoặc 4-8,2,10-12 hoặc 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Thêm hình ảnh", "submit": "Thêm hình ảnh" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Văn bản,lặp lại,nhãn,riêng,bản quyền,thương hiệu,img,jpg,hình ảnh,ảnh", "title": "Thêm hình mờ", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Thêm hình mờ", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Văn bản", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Font Size", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Văn bản", + "2": "Hình ảnh" + }, + "tags": "Văn bản,lặp lại,nhãn,riêng,bản quyền,thương hiệu,img,jpg,hình ảnh,ảnh", "header": "Thêm hình mờ", "customColor": "Màu văn bản tùy chỉnh", "selectText": { @@ -755,14 +1506,6 @@ "8": "Loại hình mờ:", "9": "Hình ảnh hình mờ:", "10": "Convert PDF to PDF-Image" - }, - "submit": "Thêm hình mờ", - "type": { - "1": "Văn bản", - "2": "Hình ảnh" - }, - "watermarkType": { - "text": "Văn bản" } }, "permissions": { @@ -787,50 +1530,201 @@ "removePages": { "tags": "Xóa trang,xóa trang", "title": "Xóa", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Xóa" }, - "addPassword": { - "tags": "bảo mật,an toàn", - "title": "Thêm mật khẩu", - "header": "Thêm mật khẩu (Mã hóa)", - "selectText": { - "1": "Chọn PDF để mã hóa", - "2": "Mật khẩu người dùng", - "3": "Độ dài khóa mã hóa", - "4": "Giá trị cao hơn thì mạnh hơn, nhưng giá trị thấp hơn có tính tương thích tốt hơn.", - "5": "Quyền cần đặt (Khuyến nghị sử dụng cùng với mật khẩu chủ sở hữu)", - "6": "Ngăn chặn lắp ráp tài liệu", - "7": "Ngăn chặn trích xuất nội dung", - "8": "Ngăn chặn trích xuất để truy cập", - "9": "Ngăn chặn điền vào biểu mẫu", - "10": "Ngăn chặn sửa đổi", - "11": "Ngăn chặn sửa đổi chú thích", - "12": "Ngăn chặn in", - "13": "Ngăn chặn in các định dạng khác nhau", - "14": "Mật khẩu chủ sở hữu", - "15": "Hạn chế những gì có thể làm với tài liệu sau khi mở (Không được hỗ trợ bởi tất cả các trình đọc)", - "16": "Hạn chế việc mở tài liệu" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Mã hóa", "tooltip": { - "permissions": { - "title": "Thay đổi quyền" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "bảo mật,Giải mã,an toàn,bỏ mật khẩu,xóa mật khẩu", - "title": "Xóa mật khẩu", - "header": "Xóa mật khẩu (Giải mã)", - "selectText": { - "1": "Chọn PDF để giải mã", - "2": "Mật khẩu" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Xóa", - "desc": "Xóa bảo vệ mật khẩu khỏi tài liệu PDF của bạn.", - "password": { - "stepTitle": "Xóa mật khẩu", - "label": "Mật khẩu hiện tại" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -840,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Tiêu đề,tác giả,ngày,tạo,thời gian,nhà xuất bản,nhà sản xuất,thống kê", - "title": "Thay đổi metadata", "header": "Thay đổi metadata", + "submit": "Thay đổi", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Tiêu đề,tác giả,ngày,tạo,thời gian,nhà xuất bản,nhà sản xuất,thống kê", "selectText": { "1": "Vui lòng chỉnh sửa các biến bạn muốn thay đổi", "2": "Xóa tất cả metadata", @@ -853,15 +1877,7 @@ "4": "Metadata khác:", "5": "Thêm mục metadata tùy chỉnh" }, - "author": "Tác giả:", - "creationDate": "Ngày tạo (yyyy/MM/dd HH:mm:ss):", - "creator": "Người tạo:", - "keywords": "Từ khóa:", - "modDate": "Ngày sửa đổi (yyyy/MM/dd HH:mm:ss):", - "producer": "Nhà sản xuất:", - "subject": "Chủ đề:", - "trapped": "Trapped:", - "submit": "Thay đổi" + "modDate": "Ngày sửa đổi (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "chuyển đổi,định dạng,tài liệu,hình ảnh,slide,văn bản,chuyển đổi,văn phòng,tài liệu,word,excel,powerpoint", @@ -875,6 +1891,7 @@ "ocr": { "tags": "nhận dạng,văn bản,hình ảnh,quét,đọc,nhận dạng,phát hiện,có thể chỉnh sửa", "title": "OCR / Làm sạch bản Scan", + "desc": "Dọn dẹp bản quét và phát hiện văn bản từ hình ảnh trong PDF và thêm lại dưới dạng văn bản.", "header": "Làm sạch các bản Scan / OCR (Nhận dạng ký tự quang học)", "selectText": { "1": "Chọn ngôn ngữ cần được phát hiện trong PDF (Những ngôn ngữ được liệt kê là những ngôn ngữ hiện đang được phát hiện):", @@ -893,23 +1910,89 @@ "help": "Vui lòng đọc tài liệu này về cách sử dụng cho các ngôn ngữ khác và/hoặc sử dụng không trong docker", "credit": "Dịch vụ này sử dụng qpdf và Tesseract cho OCR.", "submit": "Xử lý PDF với OCR", - "desc": "Dọn dẹp bản quét và phát hiện văn bản từ hình ảnh trong PDF và thêm lại dưới dạng văn bản.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Cài đặt", "ocrMode": { - "label": "Chế độ OCR" + "label": "Chế độ OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Ngôn ngữ" + "label": "Ngôn ngữ", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Chế độ OCR" + "title": "Chế độ OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Ngôn ngữ" + "title": "Ngôn ngữ", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -918,7 +2001,13 @@ "header": "Trích xuất hình ảnh", "selectText": "Chọn định dạng hình ảnh để chuyển đổi hình ảnh đã trích xuất", "allowDuplicates": "Save duplicate images", - "submit": "Trích xuất" + "submit": "Trích xuất", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "lưu trữ,dài hạn,tiêu chuẩn,chuyển đổi,lưu trữ,bảo quản", @@ -990,17 +2079,53 @@ }, "info": "Python is not installed. It is required to run." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "ủy quyền,ký tắt,chữ ký vẽ,ký văn bản,chữ ký hình ảnh", "title": "Ký", "header": "Ký PDF", "upload": "Tải lên hình ảnh", - "draw": "Vẽ chữ ký", - "text": "Nhập văn bản", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Xóa", "add": "Thêm", "saved": "Saved Signatures", "save": "Save Signature", + "applySignatures": "Apply Signatures", "personalSigs": "Personal Signatures", "sharedSigs": "Shared Signatures", "noSavedSigs": "No saved signatures found", @@ -1012,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "ủy quyền,ký tắt,chữ ký vẽ,ký văn bản,chữ ký hình ảnh" }, "flatten": { - "tags": "tĩnh,vô hiệu hóa,không tương tác,tinh giản", "title": "Làm phẳng", "header": "Làm phẳng PDF", "flattenOnlyForms": "Chỉ làm phẳng biểu mẫu", "submit": "Làm phẳng", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Cài đặt" }, "options": { - "flattenOnlyForms": "Chỉ làm phẳng biểu mẫu" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Chỉ làm phẳng biểu mẫu", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "tĩnh,vô hiệu hóa,không tương tác,tinh giản" }, "repair": { "tags": "sửa,khôi phục,sửa chữa,phục hồi", "title": "Sửa chữa", "header": "Sửa chữa PDF", - "submit": "Sửa chữa" + "submit": "Sửa chữa", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "dọn dẹp,tinh giản,không nội dung,sắp xếp", "title": "Xóa trang trắng", "header": "Xóa trang trắng", - "threshold": "Ngưỡng độ trắng của pixel:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Xóa trang trắng", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "dọn dẹp,tinh giản,không nội dung,sắp xếp", "thresholdDesc": "Ngưỡng để xác định mức độ trắng của một pixel để được coi là 'Trắng'. 0 = Đen, 255 trắng tinh khiết.", - "whitePercent": "Phần trăm trắng (%):", - "whitePercentDesc": "Phần trăm của trang phải là pixel 'trắng' để bị xóa", - "submit": "Xóa trang trắng" + "whitePercentDesc": "Phần trăm của trang phải là pixel 'trắng' để bị xóa" }, "removeAnnotations": { "tags": "bình luận,đánh dấu,ghi chú,đánh dấu,xóa", "title": "Xóa chú thích", "header": "Xóa chú thích", - "submit": "Xóa" + "submit": "Xóa", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "phân biệt,đối chiếu,thay đổi,phân tích", @@ -1079,6 +2341,142 @@ "certSign": { "tags": "xác thực,PEM,P12,chính thức,mã hóa", "title": "Ký bằng chứng chỉ", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Vị trí", + "logoTitle": "Logo", + "name": "Tên", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Nhập mật khẩu Keystore hoặc Private Key của bạn (Nếu có):", + "passwordOptional": "Leave empty if no password", + "reason": "Lý do", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo", "header": "Ký PDF bằng chứng chỉ của bạn (Đang trong quá trình phát triển)", "selectPDF": "Chọn tệp PDF để ký:", "jksNote": "Lưu ý: Nếu loại chứng chỉ của bạn không được liệt kê bên dưới, vui lòng chuyển đổi nó thành tệp Java Keystore (.jks) bằng công cụ dòng lệnh keytool. Sau đó, chọn tùy chọn tệp .jks bên dưới.", @@ -1086,13 +2484,7 @@ "selectCert": "Chọn tệp chứng chỉ của bạn (định dạng X.509, có thể là .pem hoặc .der):", "selectP12": "Chọn tệp Keystore PKCS#12 của bạn (.p12 hoặc .pfx) (Tùy chọn, nếu cung cấp, nó phải chứa khóa riêng và chứng chỉ của bạn):", "selectJKS": "Chọn tệp Java Keystore của bạn (.jks hoặc .keystore):", - "certType": "Loại chứng chỉ", - "password": "Nhập mật khẩu Keystore hoặc Private Key của bạn (Nếu có):", "showSig": "Hiển thị chữ ký", - "reason": "Lý do", - "location": "Vị trí", - "name": "Tên", - "showLogo": "Show Logo", "submit": "Ký PDF" }, "removeCertSign": { @@ -1100,7 +2492,18 @@ "title": "Xóa chữ ký chứng chỉ", "header": "Xóa chứng chỉ số khỏi PDF", "selectPDF": "Chọn một tệp PDF:", - "submit": "Xóa chữ ký" + "submit": "Xóa chữ ký", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "ghép,tổng hợp,xem đơn,sắp xếp", @@ -1108,16 +2511,157 @@ "header": "Bố cục nhiều trang", "pagesPerSheet": "Số trang trên một tờ:", "addBorder": "Thêm viền", - "submit": "Gửi" + "submit": "Gửi", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "điều chỉnh kích thước,sửa đổi,kích thước,điều chỉnh", "title": "Điều chỉnh tỷ lệ trang", "header": "Điều chỉnh tỷ lệ trang", "pageSize": "Kích thước của một trang trong tài liệu.", "keepPageSize": "Original Size", "scaleFactor": "Mức độ phóng to (cắt cúp) của một trang.", - "submit": "Gửi" + "submit": "Gửi", + "tags": "điều chỉnh kích thước,sửa đổi,kích thước,điều chỉnh" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "đánh số trang,gắn nhãn,sắp xếp,chỉ mục" @@ -1126,16 +2670,83 @@ "tags": "tự động phát hiện,dựa trên tiêu đề,sắp xếp,đổi nhãn", "title": "Tự động đổi tên", "header": "Tự động đổi tên PDF", - "submit": "Tự động đổi tên" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Tự động đổi tên", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "hiệu chỉnh màu sắc,điều chỉnh,sửa đổi,nâng cao" }, "crop": { - "tags": "cắt tỉa,thu nhỏ,chỉnh sửa,định hình", "title": "Cắt cúp", "header": "Cắt cúp PDF", - "submit": "Gửi" + "submit": "Gửi", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "cắt tỉa,thu nhỏ,chỉnh sửa,định hình" }, "autoSplitPDF": { "tags": "Dựa trên QR,tách,phân đoạn quét,sắp xếp", @@ -1218,24 +2829,124 @@ "downloadJS": "Tải xuống Javascript", "submit": "Hiển thị" }, - "autoRedact": { - "tags": "Biên tập,Ẩn,che đen,đen,bút đánh dấu,ẩn", - "title": "Tự động biên tập", - "header": "Tự động biên tập", - "colorLabel": "Màu sắc", - "textsToRedactLabel": "Văn bản cần biên tập (mỗi dòng một từ)", - "textsToRedactPlaceholder": "ví dụ: \\nMật \\nTối mật", - "useRegexLabel": "Sử dụng Regex", - "wholeWordSearchLabel": "Tìm kiếm toàn bộ từ", - "customPaddingLabel": "Đệm thêm tùy chỉnh", - "convertPDFToImageLabel": "Chuyển đổi PDF thành PDF-Hình ảnh (Dùng để xóa văn bản phía sau ô)", - "submitButton": "Gửi" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Nâng cao" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Thêm", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pages", + "placeholder": "(ví dụ: 1,2,8 hoặc 4,7,12-16 hoặc 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1261,20 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Nâng cao" - }, - "wordsToRedact": { - "add": "Thêm" - } - }, - "manual": { - "pageRedactionNumbers": { - "placeholder": "(ví dụ: 1,2,8 hoặc 4,7,12-16 hoặc 2n-1)" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Trích xuất bảng,trích xuất,chuyển đổi" @@ -1285,11 +2983,15 @@ "overlay-pdfs": { "tags": "Chồng lớp", "header": "Chồng lớp tệp PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Chọn tệp PDF nền" }, "overlayFiles": { - "label": "Chọn các tệp PDF chồng lớp" + "label": "Chọn các tệp PDF chồng lớp", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Chọn chế độ chồng lớp", @@ -1299,14 +3001,53 @@ }, "counts": { "label": "Số lần chồng lớp (cho chế độ lặp lại cố định)", - "placeholder": "Nhập số lần chồng lớp, phân cách bằng dấu phẩy (ví dụ: 2,3,1)" + "placeholder": "Nhập số lần chồng lớp, phân cách bằng dấu phẩy (ví dụ: 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Chọn vị trí chồng lớp", "foreground": "Nền trước", "background": "Nền sau" }, - "submit": "Gửi" + "submit": "Gửi", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Chia phần,Phân chia,Tùy chỉnh", @@ -1327,6 +3068,7 @@ "tags": "Dấu,Thêm hình ảnh,căn giữa hình ảnh,Hình mờ,PDF,Nhúng,Tùy chỉnh", "header": "Đóng dấu PDF", "title": "Đóng dấu PDF", + "stampSetup": "Stamp Setup", "stampType": "Loại dấu", "stampText": "Văn bản dấu", "stampImage": "Hình ảnh dấu", @@ -1339,7 +3081,19 @@ "overrideY": "Ghi đè tọa độ Y", "customMargin": "Lề tùy chỉnh", "customColor": "Màu văn bản tùy chỉnh", - "submit": "Gửi" + "submit": "Gửi", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Remove Image,Page operations,Back end,server side" @@ -1357,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1384,40 +3139,122 @@ "version": "Phiên bản", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Replace-Invert Color PDF", - "selectText": { - "1": "Replace or Invert color Options", - "2": "Default(Default high contrast colors)", - "3": "Custom(Customized colors)", - "4": "Full-Invert(Invert all colors)", - "5": "High contrast color options", - "6": "white text on black background", - "7": "Black text on white background", - "8": "Yellow text on black background", - "9": "Green text on black background", - "10": "Choose text Color", - "11": "Choose background Color" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Replace" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Replace Color,Page operations,Back end,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Đăng nhập", "header": "Đăng nhập", "signin": "Đăng nhập", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Ghi nhớ tôi", "invalid": "Tên đăng nhập hoặc mật khẩu không hợp lệ.", "locked": "Tài khoản của bạn đã bị khóa.", @@ -1436,12 +3273,83 @@ "alreadyLoggedIn": "You are already logged in to", "alreadyLoggedIn2": "devices. Please log out of the devices and try again.", "toManySessions": "You have too many active sessions", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF thành một trang", "header": "PDF thành một trang", - "submit": "Chuyển đổi thành một trang" + "submit": "Chuyển đổi thành một trang", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Trích xuất trang", @@ -1465,18 +3373,59 @@ "adjustContrast": { "title": "Điều chỉnh độ tương phản", "header": "Điều chỉnh độ tương phản", + "basic": "Basic Adjustments", "contrast": "Độ tương phản:", "brightness": "Độ sáng:", "saturation": "Độ bão hòa:", - "download": "Tải xuống" + "download": "Tải xuống", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Nén", + "desc": "Compress PDFs to reduce their file size.", "header": "Nén PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Kích thước tệp" + }, "credit": "Dịch vụ này sử dụng qpdf để Nén/Tối ưu hóa PDF.", "grayscale": { "label": "Áp dụng thang độ xám để nén" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1486,10 +3435,7 @@ "4": "Chế độ tự động - Tự động điều chỉnh chất lượng để đạt được kích thước PDF chính xác", "5": "Kích thước PDF mong muốn (ví dụ: 25MB, 10.8MB, 25KB)" }, - "submit": "Nén", - "method": { - "filesize": "Kích thước tệp" - } + "submit": "Nén" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1590,7 +3536,13 @@ "title": "Remove image", "header": "Remove image", "removeImage": "Remove image", - "submit": "Remove image" + "submit": "Remove image", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Split PDF by Chapters", @@ -1624,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1659,42 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Tải xuống", - "convert": { - "title": "Chuyển đổi", - "settings": "Cài đặt", - "color": "Màu sắc", - "greyscale": "Thang độ xám", - "fillPage": "Lấp đầy trang", - "pdfaDigitalSignatureWarning": "PDF chứa chữ ký số. Điều này sẽ bị xóa trong bước tiếp theo.", - "grayscale": "Thang độ xám" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Ký" + "read": "Read", + "sign": "Ký", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, + "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Loading...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Tên", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Phiên bản", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Tải xuống", - "delete": "Xóa" + "delete": "Xóa", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Làm sạch PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Cài đặt" + "files": "Files", + "settings": "Cài đặt", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Thêm mật khẩu", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Mã hóa", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Thay đổi quyền", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "bảo mật,an toàn", + "header": "Thêm mật khẩu (Mã hóa)", + "selectText": { + "1": "Chọn PDF để mã hóa", + "2": "Mật khẩu người dùng", + "3": "Độ dài khóa mã hóa", + "4": "Giá trị cao hơn thì mạnh hơn, nhưng giá trị thấp hơn có tính tương thích tốt hơn.", + "5": "Quyền cần đặt (Khuyến nghị sử dụng cùng với mật khẩu chủ sở hữu)", + "6": "Ngăn chặn lắp ráp tài liệu", + "7": "Ngăn chặn trích xuất nội dung", + "8": "Ngăn chặn trích xuất để truy cập", + "9": "Ngăn chặn điền vào biểu mẫu", + "10": "Ngăn chặn sửa đổi", + "11": "Ngăn chặn sửa đổi chú thích", + "12": "Ngăn chặn in", + "13": "Ngăn chặn in các định dạng khác nhau", + "14": "Mật khẩu chủ sở hữu", + "15": "Hạn chế những gì có thể làm với tài liệu sau khi mở (Không được hỗ trợ bởi tất cả các trình đọc)", + "16": "Hạn chế việc mở tài liệu" } }, "changePermissions": { "title": "Thay đổi quyền", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Thay đổi quyền", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Ngăn chặn lắp ráp tài liệu" @@ -1721,10 +4580,784 @@ "label": "Ngăn chặn in các định dạng khác nhau" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Thay đổi quyền" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Xóa mật khẩu", + "desc": "Xóa bảo vệ mật khẩu khỏi tài liệu PDF của bạn.", + "tags": "bảo mật,Giải mã,an toàn,bỏ mật khẩu,xóa mật khẩu", + "password": { + "stepTitle": "Xóa mật khẩu", + "label": "Mật khẩu hiện tại", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Xóa", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Xóa mật khẩu (Giải mã)", + "selectText": { + "1": "Chọn PDF để giải mã", + "2": "Mật khẩu" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or Invert color Options", + "2": "Default(Default high contrast colors)", + "3": "Custom(Customized colors)", + "4": "Full-Invert(Invert all colors)", + "5": "High contrast color options", + "6": "white text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color", + "header": "Replace-Invert Color PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Biên tập,Ẩn,che đen,đen,bút đánh dấu,ẩn", + "title": "Tự động biên tập", + "header": "Tự động biên tập", + "colorLabel": "Màu sắc", + "textsToRedactLabel": "Văn bản cần biên tập (mỗi dòng một từ)", + "textsToRedactPlaceholder": "ví dụ: \\nMật \\nTối mật", + "useRegexLabel": "Sử dụng Regex", + "wholeWordSearchLabel": "Tìm kiếm toàn bộ từ", + "customPaddingLabel": "Đệm thêm tùy chỉnh", + "convertPDFToImageLabel": "Chuyển đổi PDF thành PDF-Hình ảnh (Dùng để xóa văn bản phía sau ô)", + "submitButton": "Gửi" + }, + "replaceColorPdf": { + "tags": "Replace Color,Page operations,Back end,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/zh-BO/translation.json b/frontend/public/locales/zh-BO/translation.json index b98ba42d9..28b04e4db 100644 --- a/frontend/public/locales/zh-BO/translation.json +++ b/frontend/public/locales/zh-BO/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "རང་སྒྲིག་ཡི་གེ", "numberPagesDesc": "ཨང་གྲངས་རྒྱག་རྒྱུའི་ཤོག་ངོས། སྔོན་སྒྲིག་ནི་'ཚང་མ་'ཡིན། 1-5 ཡང་ན་ 2,5,9 སོགས་ཀྱང་ངོས་ལེན་བྱེད།", "customNumberDesc": "སྔོན་སྒྲིག་ནི་ {n} ཡིན། 'ཤོག་ངོས་ {n} / {total}', 'ཡི་གེ-{n}', '{filename}-{n}' སོགས་ཀྱང་ངོས་ལེན་བྱེད།", - "submit": "ཤོག་གྲངས་སྣོན་པ།" + "submit": "ཤོག་གྲངས་སྣོན་པ།", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "ཤོག་ངོས་འདེམས་སྒྲུག(ཤོག་གྲངས་ཀྱི་ཐོ་གཞུང་ 1,5,6 འམ་རྩིས་རྒྱག་བྱེད་ཐབས་ 2n+1 ལྟ་བུ་འཇུག་རོགས།)", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "PDF འདེམས་རོགས།", "multiPdfPrompt": "PDF གཉིས་ཡན་འདེམས་རོགས།", "multiPdfDropPrompt": "དགོས་མཁོ་འདི་ PDF ཡིག་ཆ་ཚང་མ་འདེམས་པའམ་འཐེན་རོགས།", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "ཉེན་བཅོས། བྱ་རིམ་འདི་ཡིག་ཆའི་ཆེ་ཆུང་ལ་གཞིགས་ནས་སྐར་མ་གཅིག་བར་འགོར་སྲིད།", "pageOrderPrompt": "ཤོག་ངོས་གོ་རིམ་རང་སྒྲིག(ཤོག་གྲངས་ཀྱི་ཐོ་གཞུང་ངམ་རྩིས་རྒྱག་བྱེད་ཐབས་ 2n+1 ལྟ་བུ་འཇུག་རོགས།)", - "pageSelectionPrompt": "ཤོག་ངོས་འདེམས་སྒྲུག(ཤོག་གྲངས་ཀྱི་ཐོ་གཞུང་ 1,5,6 འམ་རྩིས་རྒྱག་བྱེད་ཐབས་ 2n+1 ལྟ་བུ་འཇུག་རོགས།)", "goToPage": "འགྲོ་བ།", "true": "བདེན་པ།", "false": "རྫུན་མ།", "unknown": "མི་ཤེས་པ།", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "ཉར་ཚགས།", "saveToBrowser": "བཤར་ཆེ་ནང་ཉར་ཚགས།", + "download": "Download", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "སྒོ་རིག།", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "ཡིག་ཆབདམས་ཟིན།", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "དགའ་མོས་གང་ཡང་སྣོན་མེད།", "downloadComplete": "ཕབ་ལེན་ལེགས་གྲུབ།", "bored": "སྒུག་སྡོད་སྐྱིད་པོ་མི་འདུག་གམ།", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF ཡིག་ཆར་གསང་ཚིག་བཀོད་ཡོད་པ་དང་། གསང་ཚིག་མ་བཀོད་པའམ་ནོར་འདུག", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "ནོར་འཁྲུལ།", + "dismissAllErrors": "Dismiss All Errors", "sorry": "དཀའ་ངལ་ལ་དགོངས་དག", "needHelp": "རོགས་རམ་དགོས་སམ། / དཀའ་ངལ་ཞིག་རྙེད་སོང་ངམ།", "contactTip": "གལ་སྲིད་ད་དུང་དཀའ་ངལ་འཕྲད་བཞིན་ཡོད་ན། རོགས་རམ་ཞུ་བར་ང་ཚོར་འབྲེལ་གཏུག་བྱེད་རོགས། ཁྱེད་ཀྱིས་ང་ཚོའི་ GitHub ཤོག་ངོས་སུ་སྙན་ཞུ་འབུལ་བའམ་ Discord བརྒྱུད་ནས་འབྲེལ་བ་གནང་ཆོག", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - སྙན་ཞུ་འབུལ་བ།", "discordSubmit": "Discord - རྒྱབ་སྐྱོར་སྙན་ཞུ་འབུལ་བ།" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "སུབ་པ།", "username": "སྤྱོད་མཁན་མིང་།", "password": "གསང་ཚིག།", @@ -82,6 +169,7 @@ "green": "ལྗང་ཁུ།", "blue": "སྔོན་པོ", "custom": "མཚན་ཉིད་རང་སྒྲིག...", + "comingSoon": "Coming soon", "WorkInProgess": "ལས་ཀ་བྱེད་བཞིན་པ། ནོར་འཁྲུལ་ཡོང་སྲིད། དཀའ་ངལ་ཡོད་ཚེ་སྙན་སེང་གནང་རོགས།", "poweredBy": "མཁོ་སྲོད་བྱེད་མཁན།", "yes": "ཡིན།", @@ -115,12 +203,14 @@ "page": "ཤོག་ངོས།", "pages": "ཤོག་ངོས་ཁག", "loading": "འཇུག་བཞིན་པ...", + "review": "Review", "addToDoc": "ཡིག་ཆར་སྣོན།", "reset": "བསྐྱར་སྒྲིག", "apply": "ཉེར་སྤྱོད།", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "གསང་དོན་སྲིད་བྱུས།", + "iAgreeToThe": "I agree to all of the", "terms": "བེད་སྤྱོད་ཆ་རྐྱེན།", "accessibility": "བེད་སྤྱོད་ནུས་པ།", "cookie": "Cookie སྲིད་བྱུས།", @@ -160,6 +250,7 @@ "title": "ཁྱེད་ཀྱིས་ Stirling PDF ལེགས་སུ་གཏོང་འདོད་དམ།", "paragraph1": "Stirling PDF ལ་ཐོན་རྫས་ལེགས་སུ་གཏོང་བར་རོགས་རམ་བྱེད་པའི་གདམ་ག་ཡོད་པའི་དཔྱད་ཞིབ་ཡོད། ང་ཚོས་སྒེར་གྱི་ཆ་འཕྲིན་དང་ཡིག་ཆའི་ནང་དོན་གང་ཡང་རྗེས་འདེད་མི་བྱེད།", "paragraph2": "Stirling-PDF འཕེལ་རྒྱས་དང་ང་ཚོའི་སྤྱོད་མཁན་ལེགས་པོར་རྟོགས་པར་རོགས་རམ་བྱེད་པའི་ཆེད་དུ་དཔྱད་ཞིབ་སྤྱོད་འགོ་འཛུགས་རོགས།", + "learnMore": "Learn more", "enable": "དཔྱད་ཞིབ་སྤྱོད་འགོ་འཛུགས།", "disable": "དཔྱད་ཞིབ་སྤྱོད་མཚམས་འཇོག", "settings": "དཔྱད་ཞིབ་ཀྱི་སྒྲིག་འགོད་ config/settings.yml ཡིག་ཆའི་ནང་བསྒྱུར་བཅོས་བྱེད་ཆོག" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "ནང་འཇུག་གི་ནང་དོན་ཉར་ཚགས།", "help": "སྔོན་མ་བེད་སྤྱད་པའི་ནང་འཇུག་གི་ནང་དོན་མ་འོངས་པར་བེད་སྤྱོད་ཆེད་ཉར་ཚགས་བྱེད།" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "གཞི་གྲངས་མཛོད་ནང་འདྲེན་/ཕྱིར་འདྲེན།", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF ལག་ཆ་མང་པོ།", "desc": "སྡེབ་སྦྱོར། འཁོར་སྐྱོད། བསྐྱར་སྒྲིག ཁ་གྱེས། དང་ཤོག་ངོས་སུབ་པ།" }, "merge": { + "tags": "combine,join,unite", "title": "སྡེབ་སྦྱོར།", "desc": "PDF མང་པོ་གཅིག་ཏུ་སྡེབ་སྦྱོར་བྱེད་པ།" }, "split": { + "tags": "divide,separate,break", "title": "ཁ་གྱེས།", "desc": "PDF ཡིག་ཆ་མང་པོར་བགོ་བ།" }, "rotate": { + "tags": "turn,flip,orient", "title": "འཁོར་སྐྱོད།", "desc": "PDF ལས་སླ་པོའི་ངང་འཁོར་སྐྱོད་བྱེད་པ།" }, + "convert": { + "tags": "transform,change", + "title": "Convert", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "གོ་སྒྲིག", + "desc": "ཤོག་ངོས་རྣམས་གོ་རིམ་གང་རུང་དུ་སུབ་པའམ་བསྐྱར་སྒྲིག་བྱེད་པ།" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "པར་རིས་སྣོན་པ།", + "desc": "PDF ནང་གནས་ས་ངེས་ཅན་ཞིག་ཏུ་པར་རིས་སྣོན་པ།" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "ཆུ་རྟགས་སྣོན་པ།", + "desc": "PDF ཡིག་ཆར་རང་སྒྲིག་གི་ཆུ་རྟགས་སྣོན་པ།" + }, + "removePassword": { + "tags": "unlock", + "title": "གསང་ཚིག་སུབ་པ།", + "desc": "PDF ཡིག་ཆ་ནས་གསང་ཚིག་སྲུང་སྐྱོབ་སུབ་པ།" + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "སྡུད་སྒྲིལ།", + "desc": "ཡིག་ཆའི་ཆེ་ཆུང་ཆུང་དུ་གཏོང་ཆེད་ PDF སྡུད་སྒྲིལ་བྱེད་པ།" + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "གནས་ཆ་སྒྱུར་བཅོས།", + "desc": "PDF ཡིག་ཆ་ནས་གནས་ཆ་བསྒྱུར་བའམ་སུབ་པ།སྣོན་པ།" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / བཤེར་འབེབས་གཙང་སེལ།", + "desc": "བཤེར་འབེབས་གཙང་སེལ་དང་ PDF ནང་གི་པར་རིས་ནས་ཡི་གེ་ངོས་འཛིན་བྱས་ཏེ་ཡི་གེའི་རྣམ་པར་བསྐྱར་སྣོན་བྱེད་པ།" + }, + "extractImages": { + "tags": "pull,save,export", + "title": "པར་རིས་ཕྱིར་འདོན།", + "desc": "PDF ནས་པར་རིས་ཚང་མ་ཕྱིར་བཏོན་ནས་ zip ནང་ཉར་ཚགས་བྱེད་པ།" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "མིང་རྟགས།", + "desc": "རི་མོ། ཡི་གེ། པར་རིས་བཅས་ཀྱི་སྒོ་ནས་ PDF ལ་མིང་རྟགས་སྣོན་པ།" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "སྙོམས་པ།", + "desc": "PDF ནས་སྤྱོད་སྒོ་ཅན་གྱི་ཆ་ཤས་དང་འགེངས་ཤོག་ཚང་མ་སུབ་པ།" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "ལག་ཁྱེར་མིང་རྟགས།", + "desc": "ལག་ཁྱེར་/ལྡེ་མིག་ (PEM/P12) གྱིས་ PDF ལ་མིང་རྟགས་རྒྱག་པ།" + }, + "repair": { + "tags": "fix,restore", + "title": "བཟོ་བཅོས།", + "desc": "སྐྱོན་ཤོར་བའམ་གཏོར་བཤིག་ཐེབས་པའི་ PDF བཟོ་བཅོས་བྱེད་ཐབས་བྱེད་པ།" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "སྟོང་ཤོག་སུབ་པ།", + "desc": "PDF ནང་གི་སྟོང་ཤོག་རང་འགུལ་ངོས་འཛིན་དང་སུབ་པ།" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "མཆན་འགྲེལ་སུབ་པ།", + "desc": "PDF ནང་གི་མཆན་འགྲེལ་ཚང་མ་སུབ་པ།" + }, + "compare": { + "tags": "difference", + "title": "PDF བསྡུར་བ།", + "desc": "PDF ཡིག་ཆ་གཉིས་ཀྱི་ཁྱད་པར་བསྡུར་བ།" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "ལག་ཁྱེར་མིང་རྟགས་སུབ་པ།", + "desc": "PDF ནས་ལག་ཁྱེར་མིང་རྟགས་སུབ་པ།" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "ཤོག་ངོས་མང་པོའི་བཀོད་པ།", + "desc": "PDF ཡིག་ཆའི་ཤོག་ངོས་མང་པོ་ཤོག་ངོས་གཅིག་ཏུ་སྡེབ་སྦྱོར་བྱེད་པ།" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "ཤོག་ངོས་ཆེ་ཆུང་/ཚད་སྒྲིག་པ།", + "desc": "ཤོག་ངོས་དང་/ཡང་ན་དེའི་ནང་དོན་གྱི་ཆེ་ཆུང་/ཚད་བསྒྱུར་བ།" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "ཤོག་གྲངས་སྣོན་པ།", + "desc": "ཡིག་ཆའི་ནང་གནས་ས་ངེས་ཅན་དུ་ཤོག་གྲངས་སྣོན་པ།" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "ཚོས་གཞི་/འོད་ཁྱད་སྙོམ་སྒྲིག", + "desc": "PDF ཡི་འོད་ཁྱད། ཚོས་ཟིལ། དང་གསལ་ཚད་སྙོམ་སྒྲིག་བྱེད་པ།" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF གཏུབ་གཅོད།", + "desc": "ཆེ་ཆུང་ཆུང་དུ་གཏོང་ཆེད་ PDF གཏུབ་གཅོད་བྱེད་པ། (ཡི་གེ་རྣམས་སྲུང་སྐྱོབ་བྱེད་ཐུབ།)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "ཤོག་ངོས་རང་འགུལ་ཁ་གྱེས།", + "desc": "བཤེར་འབེབས་བྱས་པའི་ PDF ནང་གི་དངོས་ཡོད་བཤེར་འབེབས་ཤོག་ངོས་ཁ་གྱེས་ QR Code བེད་སྤྱོད་བྱས་ནས་རང་འགུལ་ཁ་གྱེས་བྱེད་པ།" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "PDF ཡི་གནས་ཚུལ་ཆ་ཚང་ལེན་པ།", + "desc": "PDF ཡི་གནས་ཚུལ་ཡོད་ཚད་ལེན་པ།" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF ནས་ཤོག་ངོས་ཆེན་པོ་གཅིག་ལ།", + "desc": "PDF ཡི་ཤོག་ངོས་ཚང་མ་ཤོག་ངོས་ཆེན་པོ་གཅིག་ཏུ་སྡེབ་སྦྱོར་བྱེད་པ།" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Javascript སྟོན་པ།", + "desc": "PDF ནང་དུ་བཅུག་པའི་ JS གང་ཡོད་འཚོལ་ཞིབ་དང་མངོན་སྟོན་བྱེད་པ།" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "ལག་བཟོས་སྒྲིབ་སྲུང་།", + "desc": "འདེམས་སྒྲུག་བྱས་པའི་ཡི་གེ། བྲིས་པའི་དབྱིབས། དང་/ཡང་ན་འདེམས་སྒྲུག་བྱས་པའི་ཤོག་ངོས་གཞིར་བཟུང་ནས་ PDF སྒྲིབ་སྲུང་བྱེད་པ།" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "པར་རིས་སུབ་པ།", + "desc": "ཡིག་ཆའི་ཆེ་ཆུང་ཆུང་དུ་གཏོང་ཆེད་ PDF ནས་པར་རིས་སུབ་པ།" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "ལེའུ་ལྟར་ PDF ཁ་གྱེས།", + "desc": "PDF ཡི་ལེའུའི་སྒྲོམ་གཞི་གཞིར་བཟུང་ནས་ཡིག་ཆ་མང་པོར་ཁ་གྱེས་བྱེད་པ།" + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "PDF མིང་རྟགས་ར་སྤྲོད།", + "desc": "PDF ཡིག་ཆའི་ནང་གི་ཨང་ཀིའི་མིང་རྟགས་དང་ལག་ཁྱེར་ར་སྤྲོད་བྱེད་པ།" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extract Pages", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Remove Pages", + "desc": "Remove specific pages from a PDF document" + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Auto Split by Size/Count", + "desc": "Automatically split PDFs by file size or page count" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "གསང་ཚིག་སྣོན་པ།", + "desc": "PDF ཡིག་ཆར་གསང་ཚིག་གིས་གསང་སྡོམ་བྱེད་པ།" + }, + "changePermissions": { + "title": "Change Permissions", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "PDF གཞན་ཞིག་གི་སྟེང་དུ་ PDF བརྩེགས་པ།", + "title": "PDF སྟེང་བརྩེགས།" + }, "imageToPDF": { "title": "པར་རིས་ནས་ PDF ལ།", "desc": "པར་རིས་ (PNG, JPEG, GIF) ནས་ PDF ལ་བསྒྱུར་བ།" @@ -355,18 +786,6 @@ "title": "PDF ནས་པར་རིས་ལ།", "desc": "PDF ནས་པར་རིས་ (PNG, JPEG, GIF) ལ་བསྒྱུར་བ།" }, - "pdfOrganiser": { - "title": "གོ་སྒྲིག", - "desc": "ཤོག་ངོས་རྣམས་གོ་རིམ་གང་རུང་དུ་སུབ་པའམ་བསྐྱར་སྒྲིག་བྱེད་པ།" - }, - "addImage": { - "title": "པར་རིས་སྣོན་པ།", - "desc": "PDF ནང་གནས་ས་ངེས་ཅན་ཞིག་ཏུ་པར་རིས་སྣོན་པ།" - }, - "watermark": { - "title": "ཆུ་རྟགས་སྣོན་པ།", - "desc": "PDF ཡིག་ཆར་རང་སྒྲིག་གི་ཆུ་རྟགས་སྣོན་པ།" - }, "permissions": { "title": "ཆོག་མཆན་བསྒྱུར་བ།", "desc": "PDF ཡིག་ཆའི་ཆོག་མཆན་བསྒྱུར་བ།" @@ -375,38 +794,10 @@ "title": "སུབ་པ།", "desc": "PDF ཡིག་ཆ་ནས་མི་དགོས་པའི་ཤོག་ངོས་རྣམས་སུབ་པ།" }, - "addPassword": { - "title": "གསང་ཚིག་སྣོན་པ།", - "desc": "PDF ཡིག་ཆར་གསང་ཚིག་གིས་གསང་སྡོམ་བྱེད་པ།" - }, - "removePassword": { - "title": "གསང་ཚིག་སུབ་པ།", - "desc": "PDF ཡིག་ཆ་ནས་གསང་ཚིག་སྲུང་སྐྱོབ་སུབ་པ།" - }, - "compress": { - "title": "སྡུད་སྒྲིལ།", - "desc": "ཡིག་ཆའི་ཆེ་ཆུང་ཆུང་དུ་གཏོང་ཆེད་ PDF སྡུད་སྒྲིལ་བྱེད་པ།" - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "གནས་ཆ་སྒྱུར་བཅོས།", - "desc": "PDF ཡིག་ཆ་ནས་གནས་ཆ་བསྒྱུར་བའམ་སུབ་པ།སྣོན་པ།" - }, "fileToPDF": { "title": "ཡིག་ཆ་ནས་ PDF ལ་བསྒྱུར་བ།", "desc": "ཡིག་ཆ་ཕལ་ཆེ་བ་ PDF ལ་བསྒྱུར་ཐུབ། (DOCX, PNG, XLS, PPT, TXT སོགས།)" }, - "ocr": { - "title": "OCR / བཤེར་འབེབས་གཙང་སེལ།", - "desc": "བཤེར་འབེབས་གཙང་སེལ་དང་ PDF ནང་གི་པར་རིས་ནས་ཡི་གེ་ངོས་འཛིན་བྱས་ཏེ་ཡི་གེའི་རྣམ་པར་བསྐྱར་སྣོན་བྱེད་པ།" - }, - "extractImages": { - "title": "པར་རིས་ཕྱིར་འདོན།", - "desc": "PDF ནས་པར་རིས་ཚང་མ་ཕྱིར་བཏོན་ནས་ zip ནང་ཉར་ཚགས་བྱེད་པ།" - }, "pdfToPDFA": { "title": "PDF ནས་ PDF/A ལ།", "desc": "PDF ནས་དུས་ཡུན་རིང་པོའི་ཉར་ཚགས་ཆེད་ PDF/A ལ་བསྒྱུར་བ།" @@ -435,70 +826,14 @@ "title": "བཤེར་པར་ངོས་འཛིན་/ཁ་གྱེས།", "desc": "པར་རིས་/PDF ནང་གི་པར་མང་པོ་ཁ་གྱེས་བྱེད་པ།" }, - "sign": { - "title": "མིང་རྟགས།", - "desc": "རི་མོ། ཡི་གེ། པར་རིས་བཅས་ཀྱི་སྒོ་ནས་ PDF ལ་མིང་རྟགས་སྣོན་པ།" - }, - "flatten": { - "title": "སྙོམས་པ།", - "desc": "PDF ནས་སྤྱོད་སྒོ་ཅན་གྱི་ཆ་ཤས་དང་འགེངས་ཤོག་ཚང་མ་སུབ་པ།" - }, - "repair": { - "title": "བཟོ་བཅོས།", - "desc": "སྐྱོན་ཤོར་བའམ་གཏོར་བཤིག་ཐེབས་པའི་ PDF བཟོ་བཅོས་བྱེད་ཐབས་བྱེད་པ།" - }, - "removeBlanks": { - "title": "སྟོང་ཤོག་སུབ་པ།", - "desc": "PDF ནང་གི་སྟོང་ཤོག་རང་འགུལ་ངོས་འཛིན་དང་སུབ་པ།" - }, - "removeAnnotations": { - "title": "མཆན་འགྲེལ་སུབ་པ།", - "desc": "PDF ནང་གི་མཆན་འགྲེལ་ཚང་མ་སུབ་པ།" - }, - "compare": { - "title": "PDF བསྡུར་བ།", - "desc": "PDF ཡིག་ཆ་གཉིས་ཀྱི་ཁྱད་པར་བསྡུར་བ།" - }, - "certSign": { - "title": "ལག་ཁྱེར་མིང་རྟགས།", - "desc": "ལག་ཁྱེར་/ལྡེ་མིག་ (PEM/P12) གྱིས་ PDF ལ་མིང་རྟགས་རྒྱག་པ།" - }, - "removeCertSign": { - "title": "ལག་ཁྱེར་མིང་རྟགས་སུབ་པ།", - "desc": "PDF ནས་ལག་ཁྱེར་མིང་རྟགས་སུབ་པ།" - }, - "pageLayout": { - "title": "ཤོག་ངོས་མང་པོའི་བཀོད་པ།", - "desc": "PDF ཡིག་ཆའི་ཤོག་ངོས་མང་པོ་ཤོག་ངོས་གཅིག་ཏུ་སྡེབ་སྦྱོར་བྱེད་པ།" - }, - "scalePages": { - "title": "ཤོག་ངོས་ཆེ་ཆུང་/ཚད་སྒྲིག་པ།", - "desc": "ཤོག་ངོས་དང་/ཡང་ན་དེའི་ནང་དོན་གྱི་ཆེ་ཆུང་/ཚད་བསྒྱུར་བ།" - }, "pipeline": { "title": "བརྒྱུད་རིམ།", "desc": "བརྒྱུད་རིམ་འཁྲབ་གཞུང་བཟོས་ནས་ PDF ལ་བྱ་བ་མང་པོ་འཁོར་སྐྱོད་བྱེད་པ།" }, - "addPageNumbers": { - "title": "ཤོག་གྲངས་སྣོན་པ།", - "desc": "ཡིག་ཆའི་ནང་གནས་ས་ངེས་ཅན་དུ་ཤོག་གྲངས་སྣོན་པ།" - }, "auto-rename": { "title": "PDF ཡིག་ཆའི་མིང་རང་འགུལ་བསྐྱར་འདོགས།", "desc": "ངོས་འཛིན་བྱས་པའི་འགོ་བརྗོད་ལ་གཞིགས་ནས་ PDF ཡིག་ཆའི་མིང་རང་འགུལ་བསྐྱར་འདོགས་བྱེད་པ།" }, - "adjustContrast": { - "title": "ཚོས་གཞི་/འོད་ཁྱད་སྙོམ་སྒྲིག", - "desc": "PDF ཡི་འོད་ཁྱད། ཚོས་ཟིལ། དང་གསལ་ཚད་སྙོམ་སྒྲིག་བྱེད་པ།" - }, - "crop": { - "title": "PDF གཏུབ་གཅོད།", - "desc": "ཆེ་ཆུང་ཆུང་དུ་གཏོང་ཆེད་ PDF གཏུབ་གཅོད་བྱེད་པ། (ཡི་གེ་རྣམས་སྲུང་སྐྱོབ་བྱེད་ཐུབ།)" - }, - "autoSplitPDF": { - "title": "ཤོག་ངོས་རང་འགུལ་ཁ་གྱེས།", - "desc": "བཤེར་འབེབས་བྱས་པའི་ PDF ནང་གི་དངོས་ཡོད་བཤེར་འབེབས་ཤོག་ངོས་ཁ་གྱེས་ QR Code བེད་སྤྱོད་བྱས་ནས་རང་འགུལ་ཁ་གྱེས་བྱེད་པ།" - }, "sanitizePDF": { "title": "གཙང་སེལ།", "desc": "PDF ཡིག་ཆ་ནས་འཁྲབ་གཞུང་དང་ཆ་ཤས་གཞན་དག་སུབ་པ།" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "PDF ཡི་གནས་ཚུལ་ཆ་ཚང་ལེན་པ།", - "desc": "PDF ཡི་གནས་ཚུལ་ཡོད་ཚད་ལེན་པ།" - }, "pageExtracter": { "title": "ཤོག་ངོས་ཕྱིར་འདོན།", "desc": "PDF ནས་འདེམས་སྒྲུག་བྱས་པའི་ཤོག་ངོས་རྣམས་ཕྱིར་འདོན་པ།" }, - "pdfToSinglePage": { - "title": "PDF ནས་ཤོག་ངོས་ཆེན་པོ་གཅིག་ལ།", - "desc": "PDF ཡི་ཤོག་ངོས་ཚང་མ་ཤོག་ངོས་ཆེན་པོ་གཅིག་ཏུ་སྡེབ་སྦྱོར་བྱེད་པ།" - }, - "showJS": { - "title": "Javascript སྟོན་པ།", - "desc": "PDF ནང་དུ་བཅུག་པའི་ JS གང་ཡོད་འཚོལ་ཞིབ་དང་མངོན་སྟོན་བྱེད་པ།" - }, "autoRedact": { "title": "རང་འགུལ་སྒྲིབ་སྲུང་།", "desc": "འཇུག་པའི་ཡི་གེ་གཞིར་བཟུང་ནས་ PDF ནང་གི་ཡི་གེ་རྣམས་རང་འགུལ་གྱིས་སྒྲིབ་པ།" }, - "redact": { - "title": "ལག་བཟོས་སྒྲིབ་སྲུང་།", - "desc": "འདེམས་སྒྲུག་བྱས་པའི་ཡི་གེ། བྲིས་པའི་དབྱིབས། དང་/ཡང་ན་འདེམས་སྒྲུག་བྱས་པའི་ཤོག་ངོས་གཞིར་བཟུང་ནས་ PDF སྒྲིབ་སྲུང་བྱེད་པ།" - }, "PDFToCSV": { "title": "PDF ནས་ CSV ལ།", "desc": "PDF ནས་རེའུ་མིག་རྣམས་ CSV ལ་ཕྱིར་འདོན་པ།" @@ -551,10 +870,6 @@ "title": "ཆེ་ཆུང་/གྲངས་ཀ་ལྟར་རང་འགུལ་ཁ་གྱེས།", "desc": "PDF གཅིག་ནས་ཡིག་ཆ་མང་པོར་ཆེ་ཆུང་། ཤོག་གྲངས། ཡང་ན་ཡིག་ཆའི་གྲངས་ཀ་གཞིར་བཟུང་ནས་ཁ་གྱེས་བྱེད་པ།" }, - "overlay-pdfs": { - "title": "PDF སྟེང་བརྩེགས།", - "desc": "PDF གཞན་ཞིག་གི་སྟེང་དུ་ PDF བརྩེགས་པ།" - }, "split-by-sections": { "title": "དུམ་བུ་ལྟར་ PDF ཁ་གྱེས།", "desc": "PDF ཡི་ཤོག་ངོས་རེ་རེ་གཞུང་དང་འཕྲེད་ཀྱི་དུམ་བུ་ཆུང་ཆུང་དུ་བགོ་བ།" @@ -563,23 +878,15 @@ "title": "PDF ལ་ཐེལ་ཙེ་སྣོན་པ།", "desc": "གནས་ས་ངེས་ཅན་དུ་ཡི་གེའམ་པར་རིས་ཀྱི་ཐེལ་ཙེ་སྣོན་པ།" }, - "removeImage": { - "title": "པར་རིས་སུབ་པ།", - "desc": "ཡིག་ཆའི་ཆེ་ཆུང་ཆུང་དུ་གཏོང་ཆེད་ PDF ནས་པར་རིས་སུབ་པ།" - }, - "splitByChapters": { - "title": "ལེའུ་ལྟར་ PDF ཁ་གྱེས།", - "desc": "PDF ཡི་ལེའུའི་སྒྲོམ་གཞི་གཞིར་བཟུང་ནས་ཡིག་ཆ་མང་པོར་ཁ་གྱེས་བྱེད་པ།" - }, - "validateSignature": { - "title": "PDF མིང་རྟགས་ར་སྤྲོད།", - "desc": "PDF ཡིག་ཆའི་ནང་གི་ཨང་ཀིའི་མིང་རྟགས་དང་ལག་ཁྱེར་ར་སྤྲོད་བྱེད་པ།" - }, "replace-color": { "title": "ཚོས་གཞིའི་གདམ་ག་མཐོ་རིམ།", "desc": "PDF ནང་གི་ཡི་གེ་དང་རྒྱབ་ལྗོངས་ཀྱི་ཚོས་གཞི་བརྗེ་སྒྱུར་བྱེད་པ་དང་ཡིག་ཆའི་ཆེ་ཆུང་ཆུང་དུ་གཏོང་ཆེད་ཚོས་གཞི་ཡོངས་རྫོགས་ལྡོག་སྒྱུར་བྱེད་པ།" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "ལྟ་བ།,ཀློག་པ།,མཆན་འགྲེལ།,ཡི་གེ,པར་རིས།", "title": "View/Edit PDF", @@ -613,14 +920,39 @@ "merge": { "tags": "སྡེབ་སྦྱོར།,ཤོག་ངོས་བཀོལ་སྤྱོད།,རྒྱབ་ངོས།,ཞབས་ཞུ་ཕྱོགས།", "title": "སྡེབ་སྦྱོར།", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "སྡེབ་སྦྱོར།", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "File Name", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Merge multiple PDFs (2+)", "sortByName": "Sort by name", "sortByDate": "དུས་ཚོད་ལྟར་གོ་རིམ་སྒྲིག་པ།", - "removeCertSign": "སྡེབ་སྦྱོར་བྱས་པའི་ཡིག་ཆའི་ནང་གི་ཨང་ཀིའི་མིང་རྟགས་སུབ་བམ།", - "submit": "སྡེབ་སྦྱོར།" + "removeCertSign": "སྡེབ་སྦྱོར་བྱས་པའི་ཡིག་ཆའི་ནང་གི་ཨང་ཀིའི་མིང་རྟགས་སུབ་བམ།" }, "split": { - "tags": "ཤོག་ངོས་བཀོལ་སྤྱོད།,བགོ་བ།,ཤོག་ངོས་མང་པོ།,གཅོད་པ།,ཞབས་ཞུ་ཕྱོགས།", "title": "PDF ཁ་གྱེས།", "header": "PDF ཁ་གྱེས།", "desc": { @@ -634,14 +966,251 @@ "8": "ཡིག་ཆ་ #6: ཤོག་ངོས་ 10" }, "splitPages": "ཁ་གྱེས་བྱ་རྒྱུའི་ཤོག་ངོས་འཇུག་པ།", - "submit": "ཁ་གྱེས།" + "submit": "ཁ་གྱེས།", + "steps": { + "chooseMethod": "Choose Method", + "settings": "Settings" + }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, + "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, + "bySize": { + "name": "File Size", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" + } + }, + "value": { + "fileSize": { + "label": "File Size", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" + } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "ཤོག་ངོས་བཀོལ་སྤྱོད།,བགོ་བ།,ཤོག་ངོས་མང་པོ།,གཅོད་པ།,ཞབས་ཞུ་ཕྱོགས།" }, "rotate": { - "tags": "ཞབས་ཞུ་ཕྱོགས།", "title": "Rotate PDF", + "submit": "འཁོར་སྐྱོད།", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "ཞབས་ཞུ་ཕྱོགས།", "header": "PDF འཁོར་སྐྱོད།", - "selectAngle": "འཁོར་སྐྱོད་ཀྱི་ཟུར་ཚད་འདེམས་པ། (ཟུར་ཚད་ 90 ཡི་སྒྱུར་ཐོབ་ནང་དུ།)", - "submit": "འཁོར་སྐྱོད།" + "selectAngle": "འཁོར་སྐྱོད་ཀྱི་ཟུར་ཚད་འདེམས་པ། (ཟུར་ཚད་ 90 ཡི་སྒྱུར་ཐོབ་ནང་དུ།)" + }, + "convert": { + "title": "Convert", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Settings", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Colour", + "greyscale": "Greyscale", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Fill Page", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "The PDF contains a digital signature. This will be removed in the next step.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Greyscale", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "བསྒྱུར་བ།,པར་རིས།,jpg,པར།,འདྲ་པར།" @@ -679,7 +1248,33 @@ "8": "Remove Last", "9": "དང་པོ་དང་མཐའ་མ་སུབ་པ།", "10": "ཡ་ཟུང་སྡེབ་སྦྱོར།", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(དཔེར་ན། 1,3,2 ཡང་ན་ 4-8,2,10-12 ཡང་ན་ 2n-1)" }, @@ -691,9 +1286,198 @@ "upload": "པར་རིས་སྣོན་པ།", "submit": "པར་རིས་སྣོན་པ།" }, + "attachments": { + "tags": "attachments,add,remove,embed,file", + "title": "Add Attachments", + "header": "Add Attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add Attachments" + }, "watermark": { - "tags": "ཡི་གེ,བསྐྱར་ཟློས།,ཁ་ཡིག,རང་དབང་།,པར་དབང་།,ཚོང་རྟགས།,པར་རིས།,jpg,པར།,འདྲ་པར།", "title": "རྟ�ས་ཐེལ་སྣོན་པ།", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "རྟགས་ཐེལ་སྣོན་པ།", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Text", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Font Size", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "ཡི་གེ", + "2": "པར་རིས།" + }, + "tags": "ཡི་གེ,བསྐྱར་ཟློས།,ཁ་ཡིག,རང་དབང་།,པར་དབང་།,ཚོང་རྟགས།,པར་རིས།,jpg,པར།,འདྲ་པར།", "header": "རྟགས་ཐེལ་སྣོན་པ།", "customColor": "ཡི་གེའི་ཚོས་མདོག་རང་སྒྲིག", "selectText": { @@ -707,11 +1491,6 @@ "8": "རྟགས་ཐེལ་གྱི་རིགས།", "9": "རྟགས་ཐེལ་གྱི་པར་རིས།", "10": "PDF ནས་ PDF-པར་རིས་ལ་བསྒྱུར་བ།" - }, - "submit": "རྟགས་ཐེལ་སྣོན་པ།", - "type": { - "1": "ཡི་གེ", - "2": "པར་རིས།" } }, "permissions": { @@ -734,41 +1513,204 @@ "submit": "བསྒྱུར་བ།" }, "removePages": { - "tags": "ཤོག་ངོས་སུབ་པ།,ཤོག་ངོས་གསུབ་པ།" - }, - "addPassword": { - "tags": "བདེ་འཇགས།,ཉེན་སྲུང་།", - "title": "གསང་ཚིག་སྣོན་པ།", - "header": "གསང་ཚིག་སྣོན་པ། (གསང་སྡོམ།)", - "selectText": { - "1": "གསང་སྡོམ་བྱ་རྒྱུའི་ PDF འདེམས་པ།", - "2": "སྤྱོད་མཁན་གྱི་གསང་ཚིག", - "3": "གསང་སྡོམ་ལྡེ་མིག་གི་རིང་ཚད།", - "4": "ཚད་མཐོ་བ་རྣམས་སྲ་བརྟན་ཆེ་བ་ཡོད། འོན་ཀྱང་ཚད་དམའ་བ་རྣམས་འཆམ་མཐུན་རང་བཞིན་བཟང་བ་ཡོད།", - "5": "ཆོག་མཆན་སྒྲིག་འགོད། (བདག་པོའི་གསང་ཚིག་དང་མཉམ་དུ་བེད་སྤྱོད་བྱེད་པར་འོས་སྦྱོར་བྱེད།)", - "6": "ཡིག་ཆ་སྒྲིག་སྦྱོར་འགོག་པ།", - "7": "ནང་དོན་ཕྱིར་འདོན་འགོག་པ།", - "8": "མཐུན་རྐྱེན་གྱི་ཆེད་དུ་ཕྱིར་འདོན་འགོག་པ།", - "9": "འགེངས་ཤོག་བཀང་བ་འགོག་པ།", - "10": "བཟོ་བཅོས་འགོག་པ།", - "11": "མཆན་འགྲེལ་བཟོ་བཅོས་འགོག་པ།", - "12": "Prevent printin", - "13": "Prevent printing different formats", - "14": "སྤྱོད་མཁན་གྱི་གསང་གྲངས།", - "15": "ཡིག་ཚགས་རང་སྟེང་ཁ་ཕྱེས་རྒྱུར་བཀག་སྡོམ་བྱེད། འདི་ལྟར་བྱས་ན་ཀློག་ཆས་ཀྱིས་ནུས་པ་ཐོན་པ་པའི་ངེས་པ་མེད།", - "16": "ཡིག་ཚགས་རང་སྟེང་ཁ་ཕྱེས་རྒྱུར་བཀག་སྡོམ་བྱེད།" + "tags": "ཤོག་ངོས་སུབ་པ།,ཤོག་ངོས་གསུབ་པ།", + "title": "Remove Pages", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" }, - "submit": "གསང་བསྒྱུར།" - }, - "removePassword": { - "tags": "བདེ་འཇགས།,གསང་སྡོམ་གྲོལ་བ།,ཉེན་སྲུང་།,གསང་ཚིག་མེད་པ།,གསང་ཚིག་སུབ་པ།", - "title": "གསང་ཚིག་སུབ་པ།", - "header": "གསང་ཚིག་སུབ་པ། (གསང་སྡོམ་གྲོལ་བ།)", - "selectText": { - "1": "གསང་སྡོམ་གྲོལ་རྒྱུའི་ PDF འདེམས་པ།", - "2": "གསང་ཚིག" + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" }, - "submit": "སུབ་པ།" + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, + "submit": "Remove Pages" + }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" + } + } + }, + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" + } }, "compressPdfs": { "tags": "བསྡུས་པ།,ཆུང་ཆུང་།,ཆུང་ཆུང་།" @@ -777,12 +1719,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "ཁ་བྱང་།,རྩོམ་པ་པོ།,ཚེས་གྲངས།,བཟོ་བ།,དུས་ཚོད།,པར་སྐྲུན་པ།,ཐོན་སྐྱེད་པ།,སྡོམ་རྩིས།", - "title": "གནས་ཚུལ་ཞིབ་ཕྲ་བསྒྱུར་བ།", "header": "གནས་ཚུལ་ཞིབ་ཕྲ་བསྒྱུར་བ།", + "submit": "བསྒྱུར་བ།", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "ཁ་བྱང་།,རྩོམ་པ་པོ།,ཚེས་གྲངས།,བཟོ་བ།,དུས་ཚོད།,པར་སྐྲུན་པ།,ཐོན་སྐྱེད་པ།,སྡོམ་རྩིས།", "selectText": { "1": "བསྒྱུར་འདོད་པའི་འགྱུར་ཚད་རྣམས་རྩོམ་སྒྲིག་བྱེད་རོགས།", "2": "གནས་ཚུལ་ཞིབ་ཕྲ་ཚང་མ་སུབ་པ།", @@ -790,15 +1862,7 @@ "4": "གནས་ཚུལ་ཞིབ་ཕྲ་གཞན།", "5": "རང་སྒྲིག་གནས་ཚུལ་ཞིབ་ཕྲ་གསར་སྣོན།" }, - "author": "རྩོམ་པ་པོ།", - "creationDate": "བཟོ་བའི་དུས་ཚོད། (yyyy/MM/dd HH:mm:ss)", - "creator": "བཟོ་མཁན།", - "keywords": "གནད་ཚིག", - "modDate": "བཟོ་བཅོས་དུས་ཚོད། (yyyy/MM/dd HH:mm:ss)", - "producer": "སྐྲུན་མཁན།", - "subject": "བརྗོད་གཞི།", - "trapped": "བཟུང་བ།", - "submit": "བསྒྱུར་བ།" + "modDate": "བཟོ་བཅོས་དུས་ཚོད། (yyyy/MM/dd HH:mm:ss)" }, "fileToPDF": { "tags": "བསྒྱུར་བཅོས།,རྣམ་གཞག,ཡིག་ཆ།,པར།,སྟོན་བྱེད།,ཡི་གེ,བསྒྱུར་བ།,ཡིག་ཚང་།,docs,word,excel,powerpoint", @@ -812,6 +1876,7 @@ "ocr": { "tags": "ངོས་འཛིན།,ཡི་གེ,པར་རིས།,བཤེར་འབེབས།,ཀློག་པ།,ངོས་འཛིན།,འཚོལ་ཞིབ།,རྩོམ་སྒྲིག་རུང་བ།", "title": "OCR / བ�ེར་འབེབས་གཙང་སེལ།", + "desc": "Cleanup scans and detects text from images within a PDF and re-adds it as text.", "header": "བཤེར་འབེབས་གཙང་སེལ། / OCR (འོད་ཀྱི་ཡིག་འབྲུ་ངོས་འཛིན།)", "selectText": { "1": "PDF ནང་དུ་ངོས་འཛིན་བྱ་རྒྱུའི་སྐད་ཡིག་འདེམས་པ། (བཀོད་པ་རྣམས་ནི་ད་ལྟ་ངོས་འཛིན་བྱས་ཟིན་པ་ཡིན།)", @@ -829,7 +1894,91 @@ }, "help": "སྐད་ཡིག་གཞན་དག་གི་ཆེད་དུ་བེད་སྤྱོད་བྱེད་སྟངས་དང་/ཡང་ན་ docker མིན་པའི་བེད་སྤྱོད་ཀྱི་ཆེད་དུ་ཡིག་ཆ་འདི་ཀློག་རོགས།", "credit": "ཞབས་ཞུ་འདིས་ OCR གྱི་ཆེད་དུ་ qpdf དང་ Tesseract བེད་སྤྱོད་བྱེད་པ།", - "submit": "OCR བརྒྱུད་ནས་ PDF བཀོལ་སྤྱོད།" + "submit": "OCR བརྒྱུད་ནས་ PDF བཀོལ་སྤྱོད།", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, + "settings": { + "title": "Settings", + "ocrMode": { + "label": "OCR Mode", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" + }, + "languages": { + "label": "Languages", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" + } + }, + "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, + "mode": { + "title": "OCR Mode", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." + }, + "languages": { + "title": "Languages", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } + } + }, + "error": { + "failed": "OCR operation failed" + } }, "extractImages": { "tags": "པར།,འདྲ་པར།,ཉར་ཚགས།,ཡིག་མཛོད།,zip,འཛིན་པ།,ལེན་པ།", @@ -837,7 +1986,13 @@ "header": "Extract Images", "selectText": "ཕྱིར་བཏོན་པའི་པར་རིས་རྣམས་བསྒྱུར་རྒྱུའི་པར་རིས་རྣམ་གཞག་འདེམས་པ།", "allowDuplicates": "བསྐྱར་ཟློས་པར་རིས་ཉར་ཚགས།", - "submit": "ཕྱིར་འདོན།" + "submit": "ཕྱིར་འདོན།", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "ཡིག་མཛོད།,དུས་ཡུན་རིང་པོ།,ཚད་ལྡན།,བསྒྱུར་བ།,ཉར་ཚགས།,སྲུང་སྐྱོབ།", @@ -909,17 +2064,53 @@ }, "info": "Python སྒྲིག་འཇུག་བྱས་མི་འདུག འདི་བཀོལ་སྤྱོད་བྱེད་པར་དགོས་མཁོ་ཡིན།" }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "དབང་སྤྲོད།,མིང་རྟགས་ཐུང་ངུ་།,བྲིས་པའི་མིང་རྟགས།,ཡི་གེའི་མིང་རྟགས།,པར་རིས་མིང་རྟགས།", "title": "མིང་རྟགས།", "header": "PDF ལ་མིང་རྟགས་རྒྱག་པ།", "upload": "པར་རིས་ཡར་འཇོག", - "draw": "མིང་རྟགས་འབྲི་བ།", - "text": "ཡི་གེ་འཇུག་པ།", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "གཙང་སེལ།", "add": "སྣོན་པ།", "saved": "ཉར་ཚགས་བྱས་པའི་མིང་རྟགས།", "save": "མིང་རྟགས་ཉར་ཚགས།", + "applySignatures": "Apply Signatures", "personalSigs": "སྒེར་གྱི་མིང་རྟགས།", "sharedSigs": "མཉམ་སྤྱོད་མིང་རྟགས།", "noSavedSigs": "ཉར་ཚགས་བྱས་པའི་མིང་རྟགས་མ་རྙེད།", @@ -931,36 +2122,179 @@ "previous": "ཤོག་ངོས་སྔོན་མ།", "maintainRatio": "བསྡུར་ཚད་རྒྱུན་འཁྱོངས་སྒོ་རྒྱག་པ།", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "དབང་སྤྲོད།,མིང་རྟགས་ཐུང་ངུ་།,བྲིས་པའི་མིང་རྟགས།,ཡི་གེའི་མིང་རྟགས།,པར་རིས་མིང་རྟགས།" }, "flatten": { - "tags": "སྙོམས་པ།,འགེངས་ཤོག,སྤྱོད་སྒོ།,ཆ་ཤས།,སུབ་པ།", "title": "སྙ�མས་པ།", "header": "PDF སྙོམས་པ།", "flattenOnlyForms": "འགེངས་ཤོག་ཁོ་ན་སྙོམས་པ།", - "submit": "སྙོམས་པ།" + "submit": "སྙོམས་པ།", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "steps": { + "settings": "Settings" + }, + "options": { + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "སྙོམས་པ།,འགེངས་ཤོག,སྤྱོད་སྒོ།,ཆ་ཤས།,སུབ་པ།" }, "repair": { "tags": "སྐྱོན་སེལ།,བཟོ་བཅོས།,གསོ་བ།,ལེགས་བཅོས།", "title": "བཟོ་བཅོས།", "header": "PDF བཟོ་བཅོས།", - "submit": "བཟོ་བཅོས།" + "submit": "བཟོ་བཅོས།", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "སྟོང་ཤོག་སུབ་པ། སྟོང་པ་སུབ་པ། དཀར་ཤོག་སུབ་པ། PDF སྟོང་ཤོག་སུབ་པ།", "title": "སྟོང་ཤོག་སུབ་པ།", "header": "སྟོང་པའི་ཤོག་ངོས་སུབ་པ།", - "threshold": "པིག་ཟེལ་དཀར་པོའི་མཚམས་ཚད།", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "སྟོང་ཤོག་སུབ་པ།", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "སྟོང་ཤོག་སུབ་པ། སྟོང་པ་སུབ་པ། དཀར་ཤོག་སུབ་པ། PDF སྟོང་ཤོག་སུབ་པ།", "thresholdDesc": "པིག་ཟེལ་དཀར་པོ་ཞིག་'དཀར་པོ་'རུ་རྩི་བའི་དཀར་ཚད་ཀྱི་མཚམས། 0 = ནག་པོ། 255 དཀར་པོ་གཙང་མ།", - "whitePercent": "དཀར་པོའི་བརྒྱ་ཆ། (%)", - "whitePercentDesc": "སུབ་རྒྱུའི་ཤོག་ངོས་ཤིག་གི་'དཀར་པོའི་'པིག་ཟེལ་གྱི་བརྒྱ་ཆ།", - "submit": "སྟོང་ཤོག་སུབ་པ།" + "whitePercentDesc": "སུབ་རྒྱུའི་ཤོག་ངོས་ཤིག་གི་'དཀར་པོའི་'པིག་ཟེལ་གྱི་བརྒྱ་ཆ།" }, "removeAnnotations": { "tags": "མཆན་འགྲེལ་སུབ་པ། དཔྱད་བརྗོད་སུབ་པ། མཆན་བུ་སུབ་པ། PDF མཆན་འགྲེལ་སུབ་པ།", "title": "མཆན་འགྲེལ་སུབ་པ།", "header": "མཆན་འགྲེལ་སུབ་པ།", - "submit": "སུབ་པ།" + "submit": "སུབ་པ།", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "བསྡུར་བ། ཁྱད་པར། ཞིབ་བསྡུར། གཤིབ་བསྡུར། PDF བསྡུར་བ།", @@ -992,6 +2326,142 @@ "certSign": { "tags": "ར་སྤྲོད།,PEM,P12,གཞུང་འབྲེལ།,གསང་སྡོམ།", "title": "ལག་ཁྱེར་མིང་རྟགས།", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "ས་གནས།", + "logoTitle": "Logo", + "name": "མིང་།", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "ཁྱེད་ཀྱི་ལྡེ་མིག་མཛོད་དམ་སྒེར་གྱི་ལྡེ་མིག་གི་གསང་ཚིག་འཇུག་པ། (གལ་སྲིད་ཡོད་ན།)", + "passwordOptional": "Leave empty if no password", + "reason": "རྒྱུ་མཚན།", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "མཚོན་རྟགས་སྟོན།", "header": "ཁྱེད་ཀྱི་ལག་ཁྱེར་གྱིས་ PDF ལ་མིང་རྟགས་རྒྱག་པ། (ལས་ཀ་བྱེད་བཞིན་པ།)", "selectPDF": "མིང་རྟགས་རྒྱག་རྒྱུའི་ PDF ཡིག་ཆ་འདེམས་པ།", "jksNote": "དྲན་གསོ། གལ་སྲིད་ཁྱེད་ཀྱི་ལག་ཁྱེར་གྱི་རིགས་གཤམ་དུ་མེད་ན། keytool བཀའ་བརྡ་ཐིག་བེད་སྤྱོད་བྱས་ནས་ Java Keystore (.jks) ཡིག་ཆ་ལ་བསྒྱུར་རོགས། དེ་ནས་གཤམ་དུ་ .jks ཡིག་ཆ་འདེམས་རོགས།", @@ -999,13 +2469,7 @@ "selectCert": "ལག་ཁྱེར་ཡིག་ཆ་འདེམས་པ། (X.509 རྣམ་གཞག .pem ཡང་ན་ .der ཡིན་སྲིད།)", "selectP12": "PKCS#12 ལྡེ་མིག་མཛོད་ཡིག་ཆ་འདེམས་པ། (.p12 ཡང་ན་ .pfx) (འདེམས་རུང་། གལ་སྲིད་མཁོ་སྤྲོད་བྱས་ན། དེའི་ནང་དུ་ཁྱེད་ཀྱི་སྒེར་གྱི་ལྡེ་མིག་དང་ལག་ཁྱེར་འདུས་ཡོད་དགོས།)", "selectJKS": "Java ལྡེ་མིག་མཛོད་ཡིག་ཆ་འདེམས་པ། (.jks ཡང་ན་ .keystore)", - "certType": "ལག་ཁྱེར་གྱི་རིགས།", - "password": "ཁྱེད་ཀྱི་ལྡེ་མིག་མཛོད་དམ་སྒེར་གྱི་ལྡེ་མིག་གི་གསང་ཚིག་འཇུག་པ། (གལ་སྲིད་ཡོད་ན།)", "showSig": "མིང་རྟགས་སྟོན།", - "reason": "རྒྱུ་མཚན།", - "location": "ས་གནས།", - "name": "མིང་།", - "showLogo": "མཚོན་རྟགས་སྟོན།", "submit": "PDF ལ་མིང་རྟགས་རྒྱག་པ།" }, "removeCertSign": { @@ -1013,7 +2477,18 @@ "title": "ལག་ཁྱེར་མིང་རྟགས་སུབ་པ།", "header": "PDF ནས་ཨང་ཀིའི་ལག་ཁྱེར་སུབ་པ།", "selectPDF": "PDF ཡིག་ཆ་འདེམས་པ།", - "submit": "མིང་རྟགས་སུབ་པ།" + "submit": "མིང་རྟགས་སུབ་པ།", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "སྡེབ་སྦྱོར།,བསྡུས་པ།,ལྟ་ཚུལ་གཅིག,གོ་སྒྲིག", @@ -1021,16 +2496,157 @@ "header": "ཤོག་ངོས་མང་པོའི་བཀོད་པ།", "pagesPerSheet": "ཤོག་ལྷེ་རེར་ཤོག་ངོས་གྲངས།", "addBorder": "མཐའ་མཚམས་སྣོན་པ།", - "submit": "ཕུལ་བ།" + "submit": "ཕུལ་བ།", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "ཆེ་ཆུང་བསྐྱར་སྒྲིག,བཟོ་བཅོས།,ཚད་གཞི།,བསྟུན་འགྱུར།", "title": "ཤོག་ངོས་ཆེ་ཆུང་སྙོམ་སྒྲིག", "header": "ཤོག་ངོས་ཆེ་ཆུང་སྙོམ་སྒྲིག", "pageSize": "ཡིག་ཆའི་ཤོག་ངོས་ཀྱི་ཆེ་ཆུང་།", "keepPageSize": "ཐོག་མའི་ཆེ་ཆུང་།", "scaleFactor": "ཤོག་ངོས་ཀྱི་ཆེ་ཆུང་ཚད། (གཏུབ་གཅོད།)", - "submit": "ཕུལ་བ།" + "submit": "ཕུལ་བ།", + "tags": "ཆེ་ཆུང་བསྐྱར་སྒྲིག,བཟོ་བཅོས།,ཚད་གཞི།,བསྟུན་འགྱུར།" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "ཤོག་གྲངས་རྒྱག་པ།,མིང་རྟགས།,གོ་སྒྲིག,དཀར་ཆག" @@ -1039,16 +2655,83 @@ "tags": "རང་འགུལ་ངོས་འཛིན།,འགོ་བརྗོད་གཞིར་བཟུང་།,གོ་སྒྲིག,མིང་བསྐྱར་འདོགས།", "title": "རང་འགུལ་མིང་བསྐྱར་འདོགས།", "header": "PDF རང་འགུལ་མིང་བསྐྱར་འདོགས།", - "submit": "རང་འགུལ་མིང་བསྐྱར་འདོགས།" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "རང་འགུལ་མིང་བསྐྱར་འདོགས།", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "ཚོས་གཞི་ལེགས་སྒྲིག,སྙོམ་སྒྲིག,བཟོ་བཅོས།,ཡར་རྒྱས།,ཚོས་མདངས་ལེགས་སྒྲིག" }, "crop": { - "tags": "གཏུབ་པ།,ཆུང་དུ་གཏོང་བ།,རྩོམ་སྒྲིག,དབྱིབས།", "title": "གཏུབ་གཅོད།", "header": "PDF གཏུབ་གཅོད།", - "submit": "ཕུལ་བ།" + "submit": "ཕུལ་བ།", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "གཏུབ་པ།,ཆུང་དུ་གཏོང་བ།,རྩོམ་སྒྲིག,དབྱིབས།" }, "autoSplitPDF": { "tags": "QR གཞིར་བཟུང་།,ཁ་གྱེས།,བཤེར་དུམ།,གོ་སྒྲིག", @@ -1131,24 +2814,124 @@ "downloadJS": "Javascript ཕབ་ལེན།", "submit": "སྟོན་པ།" }, - "autoRedact": { - "tags": "སྒྲིབ་སྲུང་།,སྦས་པ།,ནག་པོས་སྒྲིབ་པ།,ནག་པོ།,རྟགས་རྒྱག,སྦས་པ།", - "title": "རང་འགུལ་སྒྲིབ་སྲུང་།", - "header": "རང་འགུལ་སྒྲིབ་སྲུང་།", - "colorLabel": "ཚོས་གཞི།", - "textsToRedactLabel": "སྒྲིབ་རྒྱུའི་ཡི་གེ། (ཐིག་ཕྲེང་སོ་སོར།)", - "textsToRedactPlaceholder": "དཔེར་ན། \\nགསང་བ། \\nགསང་ཆེ།", - "useRegexLabel": "Regex བེད་སྤྱོད།", - "wholeWordSearchLabel": "ཚིག་ཆ་ཚང་འཚོལ་བ།", - "customPaddingLabel": "མཐའ་མཚམས་སྟོང་ཆ་སྣོན་པ།", - "convertPDFToImageLabel": "PDF ནས་ PDF-པར་རིས་ལ་བསྒྱུར་བ། (སྒྲོམ་གྱི་རྒྱབ་ཀྱི་ཡི་གེ་སུབ་པར་བེད་སྤྱོད།)", - "submitButton": "ཕུལ་བ།" - }, "redact": { "tags": "སྒྲིབ་སྲུང་།,སྦས་པ།,ནག་པོས་སྒྲིབ་པ།,ནག་པོ།,རྟགས་རྒྱག,སྦས་པ།,ལག་བཟོས།", "title": "ལག་བཟོས་སྒྲིབ་སྲུང་།", - "header": "ལག་བཟོས་སྒྲིབ་སྲུང་།", "submit": "སྒྲིབ་སྲུང་།", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Advanced" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Add", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pages", + "placeholder": "(e.g. 1,2,8 or 4,7,12-16 or 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "ལག་བཟོས་སྒྲིབ་སྲུང་།", "textBasedRedaction": "ཡི་གེ་གཞིར་བཟུང་བའི་སྒྲིབ་སྲུང་།", "pageBasedRedaction": "ཤོག་ངོས་གཞིར་བཟུང་བའི་སྒྲིབ་སྲུང་།", "convertPDFToImageLabel": "PDF ནས་ PDF-པར་རིས་ལ་བསྒྱུར་བ། (སྒྲོམ་གྱི་རྒྱབ་ཀྱི་ཡི་གེ་སུབ་པར་བེད་སྤྱོད།)", @@ -1185,11 +2968,15 @@ "overlay-pdfs": { "tags": "སྟེང་བརྩེགས།", "header": "PDF ཡིག་ཆ་བརྩེགས་པ།", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "གཞི་རྩའི་ PDF ཡིག་ཆ་འདེམས་པ།" }, "overlayFiles": { - "label": "བརྩེགས་རྒྱུའི་ PDF ཡིག་ཆ་འདེམས་པ།" + "label": "བརྩེགས་རྒྱུའི་ PDF ཡིག་ཆ་འདེམས་པ།", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "བརྩེགས་སྟངས་འདེམས་པ།", @@ -1199,14 +2986,53 @@ }, "counts": { "label": "བརྩེགས་གྲངས། (བསྐྱར་ཟློས་གཏན་འཇགས་རྣམ་པའི་ཆེད།)", - "placeholder": "ཚེག་ཁྱིམ་གྱིས་བཅད་པའི་གྲངས་ཀ་འཇུག་པ། (དཔེར་ན། 2,3,1)" + "placeholder": "ཚེག་ཁྱིམ་གྱིས་བཅད་པའི་གྲངས་ཀ་འཇུག་པ། (དཔེར་ན། 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "བརྩེགས་སའི་གནས་ས་འདེམས་པ།", "foreground": "མདུན་ངོས།", "background": "རྒྱབ་ལྗོངས།" }, - "submit": "ཕུལ་བ།" + "submit": "ཕུལ་བ།", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "དུམ་བུ་ཁ་གྱེས།,བགོ་བ།,རང་སྒྲིག,སྒྲིག་སྦྱོར།", @@ -1227,6 +3053,7 @@ "tags": "ཐེལ་ཙེ།,པར་རིས་སྣོན་པ།,དཀྱིལ་སྒྲིག་པར་རིས།,ཆུ་རྟགས།,PDF,ནང་འཇུག,རང་སྒྲིག,སྒྲིག་སྦྱོར།", "header": "PDF ལ་ཐེལ་ཙེ་རྒྱག་པ།", "title": "PDF ལ་ཐེལ་ཙེ་རྒྱག་པ།", + "stampSetup": "Stamp Setup", "stampType": "ཐེལ་ཙེའི་རིགས།", "stampText": "ཐེལ་ཙེའི་ཡི་གེ", "stampImage": "ཐེལ་ཙེའི་པར་རིས།", @@ -1239,7 +3066,19 @@ "overrideY": "Y གནས་ཚད་བརྗེ་བསྒྱུར།", "customMargin": "མཐའ་མཚམས་རང་སྒྲིག", "customColor": "ཡི་གེའི་ཚོས་མདོག་རང་སྒྲིག", - "submit": "ཕུལ་བ།" + "submit": "ཕུལ་བ།", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "པར་རིས་སུབ་པ།,ཤོག་ངོས་བཀོལ་སྤྱོད།,རྒྱབ་ངོས།,ཞབས་ཞུ་ཕྱོགས།" @@ -1257,7 +3096,8 @@ "status": { "_value": "གནས་སྟངས།", "valid": "ནུས་ལྡན།", - "invalid": "ནུས་མེད།" + "invalid": "ནུས་མེད།", + "complete": "Validation complete" }, "signer": "མིང་རྟགས་འགོད་མཁན།", "date": "དུས་ཚོད།", @@ -1284,40 +3124,122 @@ "version": "པར་གཞི།", "keyUsage": "ལྡེ་མིག་བེད་སྤྱོད།", "selfSigned": "རང་མིང་རྟགས།", - "bits": "གནས།" + "bits": "གནས།", + "details": "Certificate Details" }, "signature": { "info": "མིང་རྟགས་ཀྱི་གནས་ཚུལ།", "_value": "མིང་རྟགས།", "mathValid": "མིང་རྟགས་ཨང་རྩིས་ཐོག་ནས་ནུས་ལྡན་ཡིན་ཡང་།" }, - "selectCustomCert": "རང་སྒྲིག་ལག་ཁྱེར་ཡིག་ཆ་ X.509 (འདམ་ག)" - }, - "replace-color": { - "title": "ཚོས་གཞིའི་གདམ་ག་མཐོ་རིམ།", - "header": "ཚོས་གཞི་བརྗེ་སྒྱུར་-ལྡོག་སྒྱུར་ PDF", - "selectText": { - "1": "ཚོས་གཞི་བརྗེ་སྒྱུར་རམ་ལྡོག་སྒྱུར་གྱི་གདམ་ག", - "2": "སྔོན་སྒྲིག (སྔོན་སྒྲིག་གི་འོད་ཁྱད་མཐོ་བའི་ཚོས་གཞི།)", - "3": "རང་སྒྲིག (རང་སྒྲིག་གི་ཚོས་གཞི།)", - "4": "ཡོངས་རྫོགས་ལྡོག་སྒྱུར། (ཚོས་གཞི་ཚང་མ་ལྡོག་སྒྱུར།)", - "5": "འོད་ཁྱད་མཐོ་བའི་ཚོས་གཞིའི་གདམ་ག", - "6": "རྒྱབ་ལྗོངས་ནག་པོའི་སྟེང་གི་ཡི་གེ་དཀར་པོ།", - "7": "རྒྱབ་ལྗོངས་དཀར་པོའི་སྟེང་གི་ཡི་གེ་ནག་པོ།", - "8": "རྒྱབ་ལྗོངས་ནག་པོའི་སྟེང་གི་ཡི་གེ་སེར་པོ།", - "9": "རྒྱབ་ལྗོངས་ནག་པོའི་སྟེང་གི་ཡི་གེ་ལྗང་ཁུ།", - "10": "ཡི་གེའི་ཚོས་གཞི་འདེམས་པ།", - "11": "རྒྱབ་ལྗོངས་ཀྱི་ཚོས་གཞི་འདེམས་པ།" + "selectCustomCert": "རང་སྒྲིག་ལག་ཁྱེར་ཡིག་ཆ་ X.509 (འདམ་ག)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "བརྗེ་སྒྱུར།" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "ཚོས་གཞི་བརྗེ་སྒྱུར།,ཤོག་ངོས་བཀོལ་སྤྱོད���,རྒྱབ་ངོས།,ཞབས་ཞུ་ཕྱོགས།" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "�ང་འཛུལ།", "header": "ནང་འཛུལ།", "signin": "ནང་འཛུལ།", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "ང་དྲན་པར་བྱེད།", "invalid": "སྤྱོད་མིང་ངམ་གསང་ཚིག་ནོར་འདུག", "locked": "ཁྱེད་ཀྱི་ཐོ་མཛོད་ཟྭ་རྒྱག་བརྒྱབ་ཟིན།", @@ -1336,12 +3258,83 @@ "alreadyLoggedIn": "ཁྱེད་རང་", "alreadyLoggedIn2": "སྒྲིག་ཆས་ནང་ནང་འཛུལ་བྱས་ཟིན། སྒྲིག་ཆས་ནས་ཕྱིར་འཐེན་བྱས་ནས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱེད་རོགས།", "toManySessions": "ཁྱེད་ལ་འཛུལ་ཞུགས་བྱས་པའི་གནས་སྐབས་མང་དྲགས་འདུག", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF ནས་ཤོག་ངོས་གཅིག་ལ།", "header": "PDF ནས་ཤོག་ངོས་གཅིག་ལ།", - "submit": "ཤོག་ངོས་གཅིག་ལ་བསྒྱུར་བ།" + "submit": "ཤོག་ངོས་གཅིག་ལ་བསྒྱུར་བ།", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "ཤོག་ངོས་ཕྱིར་འདོན།", @@ -1365,18 +3358,59 @@ "adjustContrast": { "title": "འོད་ཁྱད་སྙོམ་སྒྲིག", "header": "འོད་ཁྱད་སྙོམ་སྒྲིག", + "basic": "Basic Adjustments", "contrast": "འོད་ཁྱད།", "brightness": "གསལ་ཚད།", "saturation": "མདོག་ཚད།", - "download": "ཕབ་ལེན།" + "download": "ཕབ་ལེན།", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "སྡུད་སྒྲིལ།", + "desc": "Compress PDFs to reduce their file size.", "header": "PDF སྡུད་སྒྲིལ།", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "File Size" + }, "credit": "ཞབས་ཞུ་འདིས་ PDF སྡུད་སྒྲིལ་/ཡར་རྒྱས་གཏོང་བའི་ཆེད་དུ་ qpdf བེད་སྤྱོད་བྱེད་པ།", "grayscale": { "label": "应用灰度进行压缩" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1487,7 +3521,13 @@ "title": "པ�་རིས་སུབ་པ།", "header": "པར་རིས་སུབ་པ།", "removeImage": "པར་རིས་སུབ་པ།", - "submit": "པར་རིས་སུབ་པ།" + "submit": "པར་རིས་སུབ་པ།", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "ལེའ�་ལྟར་ PDF ཁ་གྱེས།", @@ -1521,6 +3561,12 @@ }, "note": "པར་གཞི་གསར་པའི་གསལ་བསྒྲགས་དབྱིན་ཡིག་ཁོ་ནར་ཡོད།" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1556,6 +3602,1747 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } + }, + "removeMetadata": { + "submit": "Remove Metadata" + }, + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } + }, + "quickAccess": { + "read": "Read", + "sign": "Sign", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, + "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Loading...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" + }, + "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", + "fileName": "Name", + "fileFormat": "Format", + "fileSize": "Size", + "fileVersion": "Version", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", + "download": "Download", + "delete": "Delete", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" + }, + "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", + "submit": "Sanitise PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", + "steps": { + "files": "Files", + "settings": "Settings", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "གསང་ཚིག་སྣོན་པ།", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "གསང་བསྒྱུར།", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Change Permissions", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "བདེ་འཇགས།,ཉེན་སྲུང་།", + "header": "གསང་ཚིག་སྣོན་པ། (གསང་སྡོམ།)", + "selectText": { + "1": "གསང་སྡོམ་བྱ་རྒྱུའི་ PDF འདེམས་པ།", + "2": "སྤྱོད་མཁན་གྱི་གསང་ཚིག", + "3": "གསང་སྡོམ་ལྡེ་མིག་གི་རིང་ཚད།", + "4": "ཚད་མཐོ་བ་རྣམས་སྲ་བརྟན་ཆེ་བ་ཡོད། འོན་ཀྱང་ཚད་དམའ་བ་རྣམས་འཆམ་མཐུན་རང་བཞིན་བཟང་བ་ཡོད།", + "5": "ཆོག་མཆན་སྒྲིག་འགོད། (བདག་པོའི་གསང་ཚིག་དང་མཉམ་དུ་བེད་སྤྱོད་བྱེད་པར་འོས་སྦྱོར་བྱེད།)", + "6": "ཡིག་ཆ་སྒྲིག་སྦྱོར་འགོག་པ།", + "7": "ནང་དོན་ཕྱིར་འདོན་འགོག་པ།", + "8": "མཐུན་རྐྱེན་གྱི་ཆེད་དུ་ཕྱིར་འདོན་འགོག་པ།", + "9": "འགེངས་ཤོག་བཀང་བ་འགོག་པ།", + "10": "བཟོ་བཅོས་འགོག་པ།", + "11": "མཆན་འགྲེལ་བཟོ་བཅོས་འགོག་པ།", + "12": "Prevent printin", + "13": "Prevent printing different formats", + "14": "སྤྱོད་མཁན་གྱི་གསང་གྲངས།", + "15": "ཡིག་ཚགས་རང་སྟེང་ཁ་ཕྱེས་རྒྱུར་བཀག་སྡོམ་བྱེད། འདི་ལྟར་བྱས་ན་ཀློག་ཆས་ཀྱིས་ནུས་པ་ཐོན་པ་པའི་ངེས་པ་མེད།", + "16": "ཡིག་ཚགས་རང་སྟེང་ཁ་ཕྱེས་རྒྱུར་བཀག་སྡོམ་བྱེད།" + } + }, + "changePermissions": { + "title": "Change Permissions", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", + "submit": "Change Permissions", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, + "permissions": { + "preventAssembly": { + "label": "Prevent assembly of document" + }, + "preventExtractContent": { + "label": "Prevent content extraction" + }, + "preventExtractForAccessibility": { + "label": "Prevent extraction for accessibility" + }, + "preventFillInForm": { + "label": "Prevent filling in form" + }, + "preventModify": { + "label": "Prevent modification" + }, + "preventModifyAnnotations": { + "label": "Prevent annotation modification" + }, + "preventPrinting": { + "label": "Prevent printing" + }, + "preventPrintingFaithful": { + "label": "Prevent printing different formats" + } + }, + "results": { + "title": "Modified PDFs" + }, + "tooltip": { + "header": { + "title": "Change Permissions" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." + } + } + }, + "removePassword": { + "title": "གསང་ཚིག་སུབ་པ།", + "desc": "Remove password protection from your PDF document.", + "tags": "བདེ་འཇགས།,གསང་སྡོམ་གྲོལ་བ།,ཉེན་སྲུང་།,གསང་ཚིག་མེད་པ།,གསང་ཚིག་སུབ་པ།", + "password": { + "stepTitle": "Remove Password", + "label": "Current Password", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "སུབ་པ།", + "results": { + "title": "Decrypted PDFs" + }, + "header": "གསང་ཚིག་སུབ་པ། (གསང་སྡོམ་གྲོལ་བ།)", + "selectText": { + "1": "གསང་སྡོམ་གྲོལ་རྒྱུའི་ PDF འདེམས་པ།", + "2": "གསང་ཚིག" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "ཚོས་གཞི་བརྗེ་སྒྱུར་རམ་ལྡོག་སྒྱུར་གྱི་གདམ་ག", + "2": "སྔོན་སྒྲིག (སྔོན་སྒྲིག་གི་འོད་ཁྱད་མཐོ་བའི་ཚོས་གཞི།)", + "3": "རང་སྒྲིག (རང་སྒྲིག་གི་ཚོས་གཞི།)", + "4": "ཡོངས་རྫོགས་ལྡོག་སྒྱུར། (ཚོས་གཞི་ཚང་མ་ལྡོག་སྒྱུར།)", + "5": "འོད་ཁྱད་མཐོ་བའི་ཚོས་གཞིའི་གདམ་ག", + "6": "རྒྱབ་ལྗོངས་ནག་པོའི་སྟེང་གི་ཡི་གེ་དཀར་པོ།", + "7": "རྒྱབ་ལྗོངས་དཀར་པོའི་སྟེང་གི་ཡི་གེ་ནག་པོ།", + "8": "རྒྱབ་ལྗོངས་ནག་པོའི་སྟེང་གི་ཡི་གེ་སེར་པོ།", + "9": "རྒྱབ་ལྗོངས་ནག་པོའི་སྟེང་གི་ཡི་གེ་ལྗང་ཁུ།", + "10": "ཡི་གེའི་ཚོས་གཞི་འདེམས་པ།", + "11": "རྒྱབ་ལྗོངས་ཀྱི་ཚོས་གཞི་འདེམས་པ།", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "བརྗེ་སྒྱུར།", + "title": "ཚོས་གཞིའི་གདམ་ག་མཐོ་རིམ།", + "header": "ཚོས་གཞི་བརྗེ་སྒྱུར་-ལྡོག་སྒྱུར་ PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "སྒྲིབ་སྲུང་།,སྦས་པ།,ནག་པོས་སྒྲིབ་པ།,ནག་པོ།,རྟགས་རྒྱག,སྦས་པ།", + "title": "རང་འགུལ་སྒྲིབ་སྲུང་།", + "header": "རང་འགུལ་སྒྲིབ་སྲུང་།", + "colorLabel": "ཚོས་གཞི།", + "textsToRedactLabel": "སྒྲིབ་རྒྱུའི་ཡི་གེ། (ཐིག་ཕྲེང་སོ་སོར།)", + "textsToRedactPlaceholder": "དཔེར་ན། \\nགསང་བ། \\nགསང་ཆེ།", + "useRegexLabel": "Regex བེད་སྤྱོད།", + "wholeWordSearchLabel": "ཚིག་ཆ་ཚང་འཚོལ་བ།", + "customPaddingLabel": "མཐའ་མཚམས་སྟོང་ཆ་སྣོན་པ།", + "convertPDFToImageLabel": "PDF ནས་ PDF-པར་རིས་ལ་བསྒྱུར་བ། (སྒྲོམ་གྱི་རྒྱབ་ཀྱི་ཡི་གེ་སུབ་པར་བེད་སྤྱོད།)", + "submitButton": "ཕུལ་བ།" + }, + "replaceColorPdf": { + "tags": "ཚོས་གཞི་བརྗེ་སྒྱུར།,ཤོག་ངོས་བཀོལ་སྤྱོད���,རྒྱབ་ངོས།,ཞབས་ཞུ་ཕྱོགས།" } } diff --git a/frontend/public/locales/zh-CN/translation.json b/frontend/public/locales/zh-CN/translation.json index dd34c090e..0154128b3 100644 --- a/frontend/public/locales/zh-CN/translation.json +++ b/frontend/public/locales/zh-CN/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "您的 PDF 有未保存的更改。您想做什么?", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "未保存的更改", + "keepWorking": "继续工作", + "discardChanges": "放弃更改", + "applyAndContinue": "应用并继续", + "exportAndContinue": "导出并继续", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "自定义文本", "numberPagesDesc": "要添加页码的页数,默认为“所有”,也可以接受1-5或2,5,9等", "customNumberDesc": "默认为 {n},也可以接受“第 {n} 页/共 {total} 页”,“文本-{n}”,“{filename}-{n}”", - "submit": "添加页码" + "submit": "添加页码", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "自定义页面选择(输入以逗号分隔的页码列表或函数:1,5,6、2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "选择 PDF", "multiPdfPrompt": "选择多个 PDF(2个或更多)", "multiPdfDropPrompt": "选择(或拖拽)所需的 PDF", @@ -30,7 +84,6 @@ "uploadLimitExceededPlural": "文件过大。最大允许大小为", "processTimeWarning": "警告:此过程可能需要多达一分钟,具体时间取决于文件大小", "pageOrderPrompt": "页面顺序(输入逗号分隔的页码列表或函数):", - "pageSelectionPrompt": "自定义页面选择(输入以逗号分隔的页码列表或函数:1,5,6、2n+1):", "goToPage": "到", "true": "对", "false": "错", @@ -41,11 +94,18 @@ "save": "保存", "saveToBrowser": "保存到浏览器", "download": "下载", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", "undoOperationTooltip": "点击撤销上一次操作并还原原始文件", "undo": "撤销", "moreOptions": "更多选项", "editYourNewFiles": "编辑您的新文件", "close": "关闭", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "已选:{{filename}}", "chooseFile": "选择文件", "filesSelected": "选中的文件", @@ -55,7 +115,9 @@ "uploadFiles": "上传文件", "addFiles": "添加文件", "selectFromWorkbench": "从工作台中选择文件或 ", - "selectMultipleFromWorkbench": "从工作台中至少选择 {{count}} 个文件或 " + "selectMultipleFromWorkbench": "从工作台中至少选择 {{count}} 个文件或 ", + "created": "Created", + "size": "File Size" }, "noFavourites": "没有添加收藏夹", "downloadComplete": "下载完成", @@ -74,7 +136,10 @@ }, "error": { "pdfPassword": "PDF文档有密码,未提供密码或密码不正确", + "encryptedPdfMustRemovePassword": "此 PDF 已加密或受密码保护。请在转换为 PDF/A 之前将其解锁。", + "incorrectPasswordProvided": "PDF 密码不正确或未提供。", "_value": "错误", + "dismissAllErrors": "关闭所有错误", "sorry": "对此问题感到抱歉!", "needHelp": "需要帮助 / 发现问题?", "contactTip": "如果你仍然遇到问题,不要犹豫,向我们寻求帮助。你可以在我们的 GitHub 页面上提交工单,或者通过 Discord 与我们联系:", @@ -87,10 +152,7 @@ "showStack": "显示堆栈跟踪", "copyStack": "复制堆栈跟踪", "githubSubmit": "GitHub - 提交工单", - "discordSubmit": "Discord - 提交支持帖子", - "dismissAllErrors": "关闭所有错误", - "encryptedPdfMustRemovePassword": "此 PDF 已加密或受密码保护。请在转换为 PDF/A 之前将其解锁。", - "incorrectPasswordProvided": "PDF 密码不正确或未提供。" + "discordSubmit": "Discord - 提交支持帖子" }, "warning": { "tooltipTitle": "警告" @@ -188,6 +250,7 @@ "title": "你想协助改善Stirling PDF吗", "paragraph1": "Stirling PDF有选择性分析功能,可以帮助我们改进产品。我们不跟踪任何个人信息或文件内容。", "paragraph2": "请考虑启用分析来帮助Stirling-PDF的发展,并让我们更好地了解我们的用户。", + "learnMore": "Learn more", "enable": "启用分析功能", "disable": "禁用分析功能", "settings": "您可以在 config/settings.yml 文件中变更分析功能的设定" @@ -231,6 +294,54 @@ "cacheInputs": { "name": "保存表单输入", "help": "保存先前输入以供日后使用" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -302,8 +413,10 @@ "top20": "前20", "all": "全部", "refresh": "刷新", - "includeHomepage": "包含主页('/')", - "includeLoginPage": "包含登录页('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "端点总数", "totalVisits": "访问总数", "showing": "显示", @@ -318,7 +431,9 @@ "top": "顶部", "numberOfVisits": "访问次数", "visitsTooltip": "访问次数:{0}(占总数的{1}%)", - "retry": "重试" + "retry": "重试", + "includeHomepage": "包含主页('/')", + "includeLoginPage": "包含登录页('/login')" }, "database": { "title": "数据库 导入/导出", @@ -359,278 +474,284 @@ "alphabetical": "按字母顺序", "globalPopularity": "按全球热度", "sortBy": "排序:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "多个,工具", "title": "PDF 多功能工具", - "desc": "合并、旋转、重新排列和删除 PDF 页面", - "tags": "多个,工具" + "desc": "合并、旋转、重新排列和删除 PDF 页面" }, "merge": { + "tags": "组合,合并,联合", "title": "合并", - "desc": "轻松将多个 PDF 合并成一个。", - "tags": "组合,合并,联合" + "desc": "轻松将多个 PDF 合并成一个。" }, "split": { + "tags": "分割,分离,拆分", "title": "拆分", - "desc": "将 PDF 拆分为多个文档。", - "tags": "分割,分离,拆分" + "desc": "将 PDF 拆分为多个文档。" }, "rotate": { + "tags": "旋转,翻转,定向", "title": "旋转", - "desc": "旋转 PDF。", - "tags": "旋转,翻转,定向" + "desc": "旋转 PDF。" }, "convert": { + "tags": "转换,更改", "title": "转换", - "desc": "在不同格式之间转换文件", - "tags": "转换,更改" + "desc": "在不同格式之间转换文件" }, "pdfOrganiser": { + "tags": "组织,重新排列,重新排序", "title": "整理", - "desc": "按任意顺序删除/重新排列页面。", - "tags": "组织,重新排列,重新排序" + "desc": "按任意顺序删除/重新排列页面。" }, "addImage": { + "tags": "插入,嵌入,放置", "title": "在 PDF 中添加图片", - "desc": "将图像添加到 PDF 的指定位置。", - "tags": "插入,嵌入,放置" + "desc": "将图像添加到 PDF 的指定位置。" }, "addAttachments": { + "tags": "嵌入,附加,包含", "title": "添加附件", - "desc": "向 PDF 添加或移除嵌入文件(附件)", - "tags": "嵌入,附加,包含" + "desc": "向 PDF 添加或移除嵌入文件(附件)" }, "watermark": { + "tags": "印章,标记,叠加", "title": "添加水印", - "desc": "在 PDF 中添加自定义水印。", - "tags": "印章,标记,叠加" + "desc": "在 PDF 中添加自定义水印。" }, "removePassword": { + "tags": "解锁", "title": "删除密码", - "desc": "从 PDF 文档中移除密码保护。", - "tags": "解锁" + "desc": "从 PDF 文档中移除密码保护。" }, "compress": { + "tags": "缩小,减少,优化", "title": "压缩", - "desc": "压缩 PDF 文件以减小文件大小。", - "tags": "缩小,减少,优化" + "desc": "压缩 PDF 文件以减小文件大小。" }, "unlockPDFForms": { + "tags": "解锁,启用,编辑", "title": "解锁PDF表单", - "desc": "移除表单字段只读属性", - "tags": "解锁,启用,编辑" + "desc": "移除表单字段只读属性" }, "changeMetadata": { + "tags": "编辑,修改,更新", "title": "更改元数据", - "desc": "更改/删除/添加 PDF 文档的元数据。", - "tags": "编辑,修改,更新" + "desc": "更改/删除/添加 PDF 文档的元数据。" }, "ocr": { + "tags": "提取,扫描", "title": "运行 OCR /清理扫描", - "desc": "清理和识别 PDF 中的图像文本,并将其转换为可编辑文本。", - "tags": "提取,扫描" + "desc": "清理和识别 PDF 中的图像文本,并将其转换为可编辑文本。" }, "extractImages": { + "tags": "提取,保存,导出", "title": "提取图像", - "desc": "从 PDF 中提取所有图像并保存到压缩包中。", - "tags": "提取,保存,导出" + "desc": "从 PDF 中提取所有图像并保存到压缩包中。" }, "scannerImageSplit": { + "tags": "检测,拆分,照片", "title": "检测/拆分扫描照片", - "desc": "从照片/PDF 中拆分出多张照片", - "tags": "检测,拆分,照片" + "desc": "从照片/PDF 中拆分出多张照片" }, "sign": { + "tags": "签名,亲笔签名", "title": "签名", - "desc": "通过绘图、文字或图像向 PDF 添加签名", - "tags": "签名,亲笔签名" + "desc": "通过绘图、文字或图像向 PDF 添加签名" }, "flatten": { + "tags": "简化,删除,交互式", "title": "展平", - "desc": "从 PDF 中删除所有互动元素和表单", - "tags": "简化,删除,交互式" + "desc": "从 PDF 中删除所有互动元素和表单" }, "certSign": { + "tags": "认证,PEM,P12,官方,加密,签名,证书,PKCS12,JKS,服务器,手动,自动", "title": "使用证书签名", - "desc": "使用证书/密钥(PEM/P12)对PDF进行签名", - "tags": "认证,PEM,P12,官方,加密,签名,证书,PKCS12,JKS,服务器,手动,自动" + "desc": "使用证书/密钥(PEM/P12)对PDF进行签名" }, "repair": { + "tags": "修复,恢复", "title": "修复", - "desc": "尝试修复损坏/损坏的 PDF", - "tags": "修复,恢复" + "desc": "尝试修复损坏/损坏的 PDF" }, "removeBlanks": { + "tags": "删除,清理,空白", "title": "删除空白页", - "desc": "检测并删除文档中的空白页", - "tags": "删除,清理,空白" + "desc": "检测并删除文档中的空白页" }, "removeAnnotations": { + "tags": "删除,清理,删除", "title": "删除标注", - "desc": "删除 PDF 中的所有标注/评论", - "tags": "删除,清理,删除" + "desc": "删除 PDF 中的所有标注/评论" }, "compare": { + "tags": "差异", "title": "比较", - "desc": "比较并显示两个 PDF 文档之间的差异", - "tags": "差异" + "desc": "比较并显示两个 PDF 文档之间的差异" }, "removeCertSign": { + "tags": "删除,删除,解锁", "title": "移除证书签名", - "desc": "移除 PDF 的证书签名", - "tags": "删除,删除,解锁" + "desc": "移除 PDF 的证书签名" }, "pageLayout": { + "tags": "布局,排列,组合", "title": "多页布局", - "desc": "将 PDF 文档的多个页面合并成一页", - "tags": "布局,排列,组合" + "desc": "将 PDF 文档的多个页面合并成一页" }, "bookletImposition": { + "tags": "小册子,打印,装订", "title": "小册子拼版", - "desc": "创建具有正确页面顺序和多页布局的小册子,用于打印和装订", - "tags": "小册子,打印,装订" + "desc": "创建具有正确页面顺序和多页布局的小册子,用于打印和装订" }, "scalePages": { + "tags": "调整大小,调整,缩放", "title": "调整页面尺寸/缩放", - "desc": "调整页面及/或其内容的尺寸/缩放", - "tags": "调整大小,调整,缩放" + "desc": "调整页面及/或其内容的尺寸/缩放" }, "addPageNumbers": { + "tags": "编号,分页,计数", "title": "添加页码", - "desc": "在文档的指定位置添加页码", - "tags": "编号,分页,计数" + "desc": "在文档的指定位置添加页码" }, "autoRename": { + "tags": "自动检测,基于标题,组织,重新标记", "title": "自动重命名 PDF 文件", - "desc": "基于检测到的页眉自动重命名 PDF 文件", - "tags": "自动检测,基于标题,组织,重新标记" + "desc": "基于检测到的页眉自动重命名 PDF 文件" }, "adjustContrast": { + "tags": "对比度,亮度,饱和度", "title": "调整颜色/对比度", - "desc": "调整 PDF 的对比度、饱和度和亮度", - "tags": "对比度,亮度,饱和度" + "desc": "调整 PDF 的对比度、饱和度和亮度" }, "crop": { + "tags": "裁剪,剪切,调整大小", "title": "裁剪 PDF", - "desc": "裁剪 PDF 以减小其文件大小(保留文本!)", - "tags": "裁剪,剪切,调整大小" + "desc": "裁剪 PDF 以减小其文件大小(保留文本!)" }, "autoSplitPDF": { + "tags": "自动,拆分,QR", "title": "自动拆分页面", - "desc": "使用物理扫描页面分割器 QR 代码自动拆分扫描的 PDF", - "tags": "自动,拆分,QR" + "desc": "使用物理扫描页面分割器 QR 代码自动拆分扫描的 PDF" }, "sanitize": { + "tags": "清理,清除,删除", "title": "安全清理", - "desc": "移除 PDF 文件中的潜在有害元素", - "tags": "清理,清除,删除" + "desc": "移除 PDF 文件中的潜在有害元素" }, "getPdfInfo": { + "tags": "信息,元数据,详细信息", "title": "获取 PDF 的所有信息", - "desc": "获取 PDF 的所有可能的信息", - "tags": "信息,元数据,详细信息" + "desc": "获取 PDF 的所有可能的信息" }, "pdfToSinglePage": { + "tags": "组合,合并,单页", "title": "PDF 转单一大页", - "desc": "将所有 PDF 页面合并为一个大的单页", - "tags": "组合,合并,单页" + "desc": "将所有 PDF 页面合并为一个大的单页" }, "showJS": { + "tags": "javascript,代码,脚本", "title": "显示 JavaScript", - "desc": "搜索并显示嵌入到 PDF 中的任何 JavaScript 代码", - "tags": "javascript,代码,脚本" + "desc": "搜索并显示嵌入到 PDF 中的任何 JavaScript 代码" }, "redact": { + "tags": "审查,涂黑,隐藏", "title": "手动修订", - "desc": "根据选定的文本、绘制的形状和/或选定的页面编辑PDF", - "tags": "审查,涂黑,隐藏" - }, - "overlayPdfs": { - "title": "叠加 PDF", - "desc": "将一个 PDF 叠加到另一个 PDF 之上", - "tags": "叠加,组合,堆叠" + "desc": "根据选定的文本、绘制的形状和/或选定的页面编辑PDF" }, "splitBySections": { + "tags": "拆分,部分,分割", "title": "按区块拆分 PDF", - "desc": "将 PDF 的每一页分割为更小的横向与纵向区块", - "tags": "拆分,部分,分割" + "desc": "将 PDF 的每一页分割为更小的横向与纵向区块" }, "addStamp": { + "tags": "印章,标记,盖章", "title": "向 PDF 添加印章", - "desc": "在指定位置添加文本或图像印章", - "tags": "印章,标记,盖章" + "desc": "在指定位置添加文本或图像印章" }, "removeImage": { + "tags": "删除,删除,清理", "title": "删除图像", - "desc": "删除图像减少 PDF 大小", - "tags": "删除,删除,清理" + "desc": "删除图像减少 PDF 大小" }, "splitByChapters": { + "tags": "拆分,章节,结构", "title": "按章节拆分 PDF", - "desc": "根据其章节结构将 PDF 拆分为多个文件。", - "tags": "拆分,章节,结构" + "desc": "根据其章节结构将 PDF 拆分为多个文件。" }, "validateSignature": { + "tags": "验证,核实,证书", "title": "验证 PDF 签名", - "desc": "验证 PDF 文档中的数字签名和证书", - "tags": "验证,核实,证书" + "desc": "验证 PDF 文档中的数字签名和证书" }, "swagger": { + "tags": "API,文档,测试", "title": "API 文档", - "desc": "查看 API 文档并测试端点", - "tags": "API,文档,测试" + "desc": "查看 API 文档并测试端点" }, - "fakeScan": { - "title": "伪扫描", - "desc": "创建看起来像扫描件的 PDF" + "scannerEffect": { + "tags": "扫描,模拟,创建", + "title": "扫描仪效果", + "desc": "创建看起来像扫描的 PDF" }, "editTableOfContents": { + "tags": "书签,目录,编辑", "title": "编辑目录", - "desc": "为 PDF 文档添加或编辑目录和书签", - "tags": "书签,目录,编辑" + "desc": "为 PDF 文档添加或编辑目录和书签" }, "manageCertificates": { + "tags": "证书,导入,导出", "title": "管理证书", - "desc": "导入、导出或删除用于签名 PDF 的数字证书文件。", - "tags": "证书,导入,导出" + "desc": "导入、导出或删除用于签名 PDF 的数字证书文件。" }, "read": { + "tags": "查看,打开,显示", "title": "阅读", - "desc": "查看与批注 PDF。高亮、绘制或插入评论以便审阅协作。", - "tags": "查看,打开,显示" + "desc": "查看与批注 PDF。高亮、绘制或插入评论以便审阅协作。" }, "reorganizePages": { + "tags": "重新排列,重新排序,组织", "title": "重组页面", - "desc": "通过可视化拖放控制重新排列、复制或删除 PDF 页面。", - "tags": "重新排列,重新排序,组织" + "desc": "通过可视化拖放控制重新排列、复制或删除 PDF 页面。" }, "extractPages": { + "tags": "提取,选择,复制", "title": "提取页面", - "desc": "从 PDF 文档中提取特定页面", - "tags": "提取,选择,复制" + "desc": "从 PDF 文档中提取特定页面" }, "removePages": { + "tags": "删除,提取,排除", "title": "删除", - "desc": "从 PDF 文档中删除不需要的页面。", - "tags": "删除,提取,排除" + "desc": "从 PDF 文档中删除不需要的页面。" }, "autoSizeSplitPDF": { + "tags": "自动,拆分,大小", "title": "自动根据大小/数目拆分 PDF", - "desc": "将单个 PDF 拆分为多个文档,基于大小、页数或文档数", - "tags": "自动,拆分,大小" + "desc": "将单个 PDF 拆分为多个文档,基于大小、页数或文档数" }, - "replaceColorPdf": { + "replaceColor": { "title": "替换和反转颜色", - "desc": "替换 PDF 中文本和背景的颜色,并将PDF反转颜色以减小文件大小" + "desc": "替换或反转 PDF 文档中的颜色" }, "devApi": { + "tags": "API,开发,文档", "title": "API", - "desc": "跳转至 API 文档", - "tags": "API,开发,文档" + "desc": "跳转至 API 文档" }, "devFolderScanning": { + "tags": "自动化,文件夹,扫描", "title": "自动文件夹扫描", - "desc": "跳转至自动文件夹扫描指南", - "tags": "自动化,文件夹,扫描" + "desc": "跳转至自动文件夹扫描指南" }, "devSsoGuide": { "title": "SSO 指南", @@ -649,18 +770,26 @@ "desc": "更改文档限制与权限" }, "automate": { + "tags": "工作流,序列,自动化", "title": "自动化", - "desc": "通过串联 PDF 操作构建多步工作流。适合重复性任务。", - "tags": "工作流,序列,自动化" + "desc": "通过串联 PDF 操作构建多步工作流。适合重复性任务。" }, - "replaceColor": { - "desc": "替换或反转 PDF 文档中的颜色", - "title": "替换和反转颜色" + "overlay-pdfs": { + "desc": "Overlay one PDF on top of another", + "title": "Overlay PDFs" }, - "scannerEffect": { - "desc": "创建看起来像扫描的 PDF", - "tags": "扫描,模拟,创建", - "title": "扫描仪效果" + "overlayPdfs": { + "title": "叠加 PDF", + "desc": "将一个 PDF 叠加到另一个 PDF 之上", + "tags": "叠加,组合,堆叠" + }, + "fakeScan": { + "title": "伪扫描", + "desc": "创建看起来像扫描件的 PDF" + }, + "replaceColorPdf": { + "title": "替换和反转颜色", + "desc": "替换 PDF 中文本和背景的颜色,并将PDF反转颜色以减小文件大小" } }, "landing": { @@ -700,13 +829,19 @@ "merge": { "tags": "合并,页面操作,后端,服务器端", "title": "合并", - "removeDigitalSignature.tooltip": { - "title": "移除数字签名", - "description": "合并文件时数字签名会失效。勾选此项以从最终合并的 PDF 中移除它们。" + "removeDigitalSignature": { + "label": "在合并的文件中删除数字签名?", + "tooltip": { + "title": "移除数字签名", + "description": "合并文件时数字签名会失效。勾选此项以从最终合并的 PDF 中移除它们。" + } }, - "generateTableOfContents.tooltip": { - "title": "生成目录", - "description": "根据原始文件名和页码,自动在合并后的 PDF 中创建可点击的目录。" + "generateTableOfContents": { + "label": "在合并的文件中生成目录?", + "tooltip": { + "title": "生成目录", + "description": "根据原始文件名和页码,自动在合并后的 PDF 中创建可点击的目录。" + } }, "submit": "合并", "sortBy": { @@ -720,12 +855,9 @@ }, "error": { "failed": "合并 PDF 时发生错误。" - }, - "generateTableOfContents": "在合并的文件中生成目录?", - "removeDigitalSignature": "在合并的文件中删除数字签名?" + } }, "split": { - "tags": "页面操作,划分,多页面,剪切,服务器端", "title": "拆分 PDF", "header": "拆分 PDF", "desc": { @@ -847,13 +979,51 @@ "bullet1": "书签层级:在第几级书签处拆分(1=顶级)", "bullet2": "包含元数据:保留文档属性", "bullet3": "允许重复:处理重复的书签名称" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" } - } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "页面操作,划分,多页面,剪切,服务器端" }, "rotate": { - "tags": "服务器端", "title": "旋转 PDF", "submit": "旋转", + "selectRotation": "Select Rotation Angle (Clockwise)", "error": { "failed": "旋转 PDF 时发生错误。" }, @@ -873,7 +1043,8 @@ "title": "控件", "text": "使用旋转按钮调整方向。左键逆时针,右键顺时针。每次点击旋转 90°。" } - } + }, + "tags": "服务器端" }, "convert": { "title": "转换", @@ -941,7 +1112,8 @@ "imagesExt": "图像(JPG、PNG 等)", "markdown": "Markdown", "textRtf": "文本/RTF", - "grayscale": "灰度" + "grayscale": "灰度", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "转换、图像、JPG、图片、照片" @@ -979,22 +1151,35 @@ "8": "删除最后一页", "9": "删除第一页和最后一页", "10": "奇偶合并", - "11": "复制所有页面" + "11": "复制所有页面", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, - "placeholder": "(例如:1,3,2 或 4-8,2,10-12 或 2n-1)", "desc": { - "BOOKLET_SORT": "排列页面以进行小册子打印(最后,第一,第二,倒数第二,...)。", "CUSTOM": "使用自定义的页码序列或表达式来定义新顺序。", - "DUPLEX_SORT": "交错正面然后背面,就像双面扫描仪扫描了所有正面,然后所有背面(1, n, 2, n-1, ...)。", - "DUPLICATE": "根据自定义顺序计数复制每页(例如,4 复制每页 4×)。", - "ODD_EVEN_MERGE": "通过交替页面合并两个 PDF:第一个的奇数页,第二个的偶数页。", - "ODD_EVEN_SPLIT": "将文档拆分为两个输出:所有奇数页和所有偶数页。", - "REMOVE_FIRST": "从文档中删除第一页。", - "REMOVE_FIRST_AND_LAST": "从文档中删除第一页和最后一页。", - "REMOVE_LAST": "从文档中删除最后一页。", "REVERSE_ORDER": "翻转文档,使最后一页变为第一页,依此类推。", - "SIDE_STITCH_BOOKLET_SORT": "排列页面以进行侧缝小册子打印(针对侧面装订进行了优化)。" - } + "DUPLEX_SORT": "交错正面然后背面,就像双面扫描仪扫描了所有正面,然后所有背面(1, n, 2, n-1, ...)。", + "BOOKLET_SORT": "排列页面以进行小册子打印(最后,第一,第二,倒数第二,...)。", + "SIDE_STITCH_BOOKLET_SORT": "排列页面以进行侧缝小册子打印(针对侧面装订进行了优化)。", + "ODD_EVEN_SPLIT": "将文档拆分为两个输出:所有奇数页和所有偶数页。", + "ODD_EVEN_MERGE": "通过交替页面合并两个 PDF:第一个的奇数页,第二个的偶数页。", + "DUPLICATE": "根据自定义顺序计数复制每页(例如,4 复制每页 4×)。", + "REMOVE_FIRST": "从文档中删除第一页。", + "REMOVE_LAST": "从文档中删除最后一页。", + "REMOVE_FIRST_AND_LAST": "从文档中删除第一页和最后一页。" + }, + "placeholder": "(例如:1,3,2 或 4-8,2,10-12 或 2n-1)" }, "addImage": { "tags": "图像、JPG、图片、照片", @@ -1045,7 +1230,9 @@ "opacity": "不透明度(%)", "spacing": { "horizontal": "水平间距", - "vertical": "垂直间距" + "vertical": "垂直间距", + "height": "Height Spacing", + "width": "Width Spacing" }, "convertToImage": "将 PDF 页面转为图像" }, @@ -1188,6 +1375,10 @@ "bullet4": "适用于敏感或受版权保护的内容" } } + }, + "type": { + "1": "Text", + "2": "Image" } }, "permissions": { @@ -1261,6 +1452,26 @@ }, "submit": "删除" }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, "pageSelection": { "tooltip": { "header": { @@ -1301,10 +1512,43 @@ }, "examples": { "title": "示例" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", "header": { "title": "页面选择指南" }, @@ -1377,7 +1621,6 @@ } }, "changeMetadata": { - "tags": "标题、作者、日期、创建、时间、发布者、制作人、统计数据", "header": "更改元数据", "submit": "更改", "filenamePrefix": "元数据", @@ -1498,7 +1741,8 @@ "bullet3": "Unknown:未指定陷印状态" } } - } + }, + "tags": "标题、作者、日期、创建、时间、发布者、制作人、统计数据" }, "fileToPDF": { "tags": "转换、格式、文档、图片、幻灯片、文本、转换、Office、Docs、Word、Excel、PowerPoint", @@ -1611,6 +1855,9 @@ "text": "在生成的 PDF 上进行后处理,移除 OCR 伪影并优化文本层以提高可读性并减小体积。" } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1620,11 +1867,11 @@ "selectText": "选择图像格式,将提取的图像转换为", "allowDuplicates": "保存重复图像", "submit": "提取", - "error": { - "failed": "从 PDF 提取图像时发生错误。" - }, "settings": { "title": "设置" + }, + "error": { + "failed": "从 PDF 提取图像时发生错误。" } }, "pdfToPDFA": { @@ -1697,14 +1944,43 @@ }, "info": "此功能需要安装 Python" }, + "scannerImageSplit": { + "title": "已提取的图像", + "submit": "提取图像扫描", + "error": { + "failed": "提取图像扫描时发生错误。" + }, + "tooltip": { + "title": "照片分割器", + "whatThisDoes": "功能说明", + "whatThisDoesDesc": "自动查找并从扫描页面或合成图像中提取每张照片 - 无需手动裁剪。", + "whenToUse": "何时使用", + "useCase1": "一次扫描整个相册页面", + "useCase2": "将平板批次拆分为单独的文件", + "useCase3": "将拼贴画拆分为单独的照片", + "useCase4": "从文档中提取照片", + "quickFixes": "快速修复", + "problem1": "未检测到照片 → 将容差增加到 30-50", + "problem2": "误检测太多 → 将最小面积增加到 15,000-20,000", + "problem3": "裁剪太紧 → 将边框大小增加到 5-10", + "problem4": "倾斜的照片未矫正 → 将角度阈值降低到 ~5°", + "problem5": "灰尘/噪声框 → 将最小轮廓面积增加到 1000-2000", + "setupTips": "设置提示", + "tip1": "使用简单的浅色背景", + "tip2": "在照片之间留出小间隙(≈1 厘米)", + "tip3": "以 300-600 DPI 扫描", + "tip4": "清洁扫描仪玻璃", + "headsUp": "注意", + "headsUpDesc": "重叠的照片或颜色与照片非常接近的背景会降低准确性 - 尝试使用更浅或更深的背景并留出更多空间。" + } + }, "sign": { - "tags": "授权、缩写、手绘签名、文本签名、图像签名", "title": "签名", "header": "签署 PDF", "upload": "上传图片", "draw": { - "clear": "清除", - "title": "绘制您的签名" + "title": "绘制您的签名", + "clear": "清除" }, "text": { "name": "签署人姓名", @@ -1714,6 +1990,7 @@ "add": "添加", "saved": "已保存签名", "save": "保存签名", + "applySignatures": "应用签名", "personalSigs": "个人签名", "sharedSigs": "共享签名", "noSavedSigs": "未找到已保存的签名", @@ -1726,37 +2003,44 @@ "maintainRatio": "切换保持长宽比", "undo": "撤销", "redo": "重做", - "activate": "激活签名放置", - "applySignatures": "应用签名", - "deactivate": "停止放置签名", - "error": { - "failed": "签署 PDF 时发生错误。" - }, - "image": { - "hint": "上传 PNG 或 JPG 格式的签名图像", - "label": "上传签名图像", - "placeholder": "选择图像文件" - }, - "instructions": { - "title": "如何添加签名" - }, - "results": { - "title": "签名结果" - }, + "submit": "签署文档", "steps": { "configure": "配置签名" }, - "submit": "签署文档", "type": { - "canvas": "画布", + "title": "签名类型", "draw": "绘制", + "canvas": "画布", "image": "图像", - "text": "文本", - "title": "签名类型" - } + "text": "文本" + }, + "image": { + "label": "上传签名图像", + "placeholder": "选择图像文件", + "hint": "上传 PNG 或 JPG 格式的签名图像" + }, + "instructions": { + "title": "如何添加签名", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "激活签名放置", + "deactivate": "停止放置签名", + "results": { + "title": "签名结果" + }, + "error": { + "failed": "签署 PDF 时发生错误。" + }, + "tags": "授权、缩写、手绘签名、文本签名、图像签名" }, "flatten": { - "tags": "静态、停用、非交互、简化", "title": "展平", "header": "展平 PDF", "flattenOnlyForms": "仅展平表格", @@ -1771,9 +2055,11 @@ "options": { "stepTitle": "扁平化选项", "title": "扁平化选项", - "flattenOnlyForms.desc": "仅扁平化表单字段,保留其他交互元素", - "note": "扁平化会移除 PDF 的交互元素,使其不可编辑。", - "flattenOnlyForms": "仅扁平化表单" + "flattenOnlyForms": { + "label": "仅扁平化表单", + "desc": "仅扁平化表单字段,保留其他交互元素" + }, + "note": "扁平化会移除 PDF 的交互元素,使其不可编辑。" }, "results": { "title": "扁平化结果" @@ -1801,7 +2087,8 @@ "bullet3": "批注与备注仍可见", "bullet4": "书签仍可用于导航" } - } + }, + "tags": "静态、停用、非交互、简化" }, "repair": { "tags": "修复、恢复、纠正、恢复", @@ -1821,7 +2108,6 @@ } }, "removeBlanks": { - "tags": "清理、简化、非内容、整理", "title": "删除空白", "header": "删除空白页", "settings": { @@ -1863,22 +2149,29 @@ "bullet3": "可关闭以减小输出文件大小" } }, - "submit": "删除空白" + "submit": "删除空白", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "清理、简化、非内容、整理" }, "removeAnnotations": { "tags": "评论、高亮、笔记、标注、删除", "title": "删除标注", "header": "删除标注", "submit": "删除", - "error": { - "failed": "从 PDF 删除注释时发生错误。" - }, - "info": { - "description": "此工具将从您的 PDF 文档中删除所有注释(评论、高亮、笔记等)。", - "title": "关于删除注释" - }, "settings": { "title": "设置" + }, + "info": { + "title": "关于删除注释", + "description": "此工具将从您的 PDF 文档中删除所有注释(评论、高亮、笔记等)。" + }, + "error": { + "failed": "从 PDF 删除注释时发生错误。" } }, "compare": { @@ -1965,7 +2258,12 @@ "bullet3": "可选择放置签名的页面", "bullet4": "可选添加徽标" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, "sign": { "submit": "签署 PDF", @@ -2026,7 +2324,22 @@ "text": "使用 keytool 将文件转换为 Java 密钥库(.jks),然后选择 JKS。" } } - } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Certificate Password", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo" }, "removeCertSign": { "tags": "身份验证、PEM、P12、官方、加密", @@ -2052,7 +2365,17 @@ "header": "多页布局", "pagesPerSheet": "每页的页面数:", "addBorder": "添加边框", - "submit": "提交" + "submit": "提交", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "小册子,拼版,打印,装订,折叠,签名", @@ -2228,7 +2551,6 @@ "tags": "颜色校正、调节、修改、增强" }, "crop": { - "tags": "修剪、缩小、编辑、形状", "title": "裁剪", "header": "裁剪 PDF", "submit": "提交", @@ -2239,10 +2561,22 @@ "reset": "重置为整页", "coordinates": { "title": "位置与尺寸", - "x": "X 位置", - "y": "Y 位置", - "width": "宽度", - "height": "高度" + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } }, "error": { "invalidArea": "裁剪区域超出 PDF 边界", @@ -2260,7 +2594,12 @@ }, "results": { "title": "裁剪结果" - } + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "修剪、缩小、编辑、形状" }, "autoSplitPDF": { "tags": "基于 QR 码、分离、扫描分割、整理", @@ -2470,11 +2809,15 @@ "overlay-pdfs": { "tags": "叠加", "header": "叠加 PDF 文件", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "选择基础 PDF 文件" }, "overlayFiles": { - "label": "选择需要叠加在基础上的 PDF 文件" + "label": "选择需要叠加在基础上的 PDF 文件", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "选择叠加模式", @@ -2484,14 +2827,53 @@ }, "counts": { "label": "叠加次数(仅限固定重复叠加模式)", - "placeholder": "输入用逗号分隔的次数(例如:2,3,1)" + "placeholder": "输入用逗号分隔的次数(例如:2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "选择叠加位置", "foreground": "前面(上面)", "background": "后面(下面)" }, - "submit": "提交" + "submit": "提交", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "章节拆分、分割、自定义", @@ -2526,7 +2908,18 @@ "customMargin": "自定义外边距", "customColor": "自定义文本颜色", "submit": "提交", - "noStampSelected": "未选择印章。返回到第 1 步。" + "noStampSelected": "未选择印章。返回到第 1 步。", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "删除图像, 页面操作, 后端, 服务端" @@ -2544,7 +2937,8 @@ "status": { "_value": "状态", "valid": "有效", - "invalid": "无效" + "invalid": "无效", + "complete": "Validation complete" }, "signer": "签署者", "date": "日期", @@ -2571,35 +2965,115 @@ "version": "版本", "keyUsage": "密钥用途", "selfSigned": "自签名", - "bits": "比特" + "bits": "比特", + "details": "Certificate Details" }, "signature": { "info": "签名信息", "_value": "签名", "mathValid": "签名在数学上有效,但:" }, - "selectCustomCert": "X.509 自签名证书(可选)" - }, - "replace-color": { - "title": "替换-反转-颜色", - "header": "替换-反转 PDF 颜色", - "selectText": { - "1": "替换或反转颜色选项", - "2": "默认(默认高对比度颜色)", - "3": "定制(定制的颜色)", - "4": "全反转(反转所有颜色)", - "5": "高对比度颜色选项", - "6": "黑底白字", - "7": "白底黑字", - "8": "黑底黄字", - "9": "黑底绿字", - "10": "选择文本颜色", - "11": "选择背景颜色" + "selectCustomCert": "X.509 自签名证书(可选)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "取代" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "更换颜色,页面操作,后端,服务器端" + "replaceColor": { + "tags": "替换颜色,页面操作,后端,服务器端", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "登录", @@ -2632,6 +3106,11 @@ "enterEmail": "输入您的邮箱", "enterPassword": "输入您的密码", "loggingIn": "正在登录…", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", "signingIn": "正在登录…", "login": "登录", "or": "或", @@ -2649,7 +3128,10 @@ "magicLinkSent": "魔法链接已发送至 {{email}}!请检查邮箱并点击链接登录。", "passwordResetSent": "密码重置链接已发送至 {{email}}!请检查邮箱并按指引操作。", "failedToSignIn": "使用 {{provider}} 登录失败:{{message}}", - "unexpectedError": "意外错误:{{message}}" + "unexpectedError": "意外错误:{{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." }, "signup": { "title": "创建账户", @@ -2672,7 +3154,12 @@ "invalidEmail": "请输入有效的邮箱地址", "checkEmailConfirmation": "请检查邮箱中的确认链接以完成注册。", "accountCreatedSuccessfully": "账户创建成功!您现在可以登录。", - "unexpectedError": "意外错误:{{message}}" + "unexpectedError": "意外错误:{{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF 转单页", @@ -2712,10 +3199,23 @@ "adjustContrast": { "title": "调整对比度", "header": "调整对比度", + "basic": "Basic Adjustments", "contrast": "对比度:", "brightness": "亮度:", "saturation": "饱和度:", - "download": "下载" + "download": "下载", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "压缩", @@ -2862,7 +3362,13 @@ "title": "删除图像", "header": "删除图像", "removeImage": "删除图像", - "submit": "删除图像" + "submit": "删除图像", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "按章节拆分 PDF", @@ -2937,6 +3443,10 @@ "title": "分析统计", "description": "这些Cookie帮助我们分析工具使用情况,以便聚焦开发用户最需要的功能。再次强调:Stirling PDF绝不会追踪您处理的文档内容。" } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, "removeMetadata": { @@ -2998,11 +3508,18 @@ "panMode": "平移模式", "rotateLeft": "向左旋转", "rotateRight": "向右旋转", - "toggleSidebar": "切换侧边栏" + "toggleSidebar": "切换侧边栏", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" }, "search": { "title": "搜索 PDF", - "placeholder": "输入搜索词…" + "placeholder": "输入搜索词…", + "noResults": "No results found", + "searching": "Searching..." }, "guestBanner": { "title": "您正在以访客身份使用 Stirling PDF!", @@ -3040,9 +3557,597 @@ "automate": "自动化", "files": "文件", "activity": "活动", + "help": "Help", + "account": "Account", "config": "配置", + "adminSettings": "Admin Settings", "allTools": "全部工具" }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, "fileUpload": { "selectFile": "选择文件", "selectFiles": "选择文件", @@ -3067,6 +4172,9 @@ "addFiles": "添加文件", "dragFilesInOrClick": "拖入文件或点击“添加文件”浏览" }, + "fileEditor": { + "addFiles": "Add Files" + }, "fileManager": { "title": "上传 PDF 文件", "subtitle": "将文件添加到您的存储,以便在各工具之间轻松访问", @@ -3095,6 +4203,7 @@ "lastModified": "上次修改", "toolChain": "已应用工具", "restore": "恢复", + "unzip": "Unzip", "searchFiles": "搜索文件…", "recent": "最近", "localFiles": "本地文件", @@ -3102,7 +4211,6 @@ "googleDriveShort": "Drive", "myFiles": "我的文件", "noRecentFiles": "未找到最近文件", - "dropFilesHint": "将文件拖到此处即可上传", "googleDriveNotAvailable": "不可使用 Google 云端硬盘集成", "openFiles": "打开文件", "openFile": "打开文件", @@ -3120,7 +4228,18 @@ "selectedCount": "已选 {{count}}", "download": "下载", "delete": "删除", - "unsupported": "不支持" + "unsupported": "不支持", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "将文件拖到此处即可上传" }, "storage": { "temporaryNotice": "文件临时存储在您的浏览器中,可能会被自动清除", @@ -3136,8 +4255,10 @@ "desc": "移除 PDF 文件中的潜在有害元素。", "submit": "清理 PDF", "completed": "安全清理成功完成", - "error.generic": "安全清理失败", - "error.failed": "安全清理 PDF 时发生错误。", + "error": { + "generic": "安全清理失败", + "failed": "安全清理 PDF 时发生错误。" + }, "filenamePrefix": "已清理", "sanitizationResults": "安全清理结果", "steps": { @@ -3151,18 +4272,30 @@ "options": { "title": "安全清理选项", "note": "请选择要从 PDF 中移除的元素。至少需要选择一个选项。", - "removeJavaScript.desc": "移除 PDF 中的 JavaScript 操作与脚本", - "removeEmbeddedFiles.desc": "移除嵌入在 PDF 中的任何文件", - "removeXMPMetadata.desc": "从 PDF 中移除 XMP 元数据", - "removeMetadata.desc": "移除文档信息元数据(标题、作者等)", - "removeLinks.desc": "移除外部链接与启动动作", - "removeFonts.desc": "从 PDF 中移除嵌入字体", - "removeEmbeddedFiles": "删除嵌入文件", - "removeFonts": "删除字体", - "removeJavaScript": "删除 JavaScript", - "removeLinks": "删除链接", - "removeMetadata": "删除文档元数据", - "removeXMPMetadata": "删除 XMP 元数据" + "removeJavaScript": { + "label": "删除 JavaScript", + "desc": "移除 PDF 中的 JavaScript 操作与脚本" + }, + "removeEmbeddedFiles": { + "label": "删除嵌入文件", + "desc": "移除嵌入在 PDF 中的任何文件" + }, + "removeXMPMetadata": { + "label": "删除 XMP 元数据", + "desc": "从 PDF 中移除 XMP 元数据" + }, + "removeMetadata": { + "label": "删除文档元数据", + "desc": "移除文档信息元数据(标题、作者等)" + }, + "removeLinks": { + "label": "删除链接", + "desc": "移除外部链接与启动动作" + }, + "removeFonts": { + "label": "删除字体", + "desc": "从 PDF 中移除嵌入字体" + } } }, "addPassword": { @@ -3383,9 +4516,14 @@ "remaining": "剩余", "used": "已用", "available": "可用", - "cancel": "取消" + "cancel": "取消", + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { "title": "账户设置", @@ -3431,57 +4569,584 @@ "generateError": "我们无法生成您的 API 密钥。" } }, - "termsAndConditions": "条款与条件", - "logOut": "退出登录", "AddAttachmentsRequest": { - "addMoreFiles": "添加更多文件...", "attachments": "选择附件", "info": "选择要附加到 PDF 的文件。这些文件将被嵌入并可通过 PDF 的附件面板访问。", + "selectFiles": "选择要附加的文件", "placeholder": "选择文件...", + "addMoreFiles": "添加更多文件...", + "selectedFiles": "已选择的文件", + "submit": "添加附件", "results": { "title": "附件结果" }, - "selectFiles": "选择要附加的文件", - "selectedFiles": "已选择的文件", - "submit": "添加附件" - }, - "applyAndContinue": "应用并继续", - "discardChanges": "放弃更改", - "exportAndContinue": "导出并继续", - "keepWorking": "继续工作", - "replaceColor": { - "tags": "替换颜色,页面操作,后端,服务器端" - }, - "scannerImageSplit": { "error": { - "failed": "提取图像扫描时发生错误。" - }, - "submit": "提取图像扫描", - "title": "已提取的图像", - "tooltip": { - "headsUp": "注意", - "headsUpDesc": "重叠的照片或颜色与照片非常接近的背景会降低准确性 - 尝试使用更浅或更深的背景并留出更多空间。", - "problem1": "未检测到照片 → 将容差增加到 30-50", - "problem2": "误检测太多 → 将最小面积增加到 15,000-20,000", - "problem3": "裁剪太紧 → 将边框大小增加到 5-10", - "problem4": "倾斜的照片未矫正 → 将角度阈值降低到 ~5°", - "problem5": "灰尘/噪声框 → 将最小轮廓面积增加到 1000-2000", - "quickFixes": "快速修复", - "setupTips": "设置提示", - "tip1": "使用简单的浅色背景", - "tip2": "在照片之间留出小间隙(≈1 厘米)", - "tip3": "以 300-600 DPI 扫描", - "tip4": "清洁扫描仪玻璃", - "title": "照片分割器", - "useCase1": "一次扫描整个相册页面", - "useCase2": "将平板批次拆分为单独的文件", - "useCase3": "将拼贴画拆分为单独的照片", - "useCase4": "从文档中提取照片", - "whatThisDoes": "功能说明", - "whatThisDoesDesc": "自动查找并从扫描页面或合成图像中提取每张照片 - 无需手动裁剪。", - "whenToUse": "何时使用" + "failed": "Add attachments operation failed" } }, - "unsavedChanges": "您的 PDF 有未保存的更改。您想做什么?", - "unsavedChangesTitle": "未保存的更改" -} \ No newline at end of file + "termsAndConditions": "条款与条件", + "logOut": "退出登录", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "替换或反转颜色选项", + "2": "默认(默认高对比度颜色)", + "3": "定制(定制的颜色)", + "4": "全反转(反转所有颜色)", + "5": "高对比度颜色选项", + "6": "黑底白字", + "7": "白底黑字", + "8": "黑底黄字", + "9": "黑底绿字", + "10": "选择文本颜色", + "11": "选择背景颜色", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "取代", + "title": "替换-反转-颜色", + "header": "替换-反转 PDF 颜色" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "replaceColorPdf": { + "tags": "更换颜色,页面操作,后端,服务器端" + } +} diff --git a/frontend/public/locales/zh-TW/translation.json b/frontend/public/locales/zh-TW/translation.json index c27acf642..4a3a7cf01 100644 --- a/frontend/public/locales/zh-TW/translation.json +++ b/frontend/public/locales/zh-TW/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "自訂文字", "numberPagesDesc": "要編號的頁面,預設為 '全部',也可使用 1-5 或 2,5,9 等格式", "customNumberDesc": "預設為 {n},也接受 '頁面 {n} 共 {total}','文字-{n}','{filename}-{n}'", - "submit": "新增頁碼" + "submit": "新增頁碼", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "自訂頁面選擇(輸入以逗號分隔的頁碼 1、5、6 或 2n+1 等函式的清單):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "選擇 PDF 檔案", "multiPdfPrompt": "選擇多個 PDF 檔案", "multiPdfDropPrompt": "選擇(或拖放)所有需要的 PDF 檔案", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "太大。允許的最大檔案大小為", "processTimeWarning": "警告:此過程可能長達一分鐘,具體取決於檔案大小", "pageOrderPrompt": "自訂頁面順序(輸入以逗號分隔的頁碼或函式,如 2n+1):", - "pageSelectionPrompt": "自訂頁面選擇(輸入以逗號分隔的頁碼 1、5、6 或 2n+1 等函式的清單):", "goToPage": "前往", "true": "是", "false": "否", "unknown": "未知", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "儲存", "saveToBrowser": "儲存到瀏覽器", + "download": "下載", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "撤銷", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "關閉", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "已選擇的檔案", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "還沒有功能被收藏", "downloadComplete": "下載完成", "bored": "等待時覺得無聊?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF 檔案已加密,但未提供密碼或密碼不正確", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "錯誤", + "dismissAllErrors": "Dismiss All Errors", "sorry": "很抱歉造成您的困擾!", "needHelp": "需要協助或發現問題?", "contactTip": "如果您仍然遇到問題,請不要猶豫,隨時向我們尋求協助。您可以在我們的 GitHub 頁面回報問題,或透過 Discord 跟我們聯絡:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - 回報問題", "discordSubmit": "Discord - 發表支援文章" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "刪除", "username": "使用者名稱", "password": "密碼", @@ -82,6 +169,7 @@ "green": "綠色", "blue": "藍色", "custom": "自訂...", + "comingSoon": "Coming soon", "WorkInProgess": "工作正在進行中,可能無法工作或有問題,請報告任何問題!", "poweredBy": "Powered by", "yes": "是", @@ -115,12 +203,14 @@ "page": "頁面", "pages": "頁面", "loading": "載入中...", + "review": "Review", "addToDoc": "新增至文件", "reset": "重設", "apply": "套用", "noFileSelected": "未選擇檔案,請上傳一個。", "legal": { "privacy": "隱私權政策", + "iAgreeToThe": "I agree to all of the", "terms": "使用條款", "accessibility": "無障礙性聲明", "cookie": "Cookie 政策", @@ -160,6 +250,7 @@ "title": "您想協助改善 Stirling PDF 嗎?", "paragraph1": "Stirling PDF 有選擇性的分析功能,可幫助我們改進產品。我們不會追蹤任何個人資訊或檔案內容。", "paragraph2": "請考慮啟用分析功能,以協助 Stirling-PDF 成長並讓我們更了解使用者需求。", + "learnMore": "Learn more", "enable": "啟用分析功能", "disable": "停用分析功能", "settings": "您可以在 config/settings.yml 檔案中變更分析功能的設定" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "儲存表單輸入", "help": "啟用此功能以儲存先前使用的輸入,以便日後使用" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keys… (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "前 20 名", "all": "全部", "refresh": "重新整理", - "includeHomepage": "包含首頁 ('/')", - "includeLoginPage": "包含登入頁面 ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "端點總數", "totalVisits": "總造訪次數", "showing": "顯示中", @@ -290,7 +431,9 @@ "top": "前", "numberOfVisits": "造訪次數", "visitsTooltip": "造訪次數:{0}(總數的 {1}%)", - "retry": "重試" + "retry": "重試", + "includeHomepage": "包含首頁 ('/')", + "includeLoginPage": "包含登入頁面 ('/login')" }, "database": { "title": "資料庫匯入/匯出", @@ -331,22 +474,310 @@ "alphabetical": "按照字母排序", "globalPopularity": "熱門程度", "sortBy": "排序方式:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF 複合工具", "desc": "合併、旋轉、重新排列和移除頁面" }, "merge": { + "tags": "combine,join,unite", "title": "合併", "desc": "輕鬆將多個 PDF 合併為一個。" }, "split": { + "tags": "divide,separate,break", "title": "分割", "desc": "將 PDF 分割為多個文件" }, "rotate": { + "tags": "turn,flip,orient", "title": "旋轉", "desc": "輕鬆旋轉您的 PDF。" }, + "convert": { + "tags": "transform,change", + "title": "轉換", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "整理", + "desc": "以任何順序移除/重新排列頁面" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "新增圖片", + "desc": "在 PDF 的指定位置新增圖片" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "新增浮水印", + "desc": "在您的 PDF 檔案中新增自訂浮水印。" + }, + "removePassword": { + "tags": "unlock", + "title": "移除密碼", + "desc": "從您的 PDF 檔案中移除密碼保護。" + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "壓縮", + "desc": "壓縮 PDF 以減少其檔案大小。" + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "解鎖 PDF 表單", + "desc": "移除 PDF 文件中表單欄位的唯讀屬性" + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "變更中繼資料", + "desc": "從 PDF 檔案中變更/移除/新增中繼資料" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / 清理掃描", + "desc": "清理掃描並從 PDF 中的影像中偵測文字並重新新增為文字。" + }, + "extractImages": { + "tags": "pull,save,export", + "title": "提取圖片", + "desc": "從 PDF 中提取所有圖片並將它們儲存到壓縮檔中" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "簽章", + "desc": "透過繪圖、文字或影像新增簽章到 PDF" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "平坦化", + "desc": "從 PDF 中移除所有互動元素和表單" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "使用憑證簽章", + "desc": "使用憑證/金鑰(PEM/P12)簽章 PDF" + }, + "repair": { + "tags": "fix,restore", + "title": "修復", + "desc": "嘗試修復損壞/破損的 PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "移除空白頁面", + "desc": "偵測並從文件中移除空白頁面" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "移除註釋", + "desc": "從 PDF 中移除所有註釋/註解" + }, + "compare": { + "tags": "difference", + "title": "比較", + "desc": "比較並顯示 2 個 PDF 檔案的差異" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "移除簽章", + "desc": "從 PDF 移除簽章" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "多頁面版面配置", + "desc": "將 PDF 檔案的多個頁面合併到單一頁面" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "調整頁面大小/比例", + "desc": "修改頁面及其內容的大小/比例。" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "新增頁碼", + "desc": "在文件的設定位置新增頁碼" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "調整顏色/對比度", + "desc": "調整 PDF 的對比度、飽和度和亮度" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "裁剪 PDF", + "desc": "裁剪 PDF 以減少其大小(保持文字!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "自動分割頁面", + "desc": "自動分割掃描的 PDF,使用實體掃描頁面分割器 QR Code" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "取得 PDF 的所有資訊", + "desc": "取得 PDF 的所有可能資訊" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF 轉單一大頁面", + "desc": "將所有 PDF 頁面合併為一個大的單一頁面" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "顯示 JavaScript", + "desc": "搜尋並顯示嵌入 PDF 中的任何 JS(JavaScript)" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "手動塗黑", + "desc": "依據選取的文字、繪製的形狀和選取的頁面塗黑 PDF" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "移除圖片", + "desc": "從 PDF 中移除圖片以減少檔案大小" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "依章節分割 PDF", + "desc": "根據 PDF 的章節結構將其分割成多個檔案。" + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "驗證 PDF 簽章", + "desc": "驗證 PDF 文件中的數位簽章與憑證" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "編輯目錄", + "desc": "在 PDF 文件中新增或編輯書籤和目錄" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "提取頁面", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "移除", + "desc": "從您的 PDF 檔案中刪除不需要的頁面。" + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "根據大小/數量自動分割", + "desc": "根據大小、頁數或文件數將單一 PDF 分割為多個文件" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "新增密碼", + "desc": "用密碼加密您的 PDF 檔案。" + }, + "changePermissions": { + "title": "變更權限", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "將 PDF 覆蓋在另一個 PDF 上", + "title": "覆蓋 PDF" + }, "imageToPDF": { "title": "圖片轉 PDF", "desc": "將圖片(PNG、JPEG、GIF)轉換為 PDF。" @@ -355,18 +786,6 @@ "title": "PDF 轉圖片", "desc": "將 PDF 轉換為圖片。(PNG、JPEG、GIF)" }, - "pdfOrganiser": { - "title": "整理", - "desc": "以任何順序移除/重新排列頁面" - }, - "addImage": { - "title": "新增圖片", - "desc": "在 PDF 的指定位置新增圖片" - }, - "watermark": { - "title": "新增浮水印", - "desc": "在您的 PDF 檔案中新增自訂浮水印。" - }, "permissions": { "title": "修改權限", "desc": "修改您的 PDF 檔案權限" @@ -375,38 +794,10 @@ "title": "移除", "desc": "從您的 PDF 檔案中刪除不需要的頁面。" }, - "addPassword": { - "title": "新增密碼", - "desc": "用密碼加密您的 PDF 檔案。" - }, - "removePassword": { - "title": "移除密碼", - "desc": "從您的 PDF 檔案中移除密碼保護。" - }, - "compress": { - "title": "壓縮", - "desc": "壓縮 PDF 以減少其檔案大小。" - }, - "unlockPDFForms": { - "title": "解鎖 PDF 表單", - "desc": "移除 PDF 文件中表單欄位的唯讀屬性" - }, - "changeMetadata": { - "title": "變更中繼資料", - "desc": "從 PDF 檔案中變更/移除/新增中繼資料" - }, "fileToPDF": { "title": "檔案轉 PDF", "desc": "將幾乎所有格式轉換為 PDF(DOCX、PNG、XLS、PPT、TXT 等等)" }, - "ocr": { - "title": "OCR / 清理掃描", - "desc": "清理掃描並從 PDF 中的影像中偵測文字並重新新增為文字。" - }, - "extractImages": { - "title": "提取圖片", - "desc": "從 PDF 中提取所有圖片並將它們儲存到壓縮檔中" - }, "pdfToPDFA": { "title": "PDF 轉 PDF/A", "desc": "將 PDF 轉換為長期儲存的 PDF/A" @@ -435,70 +826,14 @@ "title": "偵測/分割掃描照片", "desc": "從照片/PDF 中分割多張照片" }, - "sign": { - "title": "簽章", - "desc": "透過繪圖、文字或影像新增簽章到 PDF" - }, - "flatten": { - "title": "平坦化", - "desc": "從 PDF 中移除所有互動元素和表單" - }, - "repair": { - "title": "修復", - "desc": "嘗試修復損壞/破損的 PDF" - }, - "removeBlanks": { - "title": "移除空白頁面", - "desc": "偵測並從文件中移除空白頁面" - }, - "removeAnnotations": { - "title": "移除註釋", - "desc": "從 PDF 中移除所有註釋/註解" - }, - "compare": { - "title": "比較", - "desc": "比較並顯示 2 個 PDF 檔案的差異" - }, - "certSign": { - "title": "使用憑證簽章", - "desc": "使用憑證/金鑰(PEM/P12)簽章 PDF" - }, - "removeCertSign": { - "title": "移除簽章", - "desc": "從 PDF 移除簽章" - }, - "pageLayout": { - "title": "多頁面版面配置", - "desc": "將 PDF 檔案的多個頁面合併到單一頁面" - }, - "scalePages": { - "title": "調整頁面大小/比例", - "desc": "修改頁面及其內容的大小/比例。" - }, "pipeline": { "title": "管道(進階)", "desc": "透過定義管道指令碼在 PDF 上執行多個操作" }, - "addPageNumbers": { - "title": "新增頁碼", - "desc": "在文件的設定位置新增頁碼" - }, "auto-rename": { "title": "自動重新命名 PDF 檔案", "desc": "根據其偵測到的標頭自動重新命名 PDF 檔案" }, - "adjustContrast": { - "title": "調整顏色/對比度", - "desc": "調整 PDF 的對比度、飽和度和亮度" - }, - "crop": { - "title": "裁剪 PDF", - "desc": "裁剪 PDF 以減少其大小(保持文字!)" - }, - "autoSplitPDF": { - "title": "自動分割頁面", - "desc": "自動分割掃描的 PDF,使用實體掃描頁面分割器 QR Code" - }, "sanitizePDF": { "title": "清理", "desc": "從 PDF 檔案中移除指令碼和其他元素" @@ -519,30 +854,14 @@ "title": "PDF 轉 Markdown", "desc": "將任何 PDF 轉換為 Markdown 檔案" }, - "getPdfInfo": { - "title": "取得 PDF 的所有資訊", - "desc": "取得 PDF 的所有可能資訊" - }, "pageExtracter": { "title": "提取多個頁面", "desc": "從 PDF 中提取選定的頁面" }, - "pdfToSinglePage": { - "title": "PDF 轉單一大頁面", - "desc": "將所有 PDF 頁面合併為一個大的單一頁面" - }, - "showJS": { - "title": "顯示 JavaScript", - "desc": "搜尋並顯示嵌入 PDF 中的任何 JS(JavaScript)" - }, "autoRedact": { "title": "自動塗黑", "desc": "根據輸入的文字自動塗黑 PDF 中的文字" }, - "redact": { - "title": "手動塗黑", - "desc": "依據選取的文字、繪製的形狀和選取的頁面塗黑 PDF" - }, "PDFToCSV": { "title": "PDF 轉 CSV", "desc": "從 PDF 中提取表格並將其轉換為 CSV" @@ -551,10 +870,6 @@ "title": "根據大小/數量自動分割", "desc": "根據大小、頁數或文件數將單一 PDF 分割為多個文件" }, - "overlay-pdfs": { - "title": "覆蓋 PDF", - "desc": "將 PDF 覆蓋在另一個 PDF 上" - }, "split-by-sections": { "title": "依區段分割 PDF", "desc": "將 PDF 的每一頁分割為較小的水平和垂直區段" @@ -563,48 +878,18 @@ "title": "將圖章新增到 PDF", "desc": "在設定位置新增文字或新增影像圖章" }, - "removeImage": { - "title": "移除圖片", - "desc": "從 PDF 中移除圖片以減少檔案大小" - }, - "splitByChapters": { - "title": "依章節分割 PDF", - "desc": "根據 PDF 的章節結構將其分割成多個檔案。" - }, - "validateSignature": { - "title": "驗證 PDF 簽章", - "desc": "驗證 PDF 文件中的數位簽章與憑證" - }, "replace-color": { "title": "取代與反轉顏色", "desc": "取代 PDF 中文字和背景的顏色,並反轉整個 PDF 的顏色以減少檔案大小" }, - "convert": { - "title": "轉換" - }, "attachments": { "title": "新增附件", "desc": "將檔案(附件)新增或移除至/從 PDF" }, - "editTableOfContents": { - "title": "編輯目錄", - "desc": "在 PDF 文件中新增或編輯書籤和目錄" - }, - "extractPages": { - "title": "提取頁面" - }, - "removePages": { - "title": "移除", - "desc": "從您的 PDF 檔案中刪除不需要的頁面。" - }, "removeImagePdf": { "title": "移除圖片", "desc": "從 PDF 中移除圖片以減少檔案大小" }, - "autoSizeSplitPDF": { - "title": "根據大小/數量自動分割", - "desc": "根據大小、頁數或文件數將單一 PDF 分割為多個文件" - }, "adjust-contrast": { "title": "調整顏色/對比", "desc": "調整 PDF 的對比、飽和度和亮度" @@ -612,11 +897,12 @@ "replaceColorPdf": { "title": "取代與反轉顏色", "desc": "取代 PDF 中文字和背景的顏色,並反轉整個 PDF 的顏色以減少檔案大小" - }, - "changePermissions": { - "title": "變更權限" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "檢視,閱讀,註釋,文字,圖片", "title": "檢視/編輯 PDF", @@ -650,17 +936,39 @@ "merge": { "tags": "合併,頁面操作,後端,伺服器端", "title": "合併", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "合併", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "檔案名稱", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "合併多個 PDF", "sortByName": "依名稱排序", "sortByDate": "依日期排序", - "removeCertSign": "是否移除合併後檔案的憑證簽章?", - "submit": "合併", - "sortBy": { - "filename": "檔案名稱" - } + "removeCertSign": "是否移除合併後檔案的憑證簽章?" }, "split": { - "tags": "頁面操作,劃分,多頁,剪下,伺服器端", "title": "分割 PDF", "header": "分割 PDF", "desc": { @@ -676,25 +984,249 @@ "splitPages": "輸入要分割的頁面:", "submit": "分割", "steps": { + "chooseMethod": "Choose Method", "settings": "設定" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "檔案大小" + "name": "檔案大小", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "檔案大小" + "label": "檔案大小", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "頁面操作,劃分,多頁,剪下,伺服器端" }, "rotate": { - "tags": "伺服器端", "title": "旋轉 PDF", + "submit": "旋轉", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "伺服器端", "header": "旋轉 PDF", - "selectAngle": "選擇旋轉角度(以 90 度的倍數):", - "submit": "旋轉" + "selectAngle": "選擇旋轉角度(以 90 度的倍數):" + }, + "convert": { + "title": "轉換", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "設定", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "顏色", + "greyscale": "灰度", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "填充頁面", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "該 PDF 的憑證簽章將會在下一步被移除", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "灰度", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "轉換,img,jpg,圖片,照片" @@ -732,7 +1264,33 @@ "8": "刪除最後一頁", "9": "刪除第一頁和最後一頁", "10": "奇偶合併", - "11": "複製所有頁面" + "11": "複製所有頁面", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(例如 1,3,2 或 4-8,2,10-12 或 2n-1)" }, @@ -744,9 +1302,198 @@ "upload": "新增圖片", "submit": "新增圖片" }, + "attachments": { + "tags": "嵌入,附件,檔案,附加,附件管理", + "title": "新增附件", + "header": "新增附件", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "新增附件" + }, "watermark": { - "tags": "文字,重複,標籤,自有,版權,商標,img,jpg,圖片,照片", "title": "新增浮水印", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "新增浮水印", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "文字", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "字型大小", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "文字", + "2": "圖片" + }, + "tags": "文字,重複,標籤,自有,版權,商標,img,jpg,圖片,照片", "header": "新增浮水印", "customColor": "自訂文字顏色", "selectText": { @@ -760,17 +1507,6 @@ "8": "浮水印類型:", "9": "浮水印影像:", "10": "將 PDF 轉換為 PDF 影像" - }, - "submit": "新增浮水印", - "type": { - "1": "文字", - "2": "圖片" - }, - "watermarkType": { - "text": "文字" - }, - "settings": { - "fontSize": "字型大小" } }, "permissions": { @@ -795,50 +1531,201 @@ "removePages": { "tags": "移除頁面,刪除頁面", "title": "移除", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "移除" }, - "addPassword": { - "tags": "安全,安全性", - "title": "新增密碼", - "header": "新增密碼(加密)", - "selectText": { - "1": "選擇要加密的 PDF", - "2": "使用者密碼", - "3": "加密金鑰長度", - "4": "較高的值更強,但較低的值具有更好的相容性。", - "5": "要設定的權限(建議與擁有者密碼一起使用)", - "6": "防止文件組裝", - "7": "防止內容提取", - "8": "防止為了無障礙使用而提取資料", - "9": "防止填寫表單", - "10": "防止修改", - "11": "防止註釋修改", - "12": "防止列印", - "13": "防止列印不同格式", - "14": "擁有者密碼", - "15": "限制一旦開啟文件可以做什麼(並非所有軟體都支援)", - "16": "限制開啟文件本身" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "加密", "tooltip": { - "permissions": { - "title": "變更權限" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6…)", + "bullet2": "2n-1 → all odd pages (1, 3, 5…)", + "bullet3": "3n → every 3rd page (3, 6, 9…)", + "bullet4": "4n-1 → pages 3, 7, 11, 15…", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "安全,解密,安全性,取消密碼,刪除密碼", - "title": "移除密碼", - "header": "移除密碼(解密)", - "selectText": { - "1": "選擇要解密的 PDF", - "2": "密碼" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "移除", - "desc": "從您的 PDF 檔案中移除密碼保護。", - "password": { - "stepTitle": "移除密碼", - "label": "目前密碼" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -848,12 +1735,142 @@ "tags": "移除,刪除,表格,欄位,唯讀", "title": "移除表單欄位的唯讀限制", "header": "解鎖 PDF 表單", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "標題,作者,日期,建立,時間,出版商,製作人,統計", - "title": "標題:", "header": "變更中繼資料", + "submit": "變更", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "標題,作者,日期,建立,時間,出版商,製作人,統計", "selectText": { "1": "請編輯你希望變更的變數", "2": "刪除所有中繼資料", @@ -861,15 +1878,7 @@ "4": "其他中繼資料:", "5": "新增自訂中繼資料項目" }, - "author": "作者:", - "creationDate": "建立日期(yyyy/MM/dd HH:mm:ss):", - "creator": "建立者:", - "keywords": "關鍵字:", - "modDate": "修改日期(yyyy/MM/dd HH:mm:ss):", - "producer": "製作人:", - "subject": "主題:", - "trapped": "陷阱:", - "submit": "變更" + "modDate": "修改日期(yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "轉換,格式,文件,圖片,投影片,文字,轉換,office,docs,Word,Excel,PowerPoint", @@ -883,6 +1892,7 @@ "ocr": { "tags": "識別,文字,影像,掃描,讀取,識別,偵測,可編輯", "title": "OCR / 掃描清理", + "desc": "清理掃描並從 PDF 中的影像中偵測文字並重新新增為文字。", "header": "清理掃描 / OCR(光學字元識別)", "selectText": { "1": "選擇要在 PDF 中偵測的語言(列出的是目前可以偵測的語言):", @@ -901,23 +1911,89 @@ "help": "請閱讀此文件,了解如何使用其他語言和/或在 Docker 中使用", "credit": "此服務使用 qpdf 和 Tesseract 進行 OCR。", "submit": "使用 OCR 處理 PDF", - "desc": "清理掃描並從 PDF 中的影像中偵測文字並重新新增為文字。", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "設定", "ocrMode": { - "label": "OCR 模式" + "label": "OCR 模式", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "語言" + "label": "語言", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR 模式" + "title": "OCR 模式", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "語言" + "title": "語言", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -926,7 +2002,13 @@ "header": "提取圖片", "selectText": "選擇要轉換提取影像的影像格式", "allowDuplicates": "儲存重複的圖片", - "submit": "提取" + "submit": "提取", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "存檔,長期,標準,轉換,儲存,保存", @@ -998,17 +2080,53 @@ }, "info": "尚未安裝 Python。需要安裝 Python 才能執行。" }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "授權,縮寫,繪製簽章,文字,影像簽章", "title": "簽章", "header": "簽署 PDF", "upload": "上傳影像", - "draw": "繪製簽章", - "text": "文字輸入", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "清除", "add": "新增", "saved": "已儲存的簽章", "save": "儲存簽章", + "applySignatures": "Apply Signatures", "personalSigs": "個人簽章", "sharedSigs": "共用簽章", "noSavedSigs": "尚未儲存任何簽章", @@ -1020,42 +2138,179 @@ "previous": "上一頁", "maintainRatio": "切換維持長寬比", "undo": "撤銷", - "redo": "重做" + "redo": "重做", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "授權,縮寫,繪製簽章,文字,影像簽章" }, "flatten": { - "tags": "靜態,停用,非互動,簡化", "title": "平坦化", "header": "PDF 平坦化", "flattenOnlyForms": "僅將表單平坦化", "submit": "平坦化", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "設定" }, "options": { - "flattenOnlyForms": "僅將表單平坦化" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "僅將表單平坦化", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "靜態,停用,非互動,簡化" }, "repair": { "tags": "修復,恢復,修正,復原", "title": "修復", "header": "修復 PDF", - "submit": "修復" + "submit": "修復", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "清理,簡化,非內容,組織", "title": "移除空白頁面", "header": "移除空白頁面", - "threshold": "畫素白度閾值:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "移除空白", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "清理,簡化,非內容,組織", "thresholdDesc": "確定一個白色畫素必須多麼白才能被分類為 '白色'。0 = 黑色,255 純白。", - "whitePercent": "白色百分比(%):", - "whitePercentDesc": "頁面必須是 '白色' 畫素的百分比才能被移除", - "submit": "移除空白" + "whitePercentDesc": "頁面必須是 '白色' 畫素的百分比才能被移除" }, "removeAnnotations": { "tags": "註釋,突出,註解,標記,移除", "title": "移除註釋", "header": "移除註釋", - "submit": "移除" + "submit": "移除", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "區分,對比,變化,分析", @@ -1087,6 +2342,142 @@ "certSign": { "tags": "驗證,PEM,P12,官方,加密", "title": "憑證簽章", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "位置", + "logoTitle": "Logo", + "name": "名稱", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "輸入您的金鑰庫或私鑰密碼(如果有的話):", + "passwordOptional": "Leave empty if no password", + "reason": "原因", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "顯示 Logo", "header": "使用您的憑證簽章(進行中)", "selectPDF": "選擇要簽章的 PDF 檔案:", "jksNote": "注意:如果您的證書類型未被列在下方,請使用 keytool 命令列工具將其轉換為 Java Keystore (.jks) 檔案格式,然後選擇下面的 .jks 檔案選項。", @@ -1094,13 +2485,7 @@ "selectCert": "選擇您的憑證檔案(X.509 格式,副檔名可能是 .pem 或 .der):", "selectP12": "選擇您的 PKCS#12 金鑰庫檔案(副檔名可能是 .p12 或 .pfx)(選填,如果有提供,則它應該包含您的私鑰和憑證):", "selectJKS": "選擇您的 Java Keystore 檔案 (副檔名可能是 .jks 或 .keystore):", - "certType": "憑證類型", - "password": "輸入您的金鑰庫或私鑰密碼(如果有的話):", "showSig": "顯示簽章", - "reason": "原因", - "location": "位置", - "name": "名稱", - "showLogo": "顯示 Logo", "submit": "簽章 PDF" }, "removeCertSign": { @@ -1108,7 +2493,18 @@ "title": "移除憑證簽章", "header": "從 PDF 檔案中移除憑證簽章", "selectPDF": "選擇 PDF 檔案", - "submit": "移除" + "submit": "移除", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "合併,複合,單一檢視,組織", @@ -1116,16 +2512,157 @@ "header": "多頁面版面配置", "pagesPerSheet": "每張紙的頁面數:", "addBorder": "新增邊框", - "submit": "送出" + "submit": "送出", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "調整大小,修改,尺寸,適應", "title": "調整頁面大小/比例", "header": "調整頁面大小/比例", "pageSize": "文件的頁面大小。", "keepPageSize": "原始大小", "scaleFactor": "頁面的縮放級別(裁剪)。", - "submit": "送出" + "submit": "送出", + "tags": "調整大小,修改,尺寸,適應" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "分頁,標籤,組織,索引" @@ -1134,16 +2671,83 @@ "tags": "自動偵測,基於標頭,組織,重新標籤", "title": "自動重新命名", "header": "自動重新命名 PDF", - "submit": "自動重新命名" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "自動重新命名", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "色彩校正,調整,修改,增強" }, "crop": { - "tags": "修剪,縮小,編輯,形狀", "title": "裁剪", "header": "裁剪 PDF", - "submit": "送出" + "submit": "送出", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "修剪,縮小,編輯,形狀" }, "autoSplitPDF": { "tags": "基於 QR Code,分離,掃描區段,組織", @@ -1226,24 +2830,124 @@ "downloadJS": "下載 JavaScript", "submit": "顯示" }, - "autoRedact": { - "tags": "塗改,隱藏,塗黑,黑色,標記,遮蔽", - "title": "自動塗黑", - "header": "自動塗黑", - "colorLabel": "顏色", - "textsToRedactLabel": "要塗黑的文字(以行分隔)", - "textsToRedactPlaceholder": "例如 \\n機密 \\n最高機密", - "useRegexLabel": "使用正則表達式", - "wholeWordSearchLabel": "整個單詞搜尋", - "customPaddingLabel": "自訂額外填充", - "convertPDFToImageLabel": "將 PDF 轉換為 PDF-影像(用於移除方框後面的文字)", - "submitButton": "送出" - }, "redact": { "tags": "塗改,隱藏,塗黑,黑色,標記,遮蔽,手動", "title": "手動塗黑", - "header": "手動塗黑", "submit": "塗黑", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "進階" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "新增", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "頁面", + "placeholder": "(例如 1,2,8 或 4,7,12-16 或 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "匯出", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "手動塗黑", "textBasedRedaction": "以文字為基礎的塗黑", "pageBasedRedaction": "以頁面為基礎的塗黑", "convertPDFToImageLabel": "將 PDF 轉換為 PDF 影像(用於移除黑框後的文字)", @@ -1269,22 +2973,7 @@ "showLayers": "顯示圖層(按兩下可將所有圖層重設為預設狀態)", "colourPicker": "顏色選擇器", "findCurrentOutlineItem": "尋找目前的大綱項目", - "applyChanges": "套用變更", - "auto": { - "settings": { - "advancedTitle": "進階" - }, - "wordsToRedact": { - "add": "新增" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "頁面", - "placeholder": "(例如 1,2,8 或 4,7,12-16 或 2n-1)" - }, - "export": "匯出" - } + "applyChanges": "套用變更" }, "tableExtraxt": { "tags": "CSV,表格提取,提取,轉換" @@ -1295,11 +2984,15 @@ "overlay-pdfs": { "tags": "覆蓋", "header": "覆蓋 PDF 檔案", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "選擇基底 PDF 檔案" }, "overlayFiles": { - "label": "選擇覆蓋 PDF 檔案" + "label": "選擇覆蓋 PDF 檔案", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "選擇覆蓋模式", @@ -1309,14 +3002,53 @@ }, "counts": { "label": "覆蓋次數(適用於固定重複模式)", - "placeholder": "輸入逗號分隔的次數(例如:2,3,1)" + "placeholder": "輸入逗號分隔的次數(例如:2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "選擇覆蓋位置", "foreground": "前景", "background": "背景" }, - "submit": "送出" + "submit": "送出", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "區段分割, 劃分, 自訂", @@ -1337,6 +3069,7 @@ "tags": "圖章,新增圖片,中心影像,浮水印,PDF,嵌入,自訂", "header": "圖章 PDF", "title": "圖章 PDF", + "stampSetup": "Stamp Setup", "stampType": "圖章類型", "stampText": "圖章文字", "stampImage": "圖章圖片", @@ -1349,7 +3082,19 @@ "overrideY": "覆蓋 Y 座標", "customMargin": "自訂邊緣", "customColor": "自訂文字顏色", - "submit": "送出" + "submit": "送出", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "移除圖片,頁面操作,後端,伺服器端" @@ -1367,7 +3112,8 @@ "status": { "_value": "狀態", "valid": "有效", - "invalid": "無效" + "invalid": "無效", + "complete": "Validation complete" }, "signer": "簽署者", "date": "日期", @@ -1394,40 +3140,122 @@ "version": "版本", "keyUsage": "金鑰用途", "selfSigned": "自我簽署", - "bits": "位元" + "bits": "位元", + "details": "Certificate Details" }, "signature": { "info": "簽章資訊", "_value": "簽章", "mathValid": "簽章在數學上有效,但:" }, - "selectCustomCert": "自訂 X.509 憑證檔案(選填)" - }, - "replace-color": { - "title": "取代-反轉顏色", - "header": "取代-反轉 PDF 顏色", - "selectText": { - "1": "取代或反轉顏色選項", - "2": "預設(預設高對比度顏色)", - "3": "自訂(自訂顏色)", - "4": "全部反轉(反轉所有顏色)", - "5": "高對比度顏色選項", - "6": "黑底白字", - "7": "白底黑字", - "8": "黑底黃字", - "9": "黑底綠字", - "10": "選擇文字顏色", - "11": "選擇背景顏色" + "selectCustomCert": "自訂 X.509 憑證檔案(選填)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "取代" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "取代顏色,頁面操作,後端,伺服器端" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "登入", "header": "登入", "signin": "登入", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "記住我", "invalid": "使用者名稱或密碼無效。", "locked": "您的帳號已被鎖定。", @@ -1446,12 +3274,83 @@ "alreadyLoggedIn": "您已經登入了", "alreadyLoggedIn2": "部裝置。請先從這些裝置登出後再試一次。", "toManySessions": "您有太多使用中的工作階段", - "logoutMessage": "您已登出。" + "logoutMessage": "您已登出。", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sending…", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF 轉為單一頁面", "header": "PDF 轉為單一頁面", - "submit": "轉換為單一頁面" + "submit": "轉換為單一頁面", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "提取頁面", @@ -1475,18 +3374,59 @@ "adjustContrast": { "title": "調整對比度", "header": "調整對比度", + "basic": "Basic Adjustments", "contrast": "對比度:", "brightness": "亮度:", "saturation": "飽和度:", - "download": "下載" + "download": "下載", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "壓縮", + "desc": "Compress PDFs to reduce their file size.", "header": "壓縮 PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "檔案大小" + }, "credit": "此服務使用 qpdf 進行 PDF 壓縮/最佳化。", "grayscale": { "label": "套用灰階進行壓縮" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "壓縮設定", @@ -1496,10 +3436,7 @@ "4": "自動模式 - 自動調整品質使 PDF 達到指定的檔案大小", "5": "指定的 PDF 檔案大小(例如 25MB, 10.8MB, 25KB)" }, - "submit": "壓縮", - "method": { - "filesize": "檔案大小" - } + "submit": "壓縮" }, "decrypt": { "passwordPrompt": "此檔案已受密碼保護。請輸入密碼:", @@ -1600,7 +3537,13 @@ "title": "移除圖片", "header": "移除圖片", "removeImage": "移除圖片", - "submit": "移除圖片" + "submit": "移除圖片", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "依章節分割 PDF", @@ -1634,6 +3577,12 @@ }, "note": "版本資訊僅提供英文版本" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "我們如何使用 Cookies", @@ -1669,54 +3618,943 @@ "title": "分析 Cookies", "description": "這些 Cookies 幫助我們分析您如何使用我們的工具,好讓我們能專注在構建社群最重視的功能。儘管放心—— Stirling PDF 不會且永不追蹤您的文件" } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "下載", - "undo": "撤銷", - "convert": { - "title": "轉換", - "settings": "設定", - "color": "顏色", - "greyscale": "灰度", - "fillPage": "填充頁面", - "pdfaDigitalSignatureWarning": "該 PDF 的憑證簽章將會在下一步被移除", - "grayscale": "灰度" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "嵌入,附件,檔案,附加,附件管理", - "title": "新增附件", - "header": "新增附件", - "submit": "新增附件" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "全選", - "deselectAll": "取消全選" + "deselectAll": "取消全選", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "簽章" + "read": "Read", + "sign": "簽章", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "載入中...", - "or": "或" + "or": "或", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "名稱", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "版本", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "全選", "deselectAll": "取消全選", "deleteSelected": "刪除已選取的項目", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "下載", - "delete": "刪除" + "delete": "刪除", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "清理 PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "設定" + "files": "Files", + "settings": "設定", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "新增密碼", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "加密", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "變更權限", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "安全,安全性", + "header": "新增密碼(加密)", + "selectText": { + "1": "選擇要加密的 PDF", + "2": "使用者密碼", + "3": "加密金鑰長度", + "4": "較高的值更強,但較低的值具有更好的相容性。", + "5": "要設定的權限(建議與擁有者密碼一起使用)", + "6": "防止文件組裝", + "7": "防止內容提取", + "8": "防止為了無障礙使用而提取資料", + "9": "防止填寫表單", + "10": "防止修改", + "11": "防止註釋修改", + "12": "防止列印", + "13": "防止列印不同格式", + "14": "擁有者密碼", + "15": "限制一旦開啟文件可以做什麼(並非所有軟體都支援)", + "16": "限制開啟文件本身" } }, "changePermissions": { "title": "變更權限", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "變更權限", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "防止文件組裝" @@ -1743,10 +4581,784 @@ "label": "防止列印不同格式" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "變更權限" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "移除密碼", + "desc": "從您的 PDF 檔案中移除密碼保護。", + "tags": "安全,解密,安全性,取消密碼,刪除密碼", + "password": { + "stepTitle": "移除密碼", + "label": "目前密碼", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "移除", + "results": { + "title": "Decrypted PDFs" + }, + "header": "移除密碼(解密)", + "selectText": { + "1": "選擇要解密的 PDF", + "2": "密碼" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "⚠️ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "取代或反轉顏色選項", + "2": "預設(預設高對比度顏色)", + "3": "自訂(自訂顏色)", + "4": "全部反轉(反轉所有顏色)", + "5": "高對比度顏色選項", + "6": "黑底白字", + "7": "白底黑字", + "8": "黑底黃字", + "9": "黑底綠字", + "10": "選擇文字顏色", + "11": "選擇背景顏色", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "取代", + "title": "取代-反轉顏色", + "header": "取代-反轉 PDF 顏色" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "塗改,隱藏,塗黑,黑色,標記,遮蔽", + "title": "自動塗黑", + "header": "自動塗黑", + "colorLabel": "顏色", + "textsToRedactLabel": "要塗黑的文字(以行分隔)", + "textsToRedactPlaceholder": "例如 \\n機密 \\n最高機密", + "useRegexLabel": "使用正則表達式", + "wholeWordSearchLabel": "整個單詞搜尋", + "customPaddingLabel": "自訂額外填充", + "convertPDFToImageLabel": "將 PDF 轉換為 PDF-影像(用於移除方框後面的文字)", + "submitButton": "送出" + }, + "replaceColorPdf": { + "tags": "取代顏色,頁面操作,後端,伺服器端" } -} \ No newline at end of file +} diff --git a/frontend/src/core/components/shared/config/configSections/AdminAdvancedSection.tsx b/frontend/src/core/components/shared/config/configSections/AdminAdvancedSection.tsx index b979a22b1..ffb9c8d0c 100644 --- a/frontend/src/core/components/shared/config/configSections/AdminAdvancedSection.tsx +++ b/frontend/src/core/components/shared/config/configSections/AdminAdvancedSection.tsx @@ -205,7 +205,7 @@ export default function AdminAdvancedSection() {