alphabet = "Alphabet" apply = "Apply" applyAndContinue = "Save & Leave" back = "Back" black = "Black" blue = "Blue" cancel = "Cancel" chooseFile = "Choose File" clear = "Clear" close = "Close" comingSoon = "Coming soon" confirm = "Confirm" confirmClose = "Confirm Close" confirmCloseCancel = "Cancel" confirmCloseConfirm = "Close File" confirmCloseDiscard = "Discard changes and close" confirmCloseMessage = "Are you sure you want to close this file?" confirmCloseSave = "Save and close" confirmCloseSaveFailed_one = "Saved with errors. {{count}} file could not be saved." confirmCloseSaveFailed_other = "Saved with errors. {{count}} files could not be saved." confirmCloseSaveFailedTitle = "Save Failed" confirmCloseUnsaved = "This file has unsaved changes." confirmCloseUnsavedList_one = "You have {{count}} file with unsaved changes.\n\n{{fileList}}" confirmCloseUnsavedList_other = "You have {{count}} files with unsaved changes.\n\n{{fileList}}" custom = "Custom..." customPosition = "Custom Position" customTextTooltip = "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc." delete = "Delete" details = "Details" discardChanges = "Discard & Leave" download = "Download" downloadPdf = "Download PDF" downloadUnavailable = "Download unavailable for this item" edit = "Edit" editSecret = "Edit this value" editYourNewFiles = "Edit your new file(s)" exportAndContinue = "Export & Continue" false = "False" fileChangedOnDisk = "Changed on disk since you edited it" fileDiskUnavailable = "Cannot reach the file on disk" fileNotSavedToDisk = "Not saved to disk" fileOriginalDeleted = "Original deleted - save to keep a copy" fileSavedToDisk = "File saved to disk" fileSelected = "{{filename}}" filesSelected = "{{count}} files" font = "Font" 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." green = "Green" help = "Help" incorrectPasswordMessage = "Current password is incorrect." info = "Info" invalidUndoData = "Cannot undo: invalid operation data" keepWorking = "Keep Working" loading = "Loading..." loginAgreementAccept = "Accept" loginAgreementDecline = "Decline" loginAgreementLoadFailed = "The login agreement could not be loaded." loginAgreementProvider = "This notice is provided by your administrator, not ZhmmCloud PDF Inc." loginAgreementRetry = "Retry" loginAgreementTitle = "Login Agreement" logOut = "Log out" marginTooltip = "Distance between the page number and the edge of the page." moreOptions = "More Options" never = "Never" no = "No" noFileSelected = "No file loaded. Please upload one." noFilesToUndo = "Cannot undo: no files were processed in the last operation" noOperationToUndo = "No operation to undo" nothingToUndo = "Nothing to undo" noValidFiles = "No valid files to process" oops = "Oops!" openInNewWindow = "Open in new window" openInViewer = "Open in Viewer" operationCancelled = "Operation canceled" page = "Page" pageNum = "Page Number" pageOrderPrompt = "Custom Page Order (Enter a comma-separated list of page numbers or Functions like 2n+1) :" pages = "Pages" pageSelectionPrompt = "Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1)" password = "Password" pin = "Pin File (keep active after tool run)" pro = "Pro" processingComplete = "Your file is ready." processingCompleteMultiple = "{{count}} files are ready." property = "Property" quickPosition = "Quick Position" red = "Red" remove = "Remove" reset = "Reset" review = "Review" save = "Save" saveUnavailable = "Save unavailable for this item" size = "Size" startingNumberTooltip = "The first number to display. Subsequent pages will increment from this number." submit = "Submit" success = "Success" termsAndConditions = "Terms & Conditions" text = "Text" true = "True" undo = "Undo" undoDataMismatch = "Cannot undo: operation data is corrupted" undoFailed = "Failed to undo operation" undoOperationTooltip = "Click to undo the last operation and restore the original files" undoQuotaError = "Cannot undo: insufficient storage space" undoStorageError = "Undo completed but some files could not be saved to storage" undoSuccess = "Operation undone successfully" unknown = "Unknown" unpin = "Unpin File (replace after tool run)" unsavedChanges = "You have unsaved changes to your PDF." unsavedChangesBody = "You have unsaved changes to your PDF. Are you sure you want to leave?" unsavedChangesTitle = "Unsaved Changes" unsupported = "Unsupported" username = "Username" welcome = "Welcome" white = "White" yes = "Yes" [account] accountSettings = "Account Settings" adminSettings = "Admin Settings - View and Add Users" changePassword = "Change Password" changeUsername = "Change Username" changeUsernameDescription = "Update your username. You will be logged out after updating." confirmNewPassword = "Confirm New Password" newPassword = "New Password" newUsername = "New Username" newUsernamePlaceholder = "Enter your new username" oldPassword = "Old password" password = "Confirmation Password" property = "Property" settingsCompare = "Settings Comparison:" signOut = "Sign Out" syncTitle = "Sync browser settings with Account" syncToAccount = "Sync Account <- Browser" syncToBrowser = "Sync Account -> Browser" title = "Account Settings" userControlSettings = "User Control Settings" webBrowserSettings = "Web Browser Setting" yourApiKey = "Your API Key" [account.mfa] codeLabel = "Authentication code" codePlaceholder = "Enter 6-digit code" codeRequired = "Enter the authentication code to continue." confirmDisable = "Disable" confirmEnable = "Enable" description = "Add an extra layer of security to your account." disableButton = "Disable two-factor authentication" disabled = "Two-factor authentication disabled." disableDescription = "Enter a valid authentication code to disable two-factor authentication." disableFailed = "Unable to disable two-factor authentication. Check the code and try again." disableTitle = "Disable two-factor authentication" enableButton = "Enable two-factor authentication" enabled = "Two-factor authentication enabled." enableFailed = "Unable to enable two-factor authentication. Check the code and try again." manualKey = "Manual setup key" secretWarning = "Keep this key private. Anyone with access can generate valid authentication codes." setupDescription = "Scan the QR code with your authenticator app, then enter the 6-digit code to confirm." setupFailed = "Unable to start two-factor setup. Please try again." setupTitle = "Set up two-factor authentication" ssoDescription = "Two-factor authentication is managed by your identity provider for single sign-on accounts." ssoManaged = "Configure MFA through your identity provider." title = "Two-factor authentication" [account.overview] logOut = "Log out" signedInAs = "Signed in as: {{email}}" [add-page-numbers] tags = "paginate,label,organize,index" [addAttachments] tags = "embed,attach,include,attachments,attach files,embed files,include files,add files,file attachment,associated files,supplementary files" [addAttachments.error] failed = "An error occurred while adding attachments to the PDF." [AddAttachmentsRequest] attachments = "Select Attachments" info = "View, add, extract, rename, or delete embedded PDF attachments. Changes are staged cleanly and saved to your document in one pass." submit = "Add Attachments" [AddAttachmentsRequest.error] failed = "Add attachments operation failed" [AddAttachmentsRequest.results] title = "Attachment Results" [AddAttachmentsRequest.tooltip.description] title = "What it does" [AddAttachmentsRequest.tooltip.header] title = "About Manage Attachments" [addImage] applySignatures = "Apply Images" header = "Add images to PDFs" tags = "img,jpg,picture,photo" title = "Add Image" [addImage.canvas] colorPickerTitle = "Choose stroke color" [addImage.error] failed = "An error occurred while adding image to the PDF." [addImage.image] hint = "Supports PNG, JPEG, GIF, BMP, TIFF, and SVG files. SVG files will be converted to PNG for embedding." label = "Image file" name = "Image" placeholder = "Upload an image" [addImage.instructions] noSignature = "Upload an image above to enable placement." paused = "Placement paused" resumeHint = "Resume placement to click and add your image." text = "After uploading your image above, click anywhere on the PDF to place it." title = "How to add images" [addImage.mode] move = "Move Image" pause = "Pause placement" place = "Place Image" resume = "Resume placement" [addImage.results] title = "Add Image Results" [addImage.saved] defaultCanvasLabel = "Drawing signature" defaultImageLabel = "Uploaded image" defaultLabel = "Image" defaultTextLabel = "Typed signature" delete = "Remove" emptyTitle = "No saved signatures yet" heading = "Saved signatures" label = "Label" limitTitle = "Limit reached" next = "Next" personalHeading = "Personal Signatures" prev = "Previous" savePersonal = "Save Personal" saveShared = "Save Shared" sharedHeading = "Shared Signatures" [addImage.saved.type] canvas = "Drawing" image = "Upload" text = "Text" [addImage.step] createDesc = "Upload the image you want to add" place = "Place image" placeDesc = "Click on the PDF to add your image" [addImage.steps] configure = "Configure Image" [addImage.text] colorLabel = "Text color" fontLabel = "Font" fontSizeLabel = "Font size" name = "Text" placeholder = "Enter text" [addImage.type] canvas = "Canvas" image = "Image" saved = "Saved" text = "Text" [addPageNumbers] customize = "Customize Appearance" customNumberDesc = "e.g., \"Page {n}\" or leave blank for just numbers" fontName = "Font Name" fontSize = "Font Size" numberPagesDesc = "e.g., 1,3,5-8 or leave blank for all pages" pagePreviewAlt = "Page preview" pagesAndStarting = "Pages & Starting Number" positionAndPages = "Position & Pages" preview = "Position Selection" previewDisclaimer = "Preview is approximate. Final output may vary due to PDF font metrics." submit = "Add Page Numbers" tags = "number,pagination,count,add page numbers,page numbering,page numbers,footer,header,number pages,sequential,pagination tool" title = "Add Page Numbers" zeroPad = "Zero‑pad Width (Bates Stamping)" zeroPadTooltip = "Zero‑pad (Bates Stamp) page numbers to this width (e.g., 3 ⇒ 001). Set 0 to disable." [addPageNumbers.error] failed = "Add page numbers operation failed" [addPageNumbers.results] title = "Page Number Results" [addPageNumbers.selectText] 2 = "Margin Size" 4 = "Starting Number" 5 = "Pages to Number" 6 = "Custom Text Format" [addPassword] desc = "Encrypt your PDF document with a password." tags = "encrypt,password,lock,secure,protect,security,encryption,safeguard,confidential,private,restrict access" title = "Add Password" [addPassword.encryption.keyLength] 128bit = "128-bit (Standard)" 256bit = "256-bit (High)" 40bit = "40-bit (Low)" label = "Encryption Key Length" [addPassword.error] failed = "An error occurred while encrypting the PDF." [addPassword.results] title = "Encrypted PDFs" [addPassword.tooltip.encryption] bullet1 = "40-bit: Basic security, compatible with older viewers" bullet2 = "128-bit: Standard security, widely supported" bullet3 = "256-bit: Maximum security, requires modern viewers" text = "Higher encryption levels provide better security but may not be supported by older PDF viewers." title = "Encryption Levels" [addPassword.tooltip.header] title = "Password Protection Overview" [addPassword.tooltip.passwords] bullet1 = "Password to open: Required to view the PDF" bullet2 = "Permissions password: Protects restrictions on printing, copying and editing. Some apps or viewers may ignore these restrictions." text = "Set either password or both. Opening the PDF does not verify the permissions password." title = "Password Types" [addPassword.tooltip.permissions] text = "Choose which actions to restrict. A separate permissions password is required to change these restrictions." title = "Change Permissions" [addStamp] pagePreviewAlt = "Page preview" preview = "Preview Stamp" stampPreviewAlt = "Stamp preview" tags = "stamp,mark,seal,approved,rejected,confidential,stamp tool,rubber stamp,date stamp,approval stamp,received,void,copy,original" [AddStampRequest] alphabet = "Alphabet" clickToExpand = "Click to expand" customColor = "Custom Text Color" customDateDesc = "Custom format" customPosition = "Drag the stamp to the desired location in the preview window." dateDesc = "Current date" datetimeDesc = "Date and time combined" dateTimeVars = "Date & Time" dynamicVariables = "Dynamic Variables" examples = "Examples" filenameDesc = "Filename without extension" filenameFullDesc = "Filename with extension" fileVars = "File Information" fontSize = "Font/Image Size" imageSize = "Image Size" margin = "Margin" metadataDesc = "From PDF document properties" metadataVars = "Document Metadata" multiLine = "multi-line" noStampSelected = "No stamp selected. Return to Step 1." opacity = "Opacity" otherVars = "Other" pageNumberDesc = "Current page number" pageVars = "Page Information" position = "Position" positionAndFormatting = "Position & Formatting" preview = "Preview:" quickPosition = "Select a position on the page to place the stamp." rotation = "Rotation" selectedImageAlt = "Selected stamp image" selectTemplate = "Select a template..." stampSetup = "Stamp Setup" stampText = "Stamp Text" stampTextDescription = "Use dynamic variables below. Use @@ for literal @. Use \\n for new lines." stampType = "Stamp Type" submit = "Add Stamp" tags = "Stamp, Add image, center image, Watermark, PDF, Embed, Customize" timeDesc = "Current time" title = "Stamp PDF" totalPagesDesc = "Total number of pages" useTemplate = "Use Template" uuidDesc = "Short unique identifier (8 chars)" variablesHelp = "Click on any variable to insert it into your stamp text. Use @@ for literal @." yearMonthDayDesc = "Individual date parts" [AddStampRequest.error] failed = "An error occurred while adding stamp to the PDF." [AddStampRequest.results] title = "Stamp Results" [AddStampRequest.template] custom = "Custom" dateHeader = "Date Header" doc-info = "Document Info" draft = "Draft Watermark" draftWatermark = "Draft Watermark" european-date = "European Date (DD/MM/YYYY)" europeanDate = "European Date" legal-footer = "Legal Footer" page-numbers = "Page Numbers" pageNumberFooter = "Page Number Footer" timestamp = "Timestamp" [addText] applySignatures = "Apply Text" header = "Add text to PDFs" tags = "text,annotation,label" title = "Add Text" [addText.canvas] colorPickerTitle = "Choose stroke color" [addText.error] failed = "An error occurred while adding text to the PDF." [addText.instructions] noSignature = "Enter text above to enable placement." paused = "Placement paused" resumeHint = "Resume placement to click and add your text." text = "After entering your text above, click anywhere on the PDF to place it." title = "How to add text" [addText.mode] move = "Move Text" pause = "Pause placement" place = "Place Text" resume = "Resume placement" [addText.results] title = "Add Text Results" [addText.saved] defaultCanvasLabel = "Drawing signature" defaultImageLabel = "Uploaded signature" defaultLabel = "Signature" defaultTextLabel = "Typed signature" delete = "Remove" emptyTitle = "No saved signatures yet" heading = "Saved signatures" label = "Label" limitTitle = "Limit reached" next = "Next" personalHeading = "Personal Signatures" prev = "Previous" savePersonal = "Save Personal" saveShared = "Save Shared" sharedHeading = "Shared Signatures" [addText.saved.type] canvas = "Drawing" image = "Upload" text = "Text" [addText.step] createDesc = "Enter the text you want to add" place = "Place text" placeDesc = "Click on the PDF to add your text" [addText.steps] configure = "Configure Text" [addText.text] colorLabel = "Text color" fontLabel = "Font" fontSizeLabel = "Font size" fontSizePlaceholder = "Type or select font size (8-200)" name = "Text content" placeholder = "Enter the text you want to add" [addText.type] canvas = "Canvas" image = "Image" saved = "Saved" text = "Text" [adjust-contrast] tags = "color-correction,tune,modify,enhance" [adjustContrast] adjustColors = "Adjust Colors" basic = "Basic Adjustments" blue = "Blue" brightness = "Brightness:" confirm = "Confirm" contrast = "Contrast:" green = "Green" noPreview = "Select a PDF to preview" red = "Red" saturation = "Saturation:" tags = "contrast,brightness,saturation,adjust colors,color correction,enhance,lighten,darken,improve quality,color balance,hue,vibrance" title = "Adjust Colors/Contrast" [adjustContrast.error] failed = "Failed to adjust colors/contrast" [adjustContrast.results] title = "Adjusted PDF" [adjustPageScale] submit = "Adjust Page Scale" tags = "resize,modify,dimension,adapt" title = "Adjust Page Scale" [adjustPageScale.error] failed = "An error occurred while adjusting the page scale." [adjustPageScale.orientation] label = "Page orientation" landscape = "Landscape" portrait = "Portrait" [adjustPageScale.pageSize] keep = "Keep Original Size" label = "Target Page Size" legal = "Legal" letter = "Letter" [adjustPageScale.scaleFactor] label = "Scale Factor" [adjustPageScale.settings] title = "Settings" [adjustPageScale.tooltip.description] text = "Adjust the size of PDF content and change the page dimensions." title = "Description" [adjustPageScale.tooltip.header] title = "Page Scale Settings Overview" [adjustPageScale.tooltip.pageSize] text = "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, while other options resize to standard paper sizes." title = "Target Page Size" [adjustPageScale.tooltip.scaleFactor] bullet1 = "1.0 = Original size" bullet2 = "0.5 = Half size (50% smaller)" bullet3 = "2.0 = Double size (200% larger, may crop)" text = "Controls how large or small the content appears on the page. Content is scaled and centered - if scaled content is larger than the page size, it may be cropped." title = "Scale Factor" [admin] close = "Close" error = "Error" expand = "Expand" [admin.formDetection] confirmUninstall = "Click to confirm" description = "Detects text fields, checkboxes and signature areas in a PDF and turns them into fillable form fields. Detection runs on this server with the model you install below." downloadingNote = "{{percent}}% of {{size}}" enableFeature = "Enable feature" engineUnavailable = "This build does not include the detection engine, so the tool stays unavailable even with a model installed." errorTitle = "Something went wrong" install = "Install" installFailed = "Install failed" licenseLabel = "Licence" modelsLabel = "Detection model" notAvailable = "No download URL/checksum configured yet, so this model cannot be installed." notWritable = "The model directory is not writable; check the configs volume mount." saveFailed = "Failed to save setting" sizeUnknown = "size unknown" switch = "Use this model" title = "AI Form Detection" uninstall = "Uninstall" uninstallFailed = "Uninstall failed" verifyingNote = "Verifying SHA-256 checksum..." [admin.formDetection.airgap] intro = "No internet on the server? Download the model elsewhere, verify it, and copy it into the model directory. It is picked up on restart." noSha = "(checksum not set)" show = "Offline / air-gapped install" step1 = "1. Download on a machine with internet:" step2 = "2. Check the SHA-256 checksum matches:" step3 = "3. Copy it into the model directory on this server:" step4 = "4. Set formDetection.activeModelId to the model's id in settings.yml and restart. is the configs volume (e.g. /configs in Docker). The air-gapped image ships with a model already installed." [admin.formDetection.badge] active = "Active" installed = "Installed" [admin.formDetection.state] downloading = "Downloading..." failed = "Failed" notInstalled = "No model installed" ready = "Ready" verifying = "Verifying..." [admin.settings] discard = "Discard" error = "Failed to save settings" fetchError = "Failed to load settings" loginRequired = "Login mode must be enabled to modify admin settings" restartError = "Failed to restart server. Please restart manually." restarting = "Restarting Server" restartingMessage = "The server is restarting. Please wait a moment..." restartRequired = "Restart Required" save = "Save Changes" saved = "Settings saved successfully" saveError = "Failed to save settings" saveSuccess = "Settings saved successfully" success = "Settings saved successfully" title = "Admin Settings" workspace = "Workspace" [admin.settings.advanced] description = "Configure advanced features and experimental functionality." features = "Feature Flags" processing = "Processing" title = "Advanced" [admin.settings.advanced.disableSanitize] description = "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" label = "Disable HTML Sanitization" [admin.settings.advanced.enableAlphaFunctionality] description = "Enable experimental and alpha-stage features (may be unstable)" label = "Enable Alpha Features" [admin.settings.advanced.enableUrlToPDF] description = "Allow conversion of web pages to PDF documents" label = "Enable URL to PDF" [admin.settings.advanced.endpoints] description = "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." label = "Endpoints" manage = "Manage API Endpoints" [admin.settings.advanced.maxDPI] description = "Maximum DPI for image processing (0 = unlimited)" label = "Maximum DPI" [admin.settings.advanced.processExecutor] calibre = "Calibre" description = "Configure session limits and timeouts for each process executor" ghostscript = "Ghostscript" installApp = "Install App" label = "Process Executor Limits" libreOffice = "LibreOffice" ocrMyPdf = "OCRmyPDF" pdfToHtml = "PDF to HTML" pythonOpenCv = "Python OpenCV" qpdf = "QPDF" tesseract = "Tesseract OCR" weasyPrint = "WeasyPrint" [admin.settings.advanced.processExecutor.sessionLimit] description = "Maximum concurrent instances" label = "Session Limit" [admin.settings.advanced.processExecutor.timeout] description = "Maximum execution time" label = "Timeout (minutes)" [admin.settings.advanced.zhmmOfficeConversion] description = "ZhmmCloud Office Convert is in beta. It offers better conversions, faster and with less memory than LibreOffice." label = "Use new ZhmmCloud Office conversion" [admin.settings.advanced.tempFileManagement] description = "Configure temporary file storage and cleanup behavior" label = "Temp File Management" [admin.settings.advanced.tempFileManagement.baseTmpDir] description = "Base directory for temporary files (leave empty for default: java.io.tmpdir/ZhmmCloud PDF)" label = "Base Temp Directory" placeholder = "Default: java.io.tmpdir/ZhmmCloud PDF" [admin.settings.advanced.tempFileManagement.cleanupIntervalMinutes] description = "How often to run cleanup (in minutes)" label = "Cleanup Interval (minutes)" [admin.settings.advanced.tempFileManagement.cleanupSystemTemp] description = "Whether to clean broader system temp directory (use with caution)" label = "Cleanup System Temp" [admin.settings.advanced.tempFileManagement.libreofficeDir] description = "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" label = "LibreOffice Temp Directory" placeholder = "Default: baseTmpDir/libreoffice" [admin.settings.advanced.tempFileManagement.maxAgeHours] description = "Maximum age in hours before temp files are cleaned up" label = "Max Age (hours)" [admin.settings.advanced.tempFileManagement.prefix] description = "Prefix for temp file names" label = "Temp File Prefix" [admin.settings.advanced.tempFileManagement.startupCleanup] description = "Clean up old temp files on application startup" label = "Startup Cleanup" [admin.settings.advanced.tempFileManagement.systemTempDir] description = "System temp directory to clean (only used if cleanupSystemTemp is enabled)" label = "System Temp Directory" placeholder = "System temp directory path" [admin.settings.advanced.tessdataDir] description = "Path to the tessdata directory for OCR language files" downloadButton = "Download selected languages" downloadErrorGeneric = "Download failed: {{message}}. Please try again later." downloadErrorNetwork = "Download failed due to a network error. Please check your connection and try again." downloadErrorPermission = "Tessdata directory is not writable: {{message}}. Please choose a writable directory (e.g. under the application data folder) or adjust permissions." downloadErrorServer = "The server encountered an error while downloading tessdata languages. Please try again later." downloadErrorTitle = "Download Failed" downloadInvalidBody = "Some selected languages are not available to download. Please refresh and choose from the list." downloadInvalidTitle = "Invalid selection" downloadLabel = "Download additional tessdata languages" downloadMissingBody = "Please select at least one language to download." downloadMissingTitle = "No language selected" downloadNothingFound = "No additional languages found" downloadPlaceholder = "Select languages" downloadSuccessBody = "The selected tessdata languages have been saved." downloadSuccessTitle = "Languages downloaded" installedLanguages = "Installed tessdata languages" label = "Tessdata Directory" loadingLanguages = "Loading installed tessdata languages..." manualLinks = "Manual downloads: click the links and place the files into the tessdata folder." noLanguages = "No tessdata languages found in the configured directory." permissionNotice = "The tessdata path is not writable. Downloads will be opened in the browser; please save the .traineddata files manually into the tessdata folder." [admin.settings.ai] customProvider = "Custom (OpenAI-compatible)" description = "Connect ZhmmCloud to the Python AI engine, choose its models, and set the guardrails it runs under." managedByCloud = "Managed by ZhmmCloud in this mode." managedByCloudShort = "Managed by ZhmmCloud" [admin.settings.ai.documents] description = "Configure the embedding model and retrieval settings used to answer questions over documents. Applied to the AI engine when saved." title = "Documents & RAG" [admin.settings.ai.documents.embeddingApiKey] description = "Leave blank to use the engine's own environment credential. Applies to self-hosted single-engine deployments." generic = "Embedding API key" openai = "OpenAI API key" setPlaceholder = "Saved - leave blank to keep the current key" voyageai = "VoyageAI API key" [admin.settings.ai.documents.embeddingBaseUrl] description = "Base URL of the OpenAI-compatible / Ollama embeddings endpoint, e.g. http://ollama:11434/v1. Must point at a trusted internal endpoint (SSRF-sensitive)." label = "Embedding base URL" [admin.settings.ai.documents.embeddingModel] description = "Embedding model name. Free text; suggestions are hints only." label = "Embedding model" [admin.settings.ai.documents.embeddingProvider] description = "Provider used to turn document text into vector embeddings." label = "Embedding provider" [admin.settings.ai.documents.maxSearches] description = "Maximum number of retrieval searches the agent may run per request." label = "Max searches" [admin.settings.ai.documents.reindexNote] body = "Changing the embedding model takes effect immediately, but documents indexed with the previous model must be re-indexed for search to return correct results." title = "Re-index required" [admin.settings.ai.documents.saved] reindexNote = "If you changed the embedding model, re-index existing documents so search uses the new model." [admin.settings.ai.documents.topK] description = "Number of most-relevant chunks retrieved per search." label = "Top K" [admin.settings.ai.general] connection = "Connection" description = "Choose where AI runs. Changes here apply on restart." restartNote = "Changing the URL or any timeout takes effect after a restart." title = "AI Engine" [admin.settings.ai.general.capabilities] description = "Turn individual AI features on or off. Disabled features are hidden in the app." title = "Capabilities" [admin.settings.ai.general.cloud] note = "Models and provider keys are managed by ZhmmCloud, so those settings do not apply in this mode." [admin.settings.ai.general.cloud.indexing] description = "Every AI tool sends the page text it needs to answer. This decides whether ZhmmCloud may also keep that text, indexed, so later questions can search across the document." help = "Off means document questions are unavailable. It does not stop text being sent - only stored." label = "Let ZhmmCloud keep indexed documents" [admin.settings.ai.general.cloudNote] body = "The reasoning runs on ZhmmCloud's infrastructure, billed to the account this server is linked to. There is no container to run and no provider key to hold here. Whatever the AI reads is processed by ZhmmCloud rather than on your own hardware." title = "About ZhmmCloud AI" [admin.settings.ai.general.enabled] description = "Master switch. When off, no AI tools, agents, or engine calls are available." label = "Enable AI" [admin.settings.ai.general.features.chat] description = "Conversational assistant for working with PDFs." label = "Chat assistant" [admin.settings.ai.general.features.classify] description = "Automatically categorise documents by type or content." label = "Document classification" [admin.settings.ai.general.features.createPdf] description = "Generate a new PDF (e.g. from HTML) via an AI agent." label = "Create PDF from prompt" [admin.settings.ai.general.features.documentQuestions] description = "Ask questions and get answers grounded in an uploaded document." label = "Document questions" [admin.settings.ai.general.features.mathAuditor] description = "Review documents for mathematical and numerical errors." label = "Math auditor" [admin.settings.ai.general.features.pdfComment] description = "Add AI-authored review comments and annotations to a PDF." label = "PDF comment agent" [admin.settings.ai.general.longRunningTimeoutSeconds] description = "Timeout for heavier agent operations such as document generation." label = "Long-running timeout (seconds)" [admin.settings.ai.general.mode] label = "Where AI runs" [admin.settings.ai.general.mode.cloud] description = "No container, no provider key, no model choice - the work runs on ZhmmCloud and is billed to the account this server is linked to." linkCta = "Connect this server to a ZhmmCloud account" notLinked = "Link an account first" ownerOnly = "Only the organization owner can link this server to a ZhmmCloud account." title = "Use ZhmmCloud AI" [admin.settings.ai.general.mode.off] description = "No AI tools anywhere in the app, and nothing leaves this server." title = "Off" [admin.settings.ai.general.mode.self] description = "A container you host, pointed at a model provider of your choosing. Your key, your bill, your data path." title = "Run your own engine" [admin.settings.ai.general.note] docs = "Set-up guide" intro = "A separate container you run next to ZhmmCloud. It does the reasoning; ZhmmCloud still does every page operation itself. It needs the same" outro = "on both containers and a model provider key. Whatever the AI reads is sent to the provider you pick - an Ollama you host keeps every page in-house." title = "About the AI engine" [admin.settings.ai.general.streamTimeoutSeconds] description = "Timeout for streamed (token-by-token) chat responses." label = "Stream timeout (seconds)" [admin.settings.ai.general.test] button = "Test connection" failBody = "The AI engine did not respond. Check the URL, that the engine container is running, and that AI is enabled (a restart is needed after enabling)." failTitle = "AI engine unreachable" okBody = "The AI engine responded to a health check." okTitle = "AI engine reachable" [admin.settings.ai.general.timeoutSeconds] description = "Timeout for standard AI requests to the engine." label = "Request timeout (seconds)" [admin.settings.ai.general.url] description = "Internal URL of the Python AI engine, e.g. http://ZhmmCloud PDF-engine:5001." label = "AI engine URL" [admin.settings.ai.limits] description = "Guardrails for how much work AI requests may do and how many run concurrently. Applied to the AI engine when saved." title = "Limits & Performance" [admin.settings.ai.limits.maxCharacters] description = "Guardrail: reject AI requests whose extracted text exceeds this length." label = "Max characters per request" [admin.settings.ai.limits.maxPages] description = "Guardrail: reject AI requests over this many PDF pages." label = "Max pages per request" [admin.settings.ai.limits.modelMaxConcurrency] description = "Maximum simultaneous in-flight model calls across the whole engine." label = "Model max concurrency" [admin.settings.ai.models] description = "Choose the LLM provider and the smart/fast models the AI engine uses. Applied to the AI engine when saved." title = "Models & Providers" [admin.settings.ai.models.apiKey] anthropic = "Anthropic API key" description = "Leave blank to use the engine's own environment credential. Applies to self-hosted single-engine deployments." generic = "API key" openai = "OpenAI API key" setPlaceholder = "Saved - leave blank to keep the current key" [admin.settings.ai.models.baseUrl] contextWindow = "Use a context window of at least 16,384 tokens. Smaller windows silently drop part of the prompt. Ollama defaults to 4,096 - raise OLLAMA_CONTEXT_LENGTH." description = "Base URL of the OpenAI-compatible / Ollama endpoint, e.g. http://ollama:11434/v1." label = "Provider base URL" warning = "The base URL must point at a trusted internal endpoint. The engine will make server-side requests to it, so an untrusted value is SSRF-sensitive." [admin.settings.ai.models.fastMaxTokens] description = "Maximum output tokens for the fast model." label = "Fast model max tokens" [admin.settings.ai.models.fastModel] description = "Cheaper, faster model for lightweight tasks. Free text; suggestions are hints only." label = "Fast model" [admin.settings.ai.models.provider] description = "Which LLM provider the engine talks to." label = "Provider" [admin.settings.ai.models.smartMaxTokens] description = "Maximum output tokens for the smart model." label = "Smart model max tokens" [admin.settings.ai.models.smartModel] description = "High-capability model for complex reasoning. Free text; suggestions are hints only." label = "Smart model" [admin.settings.ai.saved] body = "Changes are pushed to the AI engine automatically." bodyNoPush = "Settings saved. They will apply the next time the AI engine picks up its configuration." title = "AI settings saved" [admin.settings.ai.status] capabilities = "Capabilities" capabilitiesValue = "{{on}} of {{total}} on" checked = "checked" checking = "Checking the engine…" description = "Whether the engine is reachable, whether it accepts this server, and what it is running." fastModel = "Fast model" justNow = "just now" latency = "Response time" linkLabel = "Account link" minutesAgo = "{{count}}m ago" recheck = "Check again" runningOn = "Running on" secondsAgo = "{{count}}s ago" secretLabel = "Shared secret" smartModel = "Smart model" title = "Status" url = "Engine URL" [admin.settings.ai.status.cloud] hostDown = "Down" hostLabel = "ZhmmCloud.com" hostUp = "Up" name = "ZhmmCloud" sharingLabel = "AI sharing" sharingOff = "Disabled" sharingOn = "Enabled" [admin.settings.ai.status.cloud.degraded] body = "ZhmmCloud answered but refused this server. The account link may have been revoked." title = "ZhmmCloud is refusing this server" [admin.settings.ai.status.cloud.down] body = "This server could not reach ZhmmCloud. Check the account link and that this server can reach the internet." title = "ZhmmCloud unreachable" [admin.settings.ai.status.cloud.ok] body = "ZhmmCloud accepted this server. Nothing to run or patch here." title = "Running on ZhmmCloud" [admin.settings.ai.status.degraded] body = "It answered the health check but rejected a real request. The two sides are using different shared secrets." title = "Engine is up, but refusing this server" [admin.settings.ai.status.down] body = "Check the URL, that the engine container is running, and that you restarted after enabling AI." title = "Engine unreachable" [admin.settings.ai.status.off] body = "Choose how AI runs below, then save and restart." title = "AI is switched off" [admin.settings.ai.status.ok] body = "Health check and an authenticated request both succeeded." title = "Engine running" [admin.settings.ai.status.secret] no = "Rejected" unknown = "Unknown" yes = "Accepted" [admin.settings.badge] clickToUpgrade = "Click to view plan details" [admin.settings.connections] connect = "Connect" connectedServicesDescription = "Services this server is wired up to. Sign-in providers live under Sign-in & security." description = "Mail, Telegram, Drive, and uploading from a phone." disconnect = "Disconnect" disconnected = "Provider disconnected successfully" disconnectError = "Failed to disconnect provider" documentation = "View documentation" imageResolutionFull = "Full (Original Size)" imageResolutionReduced = "Reduced (Max 1200px)" linkedServices = "Linked Services" mobileScannerConvertToPdf = "Convert Images to PDF" mobileScannerConvertToPdfDesc = "Automatically convert uploaded images to PDF format. If disabled, images will be kept as-is." mobileScannerImageResolution = "Image Resolution" mobileScannerImageResolutionDesc = "Resolution of uploaded images. \"Reduced\" scales images to max 1200px to reduce file size." mobileScannerPageFormat = "Page Format" mobileScannerPageFormatDesc = "PDF page size for converted images. \"Keep\" uses original image dimensions." mobileScannerStretchToFit = "Stretch to Fit" mobileScannerStretchToFitDesc = "Stretch images to fill the entire page. If disabled, images are centered with preserved aspect ratio." pageFormatA4 = "A4 (210×297mm)" pageFormatKeep = "Keep (Original Dimensions)" pageFormatLetter = "Letter (8.5×11in)" title = "Connections" unlinkedServices = "Unlinked Services" [admin.settings.connections.mobileScanner] description = "Allow users to upload files from mobile devices by scanning a QR code" enable = "Enable QR Code Upload" imageResolutionFull = "Full (Original Size)" imageResolutionReduced = "Reduced (Max 1200px)" label = "Mobile Phone Upload" link = "Configure in System Settings" mobileScannerConvertToPdf = "Convert Images to PDF" mobileScannerConvertToPdfDesc = "Automatically convert uploaded images to PDF format. If disabled, images will be kept as-is." mobileScannerImageResolution = "Image Resolution" mobileScannerImageResolutionDesc = "Resolution of uploaded images. \"Reduced\" scales images to max 1200px to reduce file size." mobileScannerPageFormat = "Page Format" mobileScannerPageFormatDesc = "PDF page size for converted images. \"Keep\" uses original image dimensions." mobileScannerStretchToFit = "Stretch to Fit" mobileScannerStretchToFitDesc = "Stretch images to fill the entire page. If disabled, images are centered with preserved aspect ratio." note = "Note: Requires Frontend URL to be configured. " pageFormatA4 = "A4 (210×297mm)" pageFormatKeep = "Keep (Original Dimensions)" pageFormatLetter = "Letter (8.5×11in)" [admin.settings.connections.oauth2] label = "OAuth2" [admin.settings.connections.oauth2.autoCreateUser] description = "Automatically create user accounts on first OAuth2 login" label = "Auto Create Users" [admin.settings.connections.oauth2.blockRegistration] description = "Prevent new user registration via OAuth2" label = "Block Registration" [admin.settings.connections.oauth2.clientId] description = "The OAuth2 client ID from your provider" label = "Client ID" [admin.settings.connections.oauth2.clientSecret] description = "The OAuth2 client secret from your provider" label = "Client Secret" [admin.settings.connections.oauth2.enabled] description = "Allow users to authenticate using OAuth2 providers" label = "Enable OAuth2" [admin.settings.connections.oauth2.issuer] description = "The OAuth2 provider issuer URL" label = "Issuer URL" [admin.settings.connections.oauth2.provider] description = "The OAuth2 provider to use for authentication" label = "Provider" [admin.settings.connections.oauth2.scopes] description = "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" label = "OAuth2 Scopes" [admin.settings.connections.oauth2.useAsUsername] description = "The OAuth2 claim to use as the username (e.g., email, sub)" label = "Use as Username" [admin.settings.connections.saml2] label = "SAML2" [admin.settings.connections.saml2.autoCreateUser] description = "Automatically create user accounts on first SAML2 login" label = "Auto Create Users" [admin.settings.connections.saml2.blockRegistration] description = "Prevent new user registration via SAML2" label = "Block Registration" [admin.settings.connections.saml2.enabled] description = "Allow users to authenticate using SAML2 providers" label = "Enable SAML2" [admin.settings.connections.saml2.provider] description = "The SAML2 provider name" label = "Provider" [admin.settings.connections.saml2.registrationId] description = "The SAML2 registration identifier" label = "Registration ID" [admin.settings.connections.ssoAutoLogin] description = "Automatically redirect to SSO login when authentication is required" enable = "Enable SSO Auto Login" label = "SSO Auto Login" [admin.settings.database] actions = "Actions" backupCreated = "Backup created successfully" backupDescription = "Manage H2 backups directly from the admin console." backupFailed = "Failed to create backup" backupTitle = "Backups & Restore" chooseFile = "Choose a .sql backup file" codeMismatch = "Confirmation code does not match" codeMismatchBody = "Please enter the code exactly as shown to proceed." configuration = "Database Configuration" confirmCodeLabel = "Enter the confirmation code to proceed" confirmImport = "Confirm import" confirmImportTitle = "Confirm database import" connection = "Connection" connectionDescription = "Point ZhmmCloud at an external database instead of the embedded one." createBackup = "Create backup" created = "Created" delete = "Delete" deleteConfirm = "Delete this backup? This cannot be undone." deleteConfirmAction = "Delete backup" deleteFailed = "Failed to delete backup" deleteSuccess = "Backup deleted" deleteTitle = "Delete backup" description = "Connect a custom database, and back up or restore the one in use." download = "Download" downloadFailed = "Failed to download backup" embedded = "Embedded H2" enterCode = "Enter the code shown above" external = "External DB" fileName = "File" h2Hint = "Set the database type to H2 and disable custom database to enable backup and restore." h2Only = "Backups are available only for the embedded H2 database." import = "Import" importFailed = "Failed to import backup" importFromUpload = "Import upload" importSuccess = "Backup imported successfully" loadError = "Failed to load database backups" manageBackups = "Manage backups" noBackups = "No backups found yet." overwriteWarning = "Warning: This will overwrite the current database." overwriteWarningBody = "All existing data will be replaced by the uploaded backup. This action cannot be undone." refresh = "Refresh" selectFile = "Please select a .sql file to import" size = "Size" title = "Database" uploadTitle = "Upload & import" version = "H2 Version" [admin.settings.database.customUrl] description = "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." label = "Custom Database URL" [admin.settings.database.enableCustom] description = "Use your own custom database configuration instead of the default embedded database" label = "Enable Custom Database" [admin.settings.database.hostName] description = "Database server hostname (not used if custom URL is provided)" label = "Host Name" [admin.settings.database.name] description = "Name of the database (not used if custom URL is provided)" label = "Database Name" [admin.settings.database.password] description = "Database authentication password" label = "Password" placeholder = "Enter database password" [admin.settings.database.port] description = "Database server port (not used if custom URL is provided)" label = "Port" [admin.settings.database.type] description = "Type of database (not used if custom URL is provided)" label = "Database Type" [admin.settings.database.username] description = "Database authentication username" label = "Username" [admin.settings.endpoints] description = "Control which API endpoints and endpoint groups are available." management = "Endpoint Management" title = "API Endpoints" userDefaults = "User Preference Defaults" userDefaultsDescription = "Set default values for user preferences. Users can override these in their personal settings." [admin.settings.endpoints.defaultHideUnavailableConversions] description = "Remove disabled conversion options instead of showing them grayed out" label = "Hide unavailable conversions by default" [admin.settings.endpoints.defaultHideUnavailableTools] description = "Remove disabled tools instead of showing them grayed out" label = "Hide unavailable tools by default" [admin.settings.endpoints.groupsToRemove] description = "Select endpoint groups to disable" label = "Disabled Endpoint Groups" placeholder = "Select groups to disable" [admin.settings.endpoints.toRemove] description = "Select individual endpoints to disable" label = "Disabled Endpoints" placeholder = "Select endpoints to disable" [admin.settings.enterpriseRequired] message = "An Enterprise license is required to access {{featureName}}. You are viewing demo data for reference." title = "Enterprise License Required" [admin.settings.features] description = "Configure optional features and functionality." title = "Features" [admin.settings.features.serverCertificate] description = "Generate the certificate that backs the \"Sign with ZhmmCloud PDF\" signing feature." label = "Certificate Signing" [admin.settings.features.serverCertificate.enabled] description = "Offer \"Sign with ZhmmCloud PDF\" using a certificate this server generates" label = "Enable Certificate Signing" [admin.settings.features.serverCertificate.organizationName] description = "Organization name for generated certificates" label = "Organization Name" [admin.settings.features.serverCertificate.regenerateOnStartup] description = "Generate new certificate on each application startup" label = "Regenerate on Startup" [admin.settings.features.serverCertificate.validity] description = "Number of days the certificate will be valid" label = "Certificate Validity (days)" [admin.settings.folderAccess] description = "Directories that folder sources and folder outputs are allowed to read from and write to. This is a security boundary: automations can never be pointed at a server path outside this list." securityNote = "Leave this empty to disable folder sources and outputs entirely. ZhmmCloud's own configuration directory is always off-limits." title = "Folder Access" [admin.settings.folderAccess.implied] description = "These ZhmmCloud-managed directories are always permitted and can't be changed here." serverStorage = "Server file storage" title = "Always allowed" watchedFolder = "Pipeline watched folder" [admin.settings.folderAccess.roots] add = "Add" empty = "No folders allowed. Folder sources and outputs are currently disabled." hint = "Enter absolute paths, for example /data/inbox." label = "Allowed folder roots" placeholder = "/data/inbox" remove = "Remove folder root" [admin.settings.general] branding = "Branding & appearance" description = "How this server runs: branding, storage, the tools it exposes, and the paths it may touch." system = "System" title = "System Settings" ui = "User Interface" [admin.settings.general.appName] description = "The name displayed in the browser tab and home page" label = "Application Name" [admin.settings.general.appNameNavbar] description = "The name displayed in the navigation bar" label = "Navbar Brand" [admin.settings.general.customHTMLFiles] description = "Allow serving custom HTML files from the customFiles directory" label = "Custom HTML Files" [admin.settings.general.customMetadata] label = "Custom Metadata" [admin.settings.general.customMetadata.author] description = "Default author for PDF metadata (e.g., username)" label = "Default Author" placeholder = "username" [admin.settings.general.customMetadata.autoUpdate] description = "Automatically update PDF metadata on all processed documents" label = "Auto Update Metadata" [admin.settings.general.customMetadata.creator] description = "Default creator for PDF metadata" label = "Default Creator" [admin.settings.general.customMetadata.producer] description = "Default producer for PDF metadata" label = "Default Producer" [admin.settings.general.customPaths] description = "Configure custom file system paths for pipeline processing and external tools" label = "Custom Paths" [admin.settings.general.customPaths.operations] label = "External Tool Paths" [admin.settings.general.customPaths.operations.unoconvert] description = "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" label = "Unoconvert Executable" [admin.settings.general.customPaths.operations.weasyprint] description = "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" label = "WeasyPrint Executable" [admin.settings.general.customPaths.pipeline] label = "Pipeline Directories" [admin.settings.general.customPaths.pipeline.finishedFoldersDir] description = "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" label = "Finished Folders Directory" [admin.settings.general.customPaths.pipeline.pipelineDir] description = "Base directory for pipeline resources (leave empty for default: /pipeline)" label = "Pipeline Directory" [admin.settings.general.customPaths.pipeline.watchedFoldersDir] description = "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" label = "Watched Folders Directory" [admin.settings.general.customPaths.pipeline.watchedFoldersDirs] description = "Directories where pipeline monitors for incoming PDFs (one per line or comma-separated; leave empty for default: /pipeline/watchedFolders)" label = "Watched Folders Directories" [admin.settings.general.defaultLocale] description = "The default language for new users (e.g., en_US, es_ES)" label = "Default Locale" [admin.settings.general.fileUploadLimit] description = "Maximum file upload size (e.g., 100MB, 1GB)" label = "File Upload Limit" [admin.settings.general.frontendUrl] description = "Base URL for frontend (e.g., https://pdf.example.com). Used for email invite links and mobile QR code uploads. Leave empty to use backend URL." label = "Frontend URL" [admin.settings.general.hideDisabledTools] description = "Hide disabled tools from the interface" label = "Hide Disabled Tools" [admin.settings.general.hideDisabledTools.googleDrive] description = "Hide Google Drive button when not enabled" label = "Hide Google Drive" [admin.settings.general.hideDisabledTools.mobileScanner] description = "Hide mobile QR scanner button when not enabled" label = "Hide Mobile Scanner" [admin.settings.general.homeDescription] description = "The description text shown on the home page" label = "Home Description" [admin.settings.general.languages] description = "Languages that users can select from (leave empty to enable all languages)" label = "Available Languages" placeholder = "Select languages" [admin.settings.general.showUpdate] description = "Display notifications when a new version is available" label = "Show Update Notifications" [admin.settings.general.showUpdateOnlyAdmin] description = "Restrict update notifications to admin users only" label = "Show Updates to Admins Only" [admin.settings.legal] description = "Legal documents, the login agreement, analytics and search visibility." documentsDescription = "Links users are shown for terms, privacy, cookies and the impressum." title = "Legal Documents" [admin.settings.legal.accessibilityStatement] description = "URL or filename to accessibility statement" label = "Accessibility Statement" [admin.settings.legal.cookiePolicy] description = "URL or filename to cookie policy" label = "Cookie Policy" [admin.settings.legal.disclaimer] 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. ZhmmCloud PDF and its developers assume no liability for your legal obligations." title = "Legal Responsibility Warning" [admin.settings.legal.impressum] description = "URL or filename to impressum (required in some jurisdictions)" label = "Impressum" [admin.settings.legal.loginAgreement] defaultLocaleHint = "— used as the fallback when a language has no file." defaultLocaleLink = "Configure the default locale" description = "Show a disclaimer users must accept after logging in. The text follows each user's language." discardConfirm = "You have unsaved changes that will be lost. Switch language anyway?" editLabel = "Markdown" editPlaceholder = "## Heading\n\nYour disclaimer text..." emptyPreview = "Nothing to preview yet." language = "Language" languageHelp = "Each language has its own file. If a user's language has no file, the agreement falls back to the default locale's file, then to the fallback text." loadError = "Failed to load the agreement for {{locale}}. Switch language and back to retry." previewLabel = "Preview" restartNote = "Enabling or disabling the agreement applies after a restart, like other settings. Text edits below apply immediately." save = "Save text" saved = "Saved" savedBody = "Login agreement updated for {{locale}}" textDescription = "Saved to customFiles/disclaimer/{{locale}}.md and shown live on the next login. Leave blank to remove this language." title = "Login Agreement" [admin.settings.legal.loginAgreement.anonymous] label = "Show in anonymous (no-login) mode" [admin.settings.legal.loginAgreement.enabled] label = "Enable login agreement" [admin.settings.legal.privacyPolicy] description = "URL or filename to privacy policy" label = "Privacy Policy" [admin.settings.legal.termsAndConditions] description = "URL or filename to terms and conditions" label = "Terms and Conditions" [admin.settings.loginDisabled] message = "Login mode must be enabled to modify admin settings. Please set SECURITY_ENABLELOGIN=true in your environment or security.enableLogin: true in settings.yml, then restart the server." readOnly = "The settings below show example values for reference. Enable login mode to view and edit actual configuration." title = "Login Mode Required" [admin.settings.mail] description = "Configure SMTP settings for sending email notifications." smtp = "SMTP Configuration" title = "Mail Server" [admin.settings.mail.enabled] description = "Enable email notifications and SMTP functionality" label = "Enable Mail" [admin.settings.mail.enableInvites] description = "Allow admins to invite users via email with auto-generated passwords" label = "Enable Email Invites" [admin.settings.mail.from] description = "The email address to use as the sender" label = "From Address" [admin.settings.mail.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." label = "Frontend URL" [admin.settings.mail.frontendUrlNote] link = "Configure in System Settings" note = "Note: Requires Frontend URL to be configured. " [admin.settings.mail.host] description = "The hostname or IP address of your SMTP server" label = "SMTP Host" [admin.settings.mail.password] description = "Password for SMTP authentication" label = "SMTP Password" placeholder = "Enter SMTP password" [admin.settings.mail.port] description = "The port number for SMTP connection (typically 25, 465, or 587)" label = "SMTP Port" [admin.settings.mail.username] description = "Username for SMTP authentication" label = "SMTP Username" [admin.settings.mcp] apikeyNote = "Clients send a ZhmmCloud API key in the X-API-KEY header (or Authorization: Bearer ). The key maps to its owning ZhmmCloud user - only provisioned accounts get in, and actions are audited as that user. Manage keys under Account > API Keys." connectorUrl = "Connector URL for ChatGPT and Claude" description = "Expose ZhmmCloud's PDF tools and AI agents to MCP clients over an OAuth-protected endpoint." title = "MCP Server" [admin.settings.mcp.acceptedAudiences] description = "Extra token audience values accepted besides the Resource ID (comma or space separated). Leave blank for strict RFC 8707. Needed for IdPs that cannot mint resource audiences - e.g. Supabase's OAuth server always issues aud=authenticated." label = "Additional accepted audiences (optional)" [admin.settings.mcp.allowedOps] description = "If set, ONLY these operation ids are exposed (an allow-list; comma or space separated). Leave blank to expose all enabled tools except any blocked below." label = "Allowed tools" [admin.settings.mcp.blockedOps] description = "Operation ids to hide from MCP (comma or space separated), e.g. add-password remove-password. Leave blank to expose all enabled tools." label = "Blocked tools" [admin.settings.mcp.builtin.cimd] description = "Lets a client such as ChatGPT identify itself with an https client_id URL. ZhmmCloud fetches that document (public hosts only) instead of requiring registration." label = "Allow client metadata URLs" [admin.settings.mcp.builtin.dcr] description = "Lets clients that cannot be pre-registered, such as Claude, register themselves (RFC 7591)." label = "Allow dynamic client registration" [admin.settings.mcp.downloadLinks] description = "Download links on tool results. Private links need the user to sign in; public links work for anyone holding them until they expire." label = "Result links" off = "Off" private = "Private (sign-in required)" public = "Public (anyone with the link)" [admin.settings.mcp.enabled] description = "When off (default), no /mcp endpoint, metadata, or MCP beans are loaded." label = "Enable MCP Server" [admin.settings.mcp.fileUrlHosts] description = "HTTPS hosts chat apps may pass file download URLs from (comma or space separated). Suffix match, * within one label, or * alone for any public host. Private addresses are always blocked. Empty turns attachments off." label = "Attachment hosts" [admin.settings.mcp.guide] step1 = "Enter your OAuth issuer + resource ID above, Save, and restart." step1ApiKey = "Create an API key under Account > API Keys (each user uses their own)." step1Builtin = "Set the Resource ID to this server's public /mcp URL, Save, and restart." step2 = "In your MCP client add a" step2b = "server pointing at:" step2Builtin = "In ChatGPT or claude.ai, add a custom connector with the connector URL:" step3 = "The client auto-discovers OAuth from:" step3ApiKey = "Send the key in an" step3ApiKeyb = "header (or Authorization: Bearer ). No OAuth or metadata discovery is used." step3Builtin = "Sign in with your ZhmmCloud account and approve access. Each user can revoke apps under Settings > MCP Server." step4 = "Approve the sign-in; the client retries with a token. Tools appear grouped: convert, pages, misc, security, ai." step4ApiKey = "Tools appear grouped: convert, pages, misc, security, ai - and every call is audited as the key's owner." tip = "Tip: register the resource ID as an allowed audience in your IdP. Tested with MCP Inspector and Claude Desktop." tipApiKey = "Tip: API-key mode needs no external IdP - simplest for self-host. The key maps to its owning ZhmmCloud user." tipBuiltin = "Tip: built-in mode needs no external IdP and works with OAuth-only clients. Use Test connection to check what they will see." title = "Connect an MCP client" [admin.settings.mcp.issuerUri] description = "Your OAuth2 authorization server (must publish /.well-known/openid-configuration). Required when enabled." label = "OAuth Issuer URL" [admin.settings.mcp.jwksUri] description = "Leave blank to discover it from the issuer. Set only if your IdP serves keys at a non-standard URL." label = "JWKS URL (optional)" placeholder = "Auto-discovered from issuer" [admin.settings.mcp.mode] apikey = "API key (ZhmmCloud per-user key)" builtin = "Built-in OAuth 2.1" description = "Built-in runs ZhmmCloud's own OAuth server with no IdP - the mode ChatGPT and the claude.ai connector need. OAuth uses an external IdP. API key uses a ZhmmCloud per-user key (X-API-KEY) and publishes no OAuth metadata." label = "Authentication mode" oauth = "OAuth 2.1 (external IdP)" [admin.settings.mcp.requireAccount] description = "Only let tokens through if their subject maps to a provisioned, enabled ZhmmCloud user." label = "Require an existing ZhmmCloud account" [admin.settings.mcp.resourceId] description = "This server's public /mcp URL. Tokens must list it in their audience (RFC 8707) or they are rejected." label = "Resource ID" [admin.settings.mcp.scopes] description = "Require mcp.tools.read for read ops and mcp.tools.write for write/AI ops." label = "Enforce OAuth scopes" [admin.settings.mcp.status] off = "Disabled" on = "Enabled" [admin.settings.mcp.test] error = "Could not run the test. Save and restart if you have just changed these settings." notReady = "Not ready - fix the items marked below" ready = "Clients can connect" run = "Test connection" running = "Testing..." [admin.settings.mcp.usernameClaim] description = "JWT claim matched against a ZhmmCloud username (e.g. sub, email, preferred_username)." label = "Username claim" [admin.settings.plan.noData] message = "This server could not reach the licence service. Retry, or check the licence key." title = "No plan data" [admin.settings.premium] description = "Configure your premium or enterprise license key." license = "License Configuration" noInput = "Please provide a license key or file" title = "Premium & Enterprise" [admin.settings.premium.currentLicense] file = "Source: License file ({{path}})" key = "Source: License key" noInput = "Please provide a license key or upload a certificate file" success = "Success" title = "Active License" type = "Type: {{type}}" [admin.settings.premium.enabled] description = "Enable license key checks for pro/enterprise features" label = "Enable Premium Features" [admin.settings.premium.file] choose = "Choose License File" description = "Upload your .lic or .cert license file from offline purchases" label = "License Certificate File" selected = "Selected: {{filename}} ({{size}})" successMessage = "License file uploaded and activated successfully. No restart required." [admin.settings.premium.inputMethod] file = "Certificate File" text = "License Key" [admin.settings.premium.key] description = "Enter your premium or enterprise license key. Premium features will be automatically enabled when a key is provided." label = "License Key" success = "License Key Saved" successMessage = "Your license key has been activated successfully. No restart required." [admin.settings.premium.key.overwriteWarning] line1 = "Overwriting your current license key cannot be undone." line2 = "Your previous license will be permanently lost unless you have backed it up elsewhere." line3 = "Important: Keep license keys private and secure. Never share them publicly." title = "⚠️ Warning: Existing License Detected" [admin.settings.premium.licenseKey] info = "If you have a license key or certificate file from a direct purchase, you can enter it here to activate premium or enterprise features." toggle = "Got a license key or certificate file?" [admin.settings.premium.movedFeatures] auditLogging = "<0>Audit Logging (ENTERPRISE) - Security" customMetadata = "<0>Custom Metadata (PRO) - General" databaseConfiguration = "<0>Database Configuration (ENTERPRISE) - Database" message = "Configure authentication and licensed features in their respective sections:" title = "Feature Settings" [admin.settings.privacy] analytics = "Analytics & Tracking" description = "What this server reports about itself, and to whom." searchEngine = "Search Engine Visibility" title = "Privacy" [admin.settings.privacy.enableAnalytics] description = "Collect anonymous usage analytics to help improve the application" label = "Enable Analytics" [admin.settings.privacy.googleVisibility] description = "Allow search engines to index this application" label = "Google Visibility" [admin.settings.privacy.metricsEnabled] description = "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" label = "Enable Metrics" [admin.settings.restart] later = "Restart Later" message = "Settings have been saved successfully. A server restart is required for the changes to take effect." now = "Restart Now" question = "Would you like to restart the server now or later?" title = "Restart Required" [admin.settings.security] authentication = "Authentication" description = "Configure authentication, login behavior, and security policies." pdfPermissions = "PDF permissions" title = "Security" [admin.settings.security.audit] hideDetails = "Hide audit level details" label = "Audit Logging" showDetails = "Show audit level details" [admin.settings.security.audit.advancedOptions] cost = "Now increasing processing time and memory usage on every operation." [admin.settings.security.audit.captureFileHash] description = "Extract SHA-256 hash of uploaded PDF files for integrity verification. Independent of audit level." label = "Capture File Hash (SHA-256)" [admin.settings.security.audit.captureOperationResults] description = "Capture method return values. Not recommended: significantly increases log volume and disk usage." label = "Capture Operation Results" [admin.settings.security.audit.capturePdfAuthor] description = "Extract author field from PDF documents during processing. Requires PDF parsing, increases latency. Independent of audit level." label = "Capture PDF Author Metadata" [admin.settings.security.audit.enabled] description = "Track user actions and system events for compliance and security monitoring" label = "Enable Audit Logging" [admin.settings.security.audit.level] description = "Audit Level: OFF (0) = no logging | BASIC (1) = file modifications (compress/split/merge/etc) & settings | STANDARD (2) = file operations + user actions | VERBOSE (3) = all requests including polling. Higher levels include all events from lower levels." label = "Audit Level" [admin.settings.security.audit.levelDetails] basic = "PDF file operations (compress, split, merge, etc.) and settings changes. Captures: operation status (success/failure), method parameters, timing. Minimal log volume." off = "No audit logging (except critical security events)" standard = "BASIC events plus: user login/logout, account changes, general GET requests. Excludes continuous polling calls (/auth/me, /app-config, /health, etc.) to reduce log noise. Ideal for most deployments." verbose = "STANDARD events plus: continuous polling calls, all GET requests, detailed timing. Warning: high log volume and performance impact." [admin.settings.security.audit.retentionDays] description = "Number of days to retain audit logs (0 = infinite retention)" label = "Audit Retention (days)" [admin.settings.security.csrfDisabled] description = "Disable Cross-Site Request Forgery protection (not recommended)" label = "Disable CSRF Protection" [admin.settings.security.enableLogin] description = "Require users to log in before accessing the application" label = "Enable Login" [admin.settings.security.honorOwnerPasswords] description = "Require the permissions password for restricted actions. Turning this off still requires passwords needed to open PDFs." label = "Honor PDF permissions" [admin.settings.security.htmlUrlSecurity] advanced = "Advanced Settings" description = "Configure URL access restrictions for HTML processing to prevent SSRF attacks" label = "HTML URL Security" networkBlocking = "Network Blocking" [admin.settings.security.htmlUrlSecurity.allowedDomains] description = "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" label = "Allowed Domains (Whitelist)" [admin.settings.security.htmlUrlSecurity.blockCloudMetadata] description = "Block cloud provider metadata endpoints (169.254.169.254)" label = "Block Cloud Metadata Endpoints" [admin.settings.security.htmlUrlSecurity.blockedDomains] description = "One domain per line (e.g., malicious.com). Additional domains to block" label = "Blocked Domains (Blacklist)" [admin.settings.security.htmlUrlSecurity.blockLinkLocal] description = "Block link-local addresses (169.254.x.x, fe80::/10)" label = "Block Link-Local Addresses" [admin.settings.security.htmlUrlSecurity.blockLocalhost] description = "Block localhost and loopback addresses (127.x.x.x, ::1)" label = "Block Localhost" [admin.settings.security.htmlUrlSecurity.blockPrivateNetworks] description = "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" label = "Block Private Networks" [admin.settings.security.htmlUrlSecurity.enabled] description = "Enable URL security restrictions for HTML to PDF conversions" label = "Enable URL Security" [admin.settings.security.htmlUrlSecurity.internalTlds] description = "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" label = "Internal TLDs" [admin.settings.security.htmlUrlSecurity.level] description = "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions" label = "Security Level" max = "Maximum (Whitelist Only)" medium = "Medium (Block Internal)" off = "Off (No Restrictions)" [admin.settings.security.initialLogin] label = "Initial Login" [admin.settings.security.initialLogin.password] description = "The password for the initial admin account" label = "Initial Password" [admin.settings.security.initialLogin.username] description = "The username for the initial admin account" label = "Initial Username" [admin.settings.security.jwt] label = "JWT Configuration" [admin.settings.security.jwt.allowedClockSkewSeconds] description = "Tolerance for client/server time drift during token validation (default: 60 seconds)" label = "Clock Skew Tolerance (seconds)" [admin.settings.security.jwt.desktopTokenExpiryMinutes] description = "Access token lifetime in minutes for desktop clients. Desktop apps automatically detected via User-Agent and receive longer sessions for better UX (default: 43200 = 30 days)" label = "Desktop Token Expiry (minutes)" [admin.settings.security.jwt.enableKeyCleanup] description = "Automatically remove expired JWT keys" label = "Enable Key Cleanup" [admin.settings.security.jwt.enableKeyRotation] description = "Automatically rotate JWT signing keys periodically" label = "Enable Key Rotation" [admin.settings.security.jwt.persistence] description = "Store JWT keys persistently to survive server restarts" label = "Enable Key Persistence" [admin.settings.security.jwt.refreshGraceMinutes] description = "Allow token refresh within this many minutes after expiry (default: 15 minutes, max 3 attempts)" label = "Refresh Grace Period (minutes)" [admin.settings.security.jwt.secureCookie] description = "Require HTTPS for JWT cookies (recommended for production)" label = "Secure Cookie" [admin.settings.security.jwt.tokenExpiryMinutes] description = "Access token lifetime in minutes for web clients (default: 1440 = 24 hours)" label = "Web Token Expiry (minutes)" [admin.settings.security.loginAttemptCount] description = "Maximum number of failed login attempts before account lockout" label = "Login Attempt Limit" [admin.settings.security.loginMethod] all = "All Methods" description = "The authentication method to use for user login" label = "Login Method" normal = "Username/Password Only" oauth2 = "OAuth2 Only" saml2 = "SAML2 Only" [admin.settings.security.loginResetTimeMinutes] description = "Time before failed login attempts are reset" label = "Login Reset Time (minutes)" [admin.settings.security.ssoNotice] message = "OAuth2 and SAML2 authentication providers live under Single sign-on, next to this section." title = "Looking for SSO/SAML settings?" [admin.settings.security.xFrameOptions] deny = "Deny (Prevents all framing)" description = "Controls whether the application can be embedded in iframes" disabled = "Disabled (No X-Frame-Options header)" label = "X-Frame-Options" sameorigin = "Same Origin (Allow framing from same domain)" [admin.settings.storage] description = "Control server storage and sharing options." title = "File Storage & Sharing" [admin.settings.storage.enabled] description = "Allow users to store files on the server." label = "Enable Server File Storage" [admin.settings.storage.sharing.email] description = "Allow sharing with email addresses." label = "Enable Email Sharing" mailLink = "Configure Mail Settings" mailNote = "Requires mail configuration. " [admin.settings.storage.sharing.enabled] description = "Allow users to share stored files." label = "Enable Sharing" [admin.settings.storage.sharing.links] description = "Allow sharing via signed-in links." frontendUrlLink = "Configure in System Settings" frontendUrlNote = "Requires a Frontend URL. " label = "Enable Share Links" [admin.settings.storage.signing.enabled] description = "Allow users to create multi-participant document signing sessions. Requires server file storage to be enabled." title = "Enable Group Signing" [admin.settings.telegram] description = "Configure Telegram bot connectivity, access controls, and feedback behavior." title = "Telegram Bot" [admin.settings.telegram.accessControl] description = "Restrict which users or channels can interact with the bot." title = "Access Control" [admin.settings.telegram.allowChannelIDs] description = "Enter Telegram channel IDs allowed to interact with the bot." label = "Allowed Channel IDs" placeholder = "Add channel ID and press enter" [admin.settings.telegram.allowUserIDs] description = "Enter Telegram user IDs allowed to interact with the bot." label = "Allowed User IDs" placeholder = "Add user ID and press enter" [admin.settings.telegram.botToken] description = "API token provided by BotFather for your Telegram bot." label = "Bot Token" [admin.settings.telegram.botUsername] description = "The public username of your Telegram bot." label = "Bot Username" [admin.settings.telegram.customFolderSuffix] description = "Append the chat ID to incoming file folders to isolate uploads per chat." label = "Use Custom Folder Suffix" [admin.settings.telegram.enableAllowChannelIDs] description = "When enabled, only listed channel IDs can use the bot." label = "Allow Specific Channel IDs" [admin.settings.telegram.enableAllowUserIDs] description = "When enabled, only listed user IDs can use the bot." label = "Allow Specific User IDs" [admin.settings.telegram.enabled] description = "Allow users to interact with ZhmmCloud PDF through your configured Telegram bot." label = "Enable Telegram Bot" [admin.settings.telegram.feedback] description = "Choose when the bot should send feedback to users and channels." title = "Feedback Messages" [admin.settings.telegram.feedback.channel] title = "Channel Feedback Rules" [admin.settings.telegram.feedback.channel.errorMessage] description = "Show detailed error messages for channels." label = "Show error messages (Channel)" [admin.settings.telegram.feedback.channel.errorProcessing] description = "Send processing error messages to channels." label = "Show processing errors (Channel)" [admin.settings.telegram.feedback.channel.noValidDocument] description = "Suppress the no valid document response for channel uploads." label = "Show \"No valid document\" (Channel)" [admin.settings.telegram.feedback.general.enabled] description = "Control whether the bot sends feedback messages at all." label = "Enable Feedback" [admin.settings.telegram.feedback.user] title = "User Feedback Rules" [admin.settings.telegram.feedback.user.errorMessage] description = "Show detailed error messages for users." label = "Show error messages (User)" [admin.settings.telegram.feedback.user.errorProcessing] description = "Send processing error messages to users." label = "Show processing errors (User)" [admin.settings.telegram.feedback.user.noValidDocument] description = "Suppress the no valid document response for user uploads." label = "Show \"No valid document\" (User)" [admin.settings.telegram.pipelineInboxFolder] description = "Folder under the pipeline directory where incoming Telegram files are stored." label = "Inbox Folder" [admin.settings.telegram.pollingIntervalMillis] description = "Interval between checks for new Telegram updates." label = "Polling Interval (ms)" [admin.settings.telegram.processing] description = "Control polling intervals and processing timeouts for Telegram uploads." title = "Processing" [admin.settings.telegram.processingTimeoutSeconds] description = "Maximum time to wait for a processing job before reporting an error." label = "Processing Timeout (seconds)" [admin.settings.unsavedChanges] cancel = "Keep Editing" discard = "Discard Changes" hint = "You have unsaved changes" message = "You have unsaved changes. Do you want to discard them?" title = "Unsaved Changes" [adminOnboarding] adminTools = "Finally, we have advanced administration tools like Auditing to track system activity and Usage Analytics to monitor how your users interact with the platform." configButton = "Open Settings to access all system configuration and administrative controls." connectionsSection = "The Connections section supports various login methods including custom SSO and SAML providers like Google and GitHub, plus email integrations for notifications and communications." databaseSection = "For advanced production environments, we have settings to allow external database hookups so you can integrate with your existing infrastructure." settingsOverview = "This is the Settings Panel. Admin settings are organized by category for easy navigation." systemCustomization = "We have extensive ways to customize the UI: System Settings let you change the app name and languages, Features allows server certificate management, and Endpoints lets you enable or disable specific tools for your users." teamsAndUsers = "Manage Teams and individual users here. You can invite new users via email, shareable links, or create custom accounts for them yourself." welcome = "Welcome to the Admin Tour! Let's explore the powerful enterprise features and settings available to system administrators." wrapUp = "That's the admin tour! You've seen the enterprise features that make ZhmmCloud PDF a powerful, customizable solution for organizations. You can replay it anytime - just open Settings and find it here in the Tours section under Help." [adminUserSettings] admin = "Admin" title = "User Control Settings" [alphabetOptions] arabic = "Arabic" chinese = "Chinese (Simplified)" japanese = "Japanese" korean = "Korean" roman = "Roman" thai = "Thai" [analytics] learnMore = "Learn more about our analytics" paragraph1 = "ZhmmCloud 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 ZhmmCloud PDF grow and to allow us to understand our users better." title = "Do you want to help make ZhmmCloud PDF better?" [annotate] tags = "annotate,highlight,draw,markup,comment,notes,review,redline,feedback,markup tools,sticky notes,shapes,arrows,text box,freehand" [annotation] alignCenter = "Align center" alignLeft = "Align left" alignRight = "Align right" annotationStyle = "Annotation style" backgroundColor = "Background color" borderOff = "Border: Off" borderOn = "Border: On" changeColor = "Change Color" chooseColor = "Choose color" circle = "Circle" clearBackground = "Remove background" clearDocumentAnnotations = "Clear all annotations" clearDocumentAnnotationsConfirm = "Clear all" clearDocumentAnnotationsDescription = "This removes all annotations currently loaded in the editor. Please save changes to persist this in the PDF." clearDocumentAnnotationsEmptyBody = "There are no annotations currently loaded in the editor." clearDocumentAnnotationsEmptyTitle = "No annotations to clear" clearDocumentAnnotationsErrorTitle = "Could not clear annotations" clearDocumentAnnotationsSuccessBody = "Please save changes to persist the annotation removal in the PDF." clearDocumentAnnotationsSuccessTitle = "All annotations cleared" clearDocumentAnnotationsTitle = "Clear all annotations?" clearDocumentAnnotationsUnavailableBody = "The annotation layer is still loading. Try again in a moment." clearDocumentAnnotationsUnavailableTitle = "Annotations are not ready" color = "Color" comment = "Comment" comments = "Comments" contents = "Text" delete = "Delete" deleted = "Annotation deleted" drawing = "Drawing" editSelectDescription = "Click an existing annotation to edit its color, opacity, text, or size." editText = "Edit" fillColor = "Fill Color" fillOpacity = "Fill Opacity" fontSize = "Font size" freehandHighlighter = "Freehand Highlighter" highlight = "Highlight" imagePreview = "Preview" insertText = "Insert Text" line = "Line" lineArrow = "Arrow" moreActions = "More actions" noBackground = "No background" note = "Note" notesStamps = "Notes & Stamps" opacity = "Opacity" pen = "Pen" polygon = "Polygon" polyline = "Polyline" properties = "Properties" rectangle = "Rectangle" replaceText = "Replace Text" saveChanges = "Save Changes" select = "Select" selectAndMove = "Select and Edit" settings = "Settings" shapes = "Shapes" square = "Square" squiggly = "Squiggly" stamp = "Add Image" stampSettings = "Stamp Settings" strikeout = "Strikeout" strokeColor = "Stroke Color" strokeOpacity = "Stroke Opacity" strokeWidth = "Width" text = "Text box" textAlignment = "Text Alignment" textMarkup = "Text Markup" title = "Annotate" underline = "Underline" undoDelete = "Undo" width = "Width" [app] description = "A free, private PDF editor you can run on any infrastructure." [appBanner] dismiss = "Dismiss" [attachments] addAttachments = "Add attachments..." convertToPdfA3b = "Convert to PDF/A-3b" convertToPdfA3bTooltip = "PDF/A-3b is an archival format ensuring long-term preservation. It allows embedding arbitrary file formats as attachments. Conversion requires Ghostscript and may take longer for large files." convertToPdfA3bTooltipHeader = "About PDF/A-3b Conversion" convertToPdfA3bTooltipTitle = "What it does" discardChanges = "Discard" downloadSingle = "Download attachment" duplicateName = "An attachment named '{{name}}' already exists." extractAll = "Extract all" filterPlaceholder = "Filter attachments..." noAttachments = "No attachments inside this PDF yet. Drop files below or click to browse." remove = "Remove attachment" rename = "Rename attachment" restore = "Undo delete" saveChanges = "Save Changes ({{count}})" tags = "attachments,add,remove,embed,file,extract,manage" title = "Manage Attachments" [attachments.badges] deleted = "DELETED" renamed = "RENAMED" staged = "STAGED" [audit] configureAudit = "Configure Audit Logging" configureAuditMessage = "Adjust audit logging level, retention period, and other settings in the Security & Authentication section." disabled = "Audit logging is disabled" disabledMessage = "Enable audit logging in your application configuration to track system events." enterpriseRequired = "Enterprise License Required" enterpriseRequiredMessage = "The audit logging system is an enterprise feature. Please upgrade to an enterprise license to access audit logs and analytics." goToSettings = "Go to Audit Settings" notAvailable = "Audit logging is off" notAvailableMessage = "Turn it on in Sign-in & security to start recording activity." [audit.charts] byType = "Events by Type" byUser = "Top Users" day = "Day" error = "Error loading charts" month = "Month" noData = "No data for this period" overTime = "Events Over Time" title = "Audit Dashboard" week = "Week" [audit.clearData] cancel = "Cancel" closeAlert = "Close alert" codeDoesNotMatch = "Code does not match" codePlaceholder = "Type the code here" confirmationCode = "Confirmation Code" confirmationRequired = "Delete All Audit Data" confirmMessage = "This will permanently remove all audit logs. Enter the confirmation code below to proceed." confirmTitle = "Please confirm you want to delete" deleteButton = "Delete" enterCode = "Confirmation Code" enterCodeBelow = "Enter the code exactly as shown above (case-sensitive)" failed = "Failed to clear audit data" initiateDelete = "Delete All Data" irreversible = "IRREVERSIBLE" success = "Success" successMessage = "All audit data has been cleared successfully" warning1 = "This action cannot be undone" warning2 = "Deleting audit data will permanently remove all historical audit logs, including security events, user activities, and file operations from the database." [audit.error] loadStatus = "Failed to load audit system status" title = "Error loading audit system" [audit.events] actions = "Actions" author = "Author" clearFilters = "Clear" details = "Details" documentName = "Document" endDate = "End date" error = "Error loading events" eventDetails = "Event Details" fileHash = "File Hash" filterByType = "Filter by type" filterByUser = "Filter by user" ipAddress = "IP Address" loadFailed = "Failed to load events" noEvents = "No events found" startDate = "Start date" timestamp = "Timestamp" title = "Audit Events" type = "Type" user = "User" viewDetails = "View Details" [audit.export] description = "Export audit events to CSV or JSON format. Use filters to limit the exported data." error = "Failed to export data" exportButton = "Export Data" fieldAuthor = "Author (from PDF)" fieldDate = "Date" fieldDocumentName = "Document Name" fieldFileHash = "File Hash (SHA-256)" fieldIpAddress = "IP Address" fieldOperationResults = "Operation Results" fieldOutcome = "Outcome (Success/Failure)" fieldTool = "Tool" fieldUsername = "Username" filters = "Filters (Optional)" format = "Export Format" selectFields = "Select Fields to Include" title = "Export Audit Data" [audit.filters] last30Days = "Last 30 days" last7Days = "Last 7 days" quickPresets = "Quick filters" thisMonth = "This month" today = "Today" [audit.stats] activeUsers = "Active Users" attention = "Attention needed" avgLatency = "Avg Latency" error = "Error loading statistics" excellent = "Excellent" good = "Good" loadFailed = "Failed to load statistics" noData = "N/A" successRate = "Success Rate" totalEvents = "Total Events" vsLastPeriod = "vs last period" [audit.systemStatus] captureBySettings = "Enable in settings" capturedFields = "Captured Fields" date = "Date" days = "days" disabled = "Disabled" documentName = "Document Name" enabled = "Enabled" fileHash = "File Hash" level = "Audit Level" pdfAuthor = "PDF Author" retention = "Retention Period" status = "Audit Logging" title = "System Status" tool = "Tool" totalEvents = "Total Events" username = "Username" [audit.tabs] clearData = "Clear Data" dashboard = "Dashboard" events = "Audit Events" export = "Export" [auth] accessDenied = "Access Denied" insufficientPermissions = "You do not have permission to perform this action." [auth.callback] alreadySignedIn = "Already signed in! Redirecting..." backToLogin = "Back to login" completing = "Completing authentication" exchanging = "Exchanging authorization code..." failedWithReason = "Authentication failed: {{error}}" invalidToken = "OAuth login failed - invalid token." missingToken = "OAuth login failed - no token received." noData = "No authentication data found" oauthFailed = "OAuth login failed. Please try again." pleaseWait = "Please wait while we finish signing you in." processing = "Processing authentication..." signedOut = "You have been signed out. Please sign in again." signInFailed = "Failed to complete sign in: {{error}}" success = "Sign in successful! Redirecting..." unknownError = "Unknown error" windowMayClose = "You can close this window once it completes." [auth.callback.title] default = "Authentication" processing = "Signing you in" success = "You're all set!" [auth.displayName] guest = "Guest" user = "User" [auto-rename] description = "Automatically finds the title from your PDF content and uses it as the filename." submit = "Auto Rename" tags = "auto-detect,header-based,organize,relabel" title = "Auto Rename" [auto-rename.error] failed = "An error occurred while auto-renaming the PDF." [auto-rename.results] title = "Auto-Rename Results" [auto-rename.settings] title = "About" [auto-rename.tooltip.description] title = "What it does" [auto-rename.tooltip.header] title = "How Auto-Rename Works" [auto-rename.tooltip.howItWorks] 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" title = "Smart Renaming" [autoFormDetection] loading = "Detecting form fields..." submit = "Detect form fields" [autoFormDetection.detects] checkboxes = "Checkboxes" label = "Finds and makes fillable" signatures = "Signatures" text = "Text fields" [autoFormDetection.error] failed = "An error occurred while detecting form fields." [autoFormDetection.progress] detecting = "Analyzing your document..." [autoFormDetection.results] title = "Review fillable PDF" [autoFormDetection.sensitivity] balanced = "Balanced" balancedHint = "Recommended for most forms." high = "Thorough" highHint = "Finds more fields, but may add some where none belong." label = "Detection sensitivity" low = "Strict" lowHint = "Only very confident matches - fewer fields, fewer mistakes." [autoFormDetection.settings] title = "Settings" [autoFormDetection.summary] checkboxes = "Checkboxes" noneBody = "The document may not contain form-like areas. Undo, switch sensitivity to \"Thorough\", and run again to look harder." noneTitle = "No form fields found" pages_one = "Across {{count}} page." pages_other = "Across {{count}} pages." radioButtons = "Radio buttons" signatures = "Signatures" stepTitle = "Detection results" textFields = "Text fields" title_one = "{{count}} fillable field added" title_other = "{{count}} fillable fields added" [automate] copyToSaved = "Copy to Saved" desc = "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." export = "Export" exportForFolderScanning = "Export for Folder Scanning" import = "Import" importPartialSuccess_one = "Imported with {{count}} unmapped operation: {{ops}}" importPartialSuccess_other = "Imported with {{count}} unmapped operations: {{ops}}" importSuccess = "Imported automation: {{name}}" invalidStep = "Invalid step" reviewTitle = "Automation Results" tags = "workflow,sequence,automation,automate,batch,batch processing,pipeline,chain,multi-step,recurring,scheduled,automatic,process multiple,bulk operations" title = "Automate" [automate.config] cancel = "Cancel" description = "Configure the settings for this tool. These settings will be applied when the automation runs." noSettings = "This tool does not have configurable settings." save = "Save Configuration" title = "Configure {{toolName}}" [automate.creation] createTitle = "Create Automation" editTitle = "Edit Automation" export = "Export" exportForFolderScanning = "Export for Folder Scanning" intro = "Automations run tools sequentially. To get started, add tools in the order you want them to run." save = "Save Automation" [automate.creation.description] label = "Description (optional)" placeholder = "Describe what this automation does..." [automate.creation.icon] label = "Icon" [automate.creation.name] label = "Automation Name" placeholder = "My Automation" [automate.creation.tools] add = "Add a tool..." addTool = "Add Tool" configure = "Configure tool" notConfigured = "! Not Configured" remove = "Remove tool" selected = "Selected Tools" selectTool = "Select a tool..." [automate.creation.unsavedChanges] cancel = "Cancel" confirm = "Go Back" message = "You have unsaved changes. Are you sure you want to go back? All changes will be lost." title = "Unsaved Changes" [automate.entryMenu] label = "Open menu for {{title}}" [automate.importModal] cancel = "Cancel" confirm = "Import" detectedAutomation = "Automate JSON" detectedFolderScan = "Folder Scanning JSON" dropHint = "Drop JSON here or click to choose a file" dropSubhint = "Both Automate and Folder Scanning configs are accepted" dropzoneAriaLabel = "Drop an automation JSON file here" intro = "Drop a JSON file or paste its contents below. The format (Automate or Folder Scanning) is detected automatically." opCount_one = "{{count}} operation" opCount_other = "{{count}} operations" parseError = "Could not parse: {{message}}" pasteLabel = "Or paste JSON" pastePlaceholder = "Paste your automation JSON here…" title = "Import automation" unresolved = "Unmapped: {{ops}}" [automate.run] progress = "Progress: {{current}}/{{total}}" title = "Run Automation" [automate.selection] title = "Automation Selection" [automate.selection.createNew] title = "Create New Automation" [automate.selection.saved] title = "Saved" [automate.selection.suggested] title = "Suggested" [automate.sequence] finish = "Finish" run = "Run Automation" running = "Running Automation..." signInToRun = "Sign in to run automations." steps_one = "{{count}} step" steps_other = "{{count}} steps" unnamed = "Unnamed Automation" [automation.suggested] emailPreparation = "Email Preparation" emailPreparationDesc = "Optimizes PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy." prePublishSanitization = "Pre-publish Sanitization" prePublishSanitizationDesc = "Sanitization workflow that removes all hidden metadata, JavaScript, embedded files, annotations, and flattens forms to prevent data leakage before publishing PDFs online." processImages = "Process Images" processImagesDesc = "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." securePdfIngestion = "Secure PDF Ingestion" securePdfIngestionDesc = "Comprehensive PDF processing workflow that sanitizes documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimizes file size." secureWorkflow = "Security Workflow" secureWorkflowDesc = "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorized access. Password is set to 'password' by default." [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." tags = "auto-detect,header-based,organize,relabel,auto rename,automatic rename,smart rename,rename by content,filename,file naming,detect title" [autoRotate] submit = "Auto Rotate" tags = "auto rotate,fix orientation,upside down,sideways,straighten,orient,detect orientation,correct rotation,auto orient,scanned,OSD" [autoRotate.confidenceThreshold] title = "Confidence threshold" [autoRotate.detectionMode] auto = "Auto" osd = "OCR only" text = "Text only" title = "Detection method" [autoRotate.error] failed = "An error occurred while auto-rotating the PDF." [autoRotate.inferUndetected] title = "Rotate low confidence pages to match" [autoRotate.report] applied = "{{degrees}}° CW" confidenceValue = "Confidence {{value}}" noChange = "No change" pageLabel = "Page {{number}}" summary = "{{rotated}} of {{total}} pages rotated, {{unchanged}} left as they are" title = "Detection report" [autoRotate.report.method] inferred = "Matched" none = "Skipped" osd = "OCR" text = "Text" [autoRotate.report.note] belowThreshold = "Below threshold" blankPage = "Page is blank" inferredFromDocument = "Same as the other pages" noDominantDirection = "Mixed text directions" osdFailed = "No readable text found" osdNoVerdict = "Could not tell which way up" tesseractUnavailable = "OCR not installed" tooFewGlyphs = "Too little text" [autoRotate.results] title = "Auto Rotate Results" [autoRotate.settings] title = "Settings" [autoRotate.tooltip.confidenceThreshold] text = "How certain the check has to be before a page is turned. Lower it to rotate more pages, raise it to leave more pages untouched." title = "Confidence threshold" [autoRotate.tooltip.description] text = "Works out which way up each page should be and turns it the right way round. Pages that are already upright are left alone." [autoRotate.tooltip.detectionMode] text = "Auto reads the text on the page first, then looks at the page as an image if that is not enough. Text only skips the image check, which is quickest for documents that were never scanned. OCR only treats every page as an image." title = "Detection method" [autoRotate.tooltip.header] title = "Auto Rotate" [autoRotate.tooltip.inferUndetected] text = "Blank or nearly blank pages cannot be checked on their own. When every page that could be read needs the same turn, these pages are turned to match them." title = "Rotate low confidence pages to match" [autoSizeSplitPDF] tags = "pdf,split,document,organization" [autoSplitPDF] dividerDownload2 = "Download 'Auto Splitter Divider (with instructions).pdf'" duplexMode = "Duplex Mode (Front and back scanning)" tags = "QR-based,separate,scan-segment,organize" title = "Auto Split PDF" [backendHealth] checking = "Checking backend status..." offline = "Backend Offline" online = "Backend Online" starting = "Backend starting up..." unavailable = "Backend is unavailable" wait = "Please wait for the backend to finish launching and try again." [backendHealth.restart] attempting = "Attempting to restart... ({{attempt}}/{{max}})" failedBody = "The local backend could not be recovered. Please restart the app." failedTitle = "Backend failed to restart" stoppedTitle = "Backend stopped unexpectedly" successBody = "The local backend is back online." successTitle = "Backend restarted" [backendStartup] notFoundTitle = "Backend not found" retry = "Retry" unreachable = "The application cannot currently connect to the backend. Verify the backend status and network connectivity, then try again." [billing] basedOnUsers = "(current users)" currentSeats = "Current Seats" manageBilling = "Manage Billing" minimumSeats = "Minimum Seats" newSeatCount = "New Seat Count" newSeatCountDescription = "Select the number of seats for your enterprise license" notEnterprise = "Seat management is only available for enterprise licenses" preparingUpdate = "Preparing seat update..." seatCountTooLow = "Seat count must be at least {{minimum}} (current number of users)" seatCountUnchanged = "Please select a different seat count" seatsUpdated = "Seats Updated" seatsUpdatedMessage = "Your enterprise seats have been updated to {{seats}}" stripePortalRedirect = "You will be redirected to Stripe's billing portal to review and confirm the seat change. The prorated amount will be calculated automatically." updateEnterpriseSeats = "Update Enterprise Seats" updateProcessing = "Update Processing" updateProcessingMessage = "Your seat update is being processed. Please refresh in a few moments." updateSeats = "Update Seats" whatHappensNext = "What happens next?" [billing.portal] error = "Failed to open billing portal" errorFallback = "Please try again or contact support." [bookletImposition] paperSizeNote = "Paper size is automatically derived from your first page." submit = "Create Booklet" tags = "booklet,imposition,printing,binding,folding,signature" title = "Booklet Imposition" [bookletImposition.addBorder] label = "Add borders around pages" tooltip = "Adds borders around each page section to help with cutting and alignment" [bookletImposition.addGutter] label = "Add gutter margin" tooltip = "Adds inner margin space for binding" [bookletImposition.advanced] toggle = "Advanced Options" [bookletImposition.doubleSided] label = "Double-sided printing" tooltip = "Creates both front and back sides for proper booklet printing" [bookletImposition.duplexPass] first = "1st Pass" firstInstructions = "Prints front sides → stack face-down → run again with 2nd Pass" label = "Print Pass" second = "2nd Pass" secondInstructions = "Load printed stack face-down → prints back sides" [bookletImposition.error] failed = "An error occurred while creating the booklet imposition." [bookletImposition.flipOnShortEdge] label = "Flip on short edge (automatic duplex only)" manualNote = "Not needed in manual mode - you flip the stack yourself" tooltip = "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)" [bookletImposition.gutterSize] label = "Gutter size (points)" [bookletImposition.manualDuplex] instructions = "For printers without automatic duplex. You'll need to run this twice:" title = "Manual Duplex Mode" [bookletImposition.rtlBinding] label = "Right-to-left binding" tooltip = "For Arabic, Hebrew, or other right-to-left languages" [bookletImposition.settings] title = "Settings" [bookletImposition.tooltip.advanced] 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" text = "Fine-tune your booklet:" title = "Advanced Options" [bookletImposition.tooltip.description] 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." title = "What is Booklet Imposition?" [bookletImposition.tooltip.example] 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" text = "Your 8-page document becomes 2 sheets:" title = "Example: 8-Page Booklet" [bookletImposition.tooltip.header] title = "Booklet Creation Guide" [bookletImposition.tooltip.manualDuplex] 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" text = "For printers without automatic duplex:" title = "Manual Duplex (Single-sided Printers)" [bookletImposition.tooltip.printing] 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" text = "Follow these steps for perfect booklets:" title = "How to Print & Assemble" [brickGame] balls = "Balls" best = "Best" close = "Close game" effectTimer = "{{label}} {{seconds}}s" hint = "Move with the pointer or the arrow keys. Click to capture the pointer, Esc to get back to work." hintPointerLocked = "Pointer captured. Esc releases it, then Esc again to get back to work." score = "Score" title = "Hidden game" [brickGame.effect] fast = "Fast" narrow = "Narrow" reversed = "Reversed" slow = "Slow" wide = "Wide" [brickGame.lost] detail = "Click or press Space to try again" headline = "Out of balls" [brickGame.ready] detail = "Click or press Space to serve" headline = "Ready" [brickGame.won] detail = "Click or press Space to play again" headline = "All clear" [bulkSelection] selectedPages_one = "Selected: {{count}} page ({{pages}})" selectedPages_other = "Selected: {{count}} pages ({{pages}})" syntaxError = "There is a syntax issue. See Page Selection tips for help." [bulkSelection.advanced] title = "Advanced" [bulkSelection.everyNthPage] placeholder = "Step size" title = "Every Nth Page" [bulkSelection.examples] combineSets = "Combine sets" every3rd = "Every 3rd" first50 = "First 50" last50 = "Last 50" oddWithinExcluding = "Odd within 1-20 excluding 5-7" title = "Examples" [bulkSelection.firstNPages] placeholder = "Number of pages" title = "First N Pages" [bulkSelection.header] title = "Page Selection Guide" [bulkSelection.keywords] title = "Keywords" [bulkSelection.lastNPages] placeholder = "Number of pages" title = "Last N Pages" [bulkSelection.operators] text = "AND has higher precedence than comma. NOT applies within the document range." title = "Operators" [bulkSelection.operators.and] title = "Combine selections (both conditions must be true)" [bulkSelection.operators.descriptions] 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)" [bulkSelection.operators.even] title = "Select all even-numbered pages (2, 4, 6, 8...)" [bulkSelection.operators.not] title = "Exclude from selection" [bulkSelection.operators.odd] title = "Select all odd-numbered pages (1, 3, 5, 7...)" [bulkSelection.operators.or] title = "Add to selection (either condition can be true)" [bulkSelection.pageSelection] title = "Page Selection" [bulkSelection.range] fromPlaceholder = "From" title = "Range" toPlaceholder = "To" [bulkSelection.syntax] text = "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported." title = "Syntax Basics" [bulkSelection.syntax.bullets] keywords = "Keywords: odd, even" numbers = "Numbers/ranges: 5, 10-20" progressions = "Progressions: 3n, 4n+1" [certSign] awaitingSignatures = "Awaiting signatures" chooseCertificate = "Choose Certificate File" chooseJksFile = "Choose JKS File" chooseP12File = "Choose PKCS12 File" choosePfxFile = "Choose PFX File" choosePrivateKey = "Choose Private Key File" declined = "Declined" fetchFailed = "Failed to load signing data" finalized = "Finalized" location = "Location" logoTitle = "Logo" name = "Name" noLogo = "No Logo" pageNumber = "Page Number" password = "Certificate Password" passwordOptional = "Leave empty if no password" pemCertificateLabel = "Certificate (.pem / .crt)" pemPrivateKeyLabel = "Private key (.pem / .key)" pending = "Pending" readyToFinalize = "Ready to finalize" reason = "Reason" serverCertMessage = "Using server certificate - no files or password required" showLogo = "Show Logo" signatureProgress = "{{signedCount}}/{{totalCount}} signatures" tags = "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto" title = "Certificate Signing" viewed = "Viewed" [certSign.appearance] invisible = "Invisible" stepTitle = "Signature Appearance" visibility = "Visibility" visible = "Visible" [certSign.appearance.options] title = "Signature Details" [certSign.appearance.tooltip.header] title = "About Signature Appearance" [certSign.appearance.tooltip.invisible] bullet1 = "Provides security without visual changes" bullet2 = "Meets legal requirements for digital signing" bullet3 = "Doesn't affect document layout or design" 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." title = "Invisible Signatures" [certSign.appearance.tooltip.visible] 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" 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." title = "Visible Signatures" [certSign.certFiles] stepTitle = "Certificate Files" [certSign.certType.tooltip.convert] text = "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." title = "Key not listed?" [certSign.certType.tooltip.header] title = "About Certificate Types" [certSign.certType.tooltip.what] 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." title = "What's a certificate?" [certSign.certType.tooltip.which] 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" text = "Choose the format that matches your certificate file:" title = "Which option should I use?" [certSign.certTypeStep] stepTitle = "Certificate Format" [certSign.collab.addParticipants] add_one = "Add {{count}} Participant" add_other = "Add {{count}} Participants" reasonHelp = "Pre-set a signing reason for these participants (optional, they can override when signing)" reasonPlaceholder = "e.g. Approval, Review..." [certSign.collab.finalize] button = "Finalize and Load Signed PDF" confirmAction = "Confirm and finalize" confirmDescription = "Finalizing closes this session. No more signatures can be submitted." confirmTitle = "Finalize this signing session?" early = "Finalize with Current Signatures" excluded = "Participants whose signatures will not be included" included = "Signatures included" requiresSignature = "At least one participant must sign before you can finalize." [certSign.collab.participant] certInvalid = "✗ {{error}}" certInvalidFallback = "Invalid certificate" certNetworkError = "Could not validate certificate" certValid = "✓ Certificate valid" certValidating = "Validating certificate..." certValidUntil = " until {{date}}" [certSign.collab.sessionCreation] includeSummaryPage = "Include Signature Summary Page" includeSummaryPageHelp = "A summary page will be added at the end with all signature metadata. The digital certificate signature boxes on individual pages will be suppressed (wet signatures are unaffected)." [certSign.collab.sessionDetail] addParticipants = "Add Participants" addParticipantsError = "Failed to add participants" deleteConfirm = "Are you sure? This cannot be undone." deleteError = "Failed to delete session" deleteSession = "Delete Session" dueDate = "Due Date" finalizeError = "Failed to finalize session" loadPdfError = "Failed to load signed PDF" loadSignedPdf = "Load Signed PDF into Active Files" messageLabel = "Message" participantRemoved = "Participant removed" participants = "Participants" participantsAdded = "Participants added successfully" removeParticipantError = "Failed to remove participant" selectUsers = "Select users..." [certSign.collab.sessionList] active = "Active" finalized = "Finalized" [certSign.collab.signatureSettings] description = "Configure how signatures will appear for all participants" title = "Signature Appearance" [certSign.collab.signRequest] addedToFiles = "Document added to active files" addToFiles = "Add to Active Files" certificateChoice = "Select a certificate to sign with" changeSignature = "Change signature" clearSignature = "Clear Signature" closed = "This session is finalized. You can view the final document, but no further signatures or declines are accepted." completeAndSign = "Complete & Sign" createNewSignature = "Create New Signature" decline = "Decline Request" declineButton = "Decline" deleteSelected = "Delete selected signature" drawSignature = "Draw your signature below" fileTooLarge = "File size must be less than 5MB" fontBrushScript = "Brush Script MT (cursive)" fontFamily = "Font Family" fontSize = "Font Size: {{size}}px" fontSizePlaceholder = "Size" from = "From" invalidFileType = "Please select an image file" location = "Location (Optional)" locationPlaceholder = "Where are you signing from?" noCertificate = "Please select a certificate file" p12File = "P12/PFX Certificate File" password = "Certificate Password" penColor = "Pen Color" penSize = "Pen Size: {{size}}px" reason = "Reason (Optional)" reasonPlaceholder = "Why are you signing?" removeImage = "Remove Image" savedSignatures = "Saved Signatures" selectFile = "Select Image File" selectSignatureTitle = "Select or Create Signature" signatureImageAlt = "Signature" signatureInfo = "These settings are configured by the document owner" signatureSettings = "Signature Settings" signatureText = "Signature Text" signatureTextPlaceholder = "Enter your name..." signatureTypeLabel = "Signature Type" signButton = "Sign Document" textColor = "Text Color" typeSignature = "Type your name to create a signature" uploadCert = "Upload a certificate" uploadCertDesc = "Use your own PKCS12, PFX, PEM or JKS certificate." uploadSignature = "Upload your signature image" usePersonalCert = "ZhmmCloud Sign · Personal" usePersonalCertDesc = "Sign with the certificate created for your account." useServerCert = "ZhmmCloud Sign · Organization" useServerCertDesc = "Sign with this server's shared organization certificate." useSignature = "Use signature" [certSign.collab.signRequest.certModal] certInvalid = "Certificate invalid: {{error}}" certInvalidFallback = "Invalid certificate" certNetworkError = "Could not validate certificate" certValidating = "Validating certificate..." certValidUntil = "Certificate valid until {{date}}" description_one = "{{count}} visible mark is ready. Choose a certificate to finish signing." description_other = "{{count}} visible marks are ready. Choose a certificate to finish signing." description_zero = "Your certificate will sign the document without visible marks." details = "Signing details (optional)" format = "Certificate format" sign = "Sign Document" title = "Choose how to sign" [certSign.collab.signRequest.mode] move = "Move Signature" place = "Place Signature" title = "Sign or move mode" [certSign.collab.signRequest.modeTabs] draw = "Draw" image = "Upload" text = "Type" [certSign.collab.signRequest.preview] create = "Add signature" imageAlt = "Selected signature" textFallback = "Signature" [certSign.collab.signRequest.saved] defaultCanvasLabel = "Drawing signature" defaultImageLabel = "Uploaded signature" defaultLabel = "Signature" defaultTextLabel = "Typed signature" delete = "Delete signature" none = "No saved signatures" [certSign.collab.signRequest.signatureType] draw = "Draw" type = "Type" upload = "Upload" [certSign.collab.signRequest.steps] back = "Back" cancelPlacement = "Cancel Placement" certificate = "Certificate" clickMultipleTimes = "Click on the PDF multiple times to place signatures. Drag any signature to move or resize it." clickToPlace = "Click on the PDF where you would like your signature to appear." continue = "Continue to Certificate Selection" continueToPlacement = "Continue to Placement" continueToReview = "Continue to Review" createSignature = "Create Signature" invisible = "Invisible" location = "Location:" multipleSignatures = "{{count}} signatures will be applied to the PDF" oneSignature = "1 signature will be applied to the PDF" placeOnPdf = "Place on PDF" reason = "Reason:" reviewTitle = "Review Before Signing" signaturePlaced = "Signature placed on page {{page}}. You can adjust the position by clicking again or continue to review." visibility = "Visibility:" visible = "Visible" yourSignatures = "Your Signatures ({{count}})" [certSign.collab.userSelector] loadError = "Failed to load users" noTeam = "No Team" noUsers = "No other users found." placeholder = "Select users..." you = "{{name}} (You)" [certSign.device] stepTitle = "This device" [certSign.error] failed = "An error occurred while processing signatures." [certSign.format] pkcs11 = "USB Token" windowsStore = "Windows certificate store" [certSign.hardware] certificate = "Certificate" customLibrary = "Custom driver path…" driver = "PKCS#11 driver" driverPath = "Driver library path" driverPathPlaceholder = "Full path to your PKCS#11 driver (.dll, .so or .dylib)" expired = "expired" expires = "expires" listCerts = "List certificates" loading = "Reading certificates…" noCerts = "No signing certificates found" noDriver = "No PKCS#11 driver was detected. Install your token's driver (e.g. OpenSC), then reopen this - or enter the driver path manually below." notYetValid = "not yet valid" pin = "Token PIN" pkcs11Hint = "Select your token's PKCS#11 driver, enter the PIN, then list the certificates on the token." pkcs11LoadError = "Could not read certificates from the token. Check the PIN and driver." refresh = "Refresh" selectCert = "Select certificate" selectDriver = "Select driver" slot = "Slot (optional)" windowsHint = "Pick a certificate from your Windows certificate store. Signing uses the key on your card/token - Windows will prompt for the PIN." windowsLoadError = "Could not read the Windows certificate store" [certSign.sessions] deleted = "Session deleted" fetchFailed = "Failed to load session details" finalized = "Session finalized" loaded = "Signed PDF loaded" pdfNotReady = "PDF Not Ready" pdfNotReadyDesc = "The signed PDF is being generated. Please try again in a moment." [certSign.sign] results = "Signed PDF" submit = "Sign PDF" [certSign.signMode.tooltip.auto] text = "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers." title = "Auto - Zero-setup, instant system seal" use = "Use when: you need speed and consistent internal identity across reviews and records." [certSign.signMode.tooltip.header] title = "About PDF Signatures" [certSign.signMode.tooltip.manual] text = "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognized." title = "Manual - Bring your certificate" use = "Use for: customer-facing, legal, compliance." [certSign.signMode.tooltip.overview] 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." title = "How signatures work" [certSign.signMode.tooltip.rule] text = "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." title = "Rule of thumb" [certSign.source] device = "This device" noOtherSources = "No other certificate sources are available." server = "Server" stepTitle = "Certificate source" upload = "Upload" [changeCreds] changeUsername = "Update your username. You will be logged out after updating." credsUpdated = "Account updated" description = "Changes saved. Please log in again." error = "Unable to update username. Please verify your password and try again." header = "Update Your Account Details" newUsername = "New Username" oldPassword = "Current Password" ssoManaged = "Your account is managed by your identity provider." title = "Change Credentials" [changeMetadata] filenamePrefix = "metadata" submit = "Change" tags = "edit,modify,update,metadata,properties,document properties,author,title,subject,keywords,creator,producer,info,document info,file properties" [changeMetadata.advanced] title = "Advanced Options" [changeMetadata.author] label = "Author" placeholder = "Document author" [changeMetadata.creationDate] label = "Creation Date" placeholder = "Creation date" [changeMetadata.creator] label = "Creator" placeholder = "Document creator" [changeMetadata.customFields] add = "Add Field" description = "Add custom metadata fields to the document" key = "Key" keyPlaceholder = "Custom key" remove = "Remove" title = "Custom Metadata" value = "Value" valuePlaceholder = "Custom value" [changeMetadata.dates] title = "Date Fields" [changeMetadata.deleteAll] checkbox = "Delete all metadata" label = "Remove Existing Metadata" [changeMetadata.error] failed = "An error occurred while changing the PDF metadata." [changeMetadata.keywords] label = "Keywords" placeholder = "Document keywords" [changeMetadata.modificationDate] label = "Modification Date" placeholder = "Modification date" [changeMetadata.producer] label = "Producer" placeholder = "Document producer" [changeMetadata.results] title = "Updated PDFs" [changeMetadata.standardFields] title = "Standard Fields" [changeMetadata.subject] label = "Subject" placeholder = "Document subject" [changeMetadata.title] label = "Title" placeholder = "Document title" [changeMetadata.tooltip.advanced] title = "Advanced Options" [changeMetadata.tooltip.advanced.trapped] bullet1 = "True: Document has been trapped for printing" bullet2 = "False: Document has not been trapped" bullet3 = "Unknown: Trapped status is not specified" description = "Indicates if document is prepared for high-quality printing." title = "Trapped Status" [changeMetadata.tooltip.customFields] 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" text = "Add your own custom key-value metadata pairs." title = "Custom Metadata" [changeMetadata.tooltip.dates] bullet1 = "Creation Date: When original document was made" bullet2 = "Modification Date: When last changed" text = "When the document was created and modified." title = "Date Fields" [changeMetadata.tooltip.deleteAll] text = "Complete metadata deletion to ensure privacy." title = "Remove Existing Metadata" [changeMetadata.tooltip.standardFields] 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" text = "Common PDF metadata fields that describe the document." title = "Standard Fields" [changeMetadata.trapped] false = "False" label = "Trapped Status" true = "True" unknown = "Unknown" [changePermissions] desc = "Change document restrictions and permissions." loading = "Loading current permissions..." submit = "Change Permissions" tags = "permissions,restrictions,rights,access control,allow,deny,printing,copying,editing,modify permissions,security settings,user rights" title = "Change Permissions" [changePermissions.error] failed = "An error occurred while changing PDF permissions." readFailed = "Could not read this PDF's current permissions. Set the restrictions manually before applying changes." [changePermissions.permissions.preventAssembly] label = "Prevent assembly of document" [changePermissions.permissions.preventExtractContent] label = "Prevent content extraction" [changePermissions.permissions.preventExtractForAccessibility] label = "Prevent extraction for accessibility" [changePermissions.permissions.preventFillInForm] label = "Prevent filling in form" [changePermissions.permissions.preventModify] label = "Prevent modification" [changePermissions.permissions.preventModifyAnnotations] label = "Prevent annotation modification" [changePermissions.permissions.preventPrinting] label = "Prevent printing" [changePermissions.permissions.preventPrintingFaithful] label = "Prevent high-quality printing" [changePermissions.results] title = "Modified PDFs" [changePermissions.tooltip.description] text = "Changes document permissions, allowing/disallowing access to different features in PDF readers." [changePermissions.tooltip.header] title = "Change Permissions" [changePermissions.tooltip.warning] text = "Compatible PDF applications honour these permissions. Keep a separate permissions password to control changes to the restrictions." [chat.actions] copy = "Copy message" [chat.dock] collapse = "Collapse chat" placeholder = "Ask ZhmmCloud Agent" title = "ZhmmCloud Agent" [chat.header] clearChat = "Clear chat" [chat.input] disclaimer = "AI can make mistakes. Be sure to verify the output before sharing." send = "Send message" [chat.progress] analyzing = "Analyzing your request..." calling_engine = "AI is thinking..." executing_tool_generic = "Running tool..." executing_tool_generic_step = "Running tool (step {{step}} of {{total}})..." executing_tool_single = "Running {{tool}}..." executing_tool_step = "Running {{tool}} (step {{step}} of {{total}})..." extracting_content = "Extracting content from your documents..." processing = "Processing extracted content..." ranForMinutes_one = "Ran for 1 minute" ranForMinutes_other = "Ran for {{count}} minutes" ranForMinutesSeconds = "Ran for {{minutes}} min, {{seconds}} sec" ranForSeconds_one = "Ran for 1 second" ranForSeconds_other = "Ran for {{count}} seconds" thinking = "Thinking..." whole_doc_compression_round = "Consolidating notes..." whole_doc_read_done = "Finished reading the document..." whole_doc_read_started = "Reading the document..." whole_doc_slice_done = "Reading the document... ({{percent}}% complete)" [chat.quickActions] browseYourFiles = "Browse your files" compressMany = "Compress these documents" compressOne = "Compress this document" convertMany = "Convert these documents to PDF" convertOne = "Convert this document to PDF" heading = "Get started" mergeMany = "Merge these {{count}} documents into 1" openFromComputer = "Open from computer" splitOne = "Split this document" [chat.responses] cannot_continue = "Something went wrong and I can't continue." cannot_do = "I'm unable to do that." done = "Done." need_clarification = "Could you clarify your request?" not_found = "I couldn't find the requested information." processing = "Processing ({{outcome}})..." unsupported_capability = "Unsupported capability: {{capability}}" usage_limit_reached = "You've reached your usage limit. Check your plan options to keep going." [classification.families] correspondence = "Correspondence" education = "Education" engineering = "Engineering" finance = "Financial" forms = "Forms" government = "Government" health = "Medical" hr = "HR" legal = "Legal" operations = "Operations" projects = "Projects" property = "Property" reports = "Reports" sales = "Marketing" travel = "Travel" [classification.labels] academic-record = "Academic record" action-plan = "Action plan" addendum = "Addendum" advertisement = "Advertisement" affidavit = "Affidavit" agenda = "Agenda" amendment = "Amendment" analytics-report = "Analytics report" announcement = "Announcement" annual-report = "Annual report" api-documentation = "API documentation" application-form = "Application form" appraisal-report = "Appraisal report" architecture-document = "Architecture document" articles-of-incorporation = "Articles of incorporation" assignment-brief = "Assignment brief" audit-report = "Audit report" balance-sheet = "Balance sheet" bank-statement = "Bank statement" benefits-summary = "Benefits summary" bill-of-lading = "Bill of lading" bill-of-materials = "Bill of materials" blueprint = "Blueprint" board-report = "Board report" board-resolution = "Board resolution" booking-confirmation = "Booking confirmation" brochure = "Brochure" budget = "Budget" business-plan = "Business plan" business-proposal = "Business proposal" bylaws = "Bylaws" campaign-brief = "Campaign brief" case-study = "Case study" cash-flow-statement = "Cash flow statement" catalog = "Catalog" cease-and-desist = "Cease and desist" certificate = "Certificate" certificate-of-completion = "Certificate of completion" change-log = "Change log" checklist = "Checklist" claim-form = "Claim form" closing-statement = "Closing statement" complaint-letter = "Complaint letter" compliance-document = "Compliance document" confirmation-letter = "Confirmation letter" consent-form = "Consent form" contract = "Contract" course-syllabus = "Course syllabus" court-filing = "Court filing" cover-letter = "Cover letter" credit-note = "Credit note" customs-declaration = "Customs declaration" customs-form = "Customs form" cv = "CV" datasheet = "Datasheet" debit-note = "Debit note" deed = "Deed" delivery-note = "Delivery note" demand-letter = "Demand letter" design-document = "Design document" diploma = "Diploma" discharge-summary = "Discharge summary" dissertation = "Dissertation" donation-receipt = "Donation receipt" dunning-letter = "Dunning letter" email-thread = "Email thread" employee-handbook = "Employee handbook" employment-contract = "Employment contract" estimate = "Estimate" event-agenda = "Event agenda" event-program = "Event program" eviction-notice = "Eviction notice" exam-paper = "Exam paper" expense-report = "Expense report" expense-summary = "Expense summary" explanation-of-benefits = "Explanation of benefits" fact-sheet = "Fact sheet" faq-document = "FAQ document" feasibility-study = "Feasibility study" feedback-form = "Feedback form" financial-forecast = "Financial forecast" financial-statement = "Financial statement" floor-plan = "Floor plan" flyer = "Flyer" form = "Form" franchise-agreement = "Franchise agreement" freight-document = "Freight document" gift-certificate = "Gift certificate" glossary = "Glossary" government-notice = "Government notice" grade-report = "Grade report" grant-agreement = "Grant agreement" grant-application = "Grant application" hoa-document = "HOA document" home-inspection-report = "Home inspection report" hr-memo = "HR memo" hr-policy = "HR policy" immigration-document = "Immigration document" immunization-record = "Immunization record" incident-report = "Incident report" income-statement = "Income statement" index = "Index" inspection-report = "Inspection report" insurance-certificate = "Insurance certificate" insurance-claim = "Insurance claim" insurance-policy = "Insurance policy" intake-form = "Intake form" inventory-list = "Inventory list" investment-summary = "Investment summary" invitation = "Invitation" invoice = "Invoice" itinerary = "Itinerary" job-application = "Job application" job-description = "Job description" lab-report = "Lab report" lease-agreement = "Lease agreement" leave-request = "Leave request" legal-brief = "Legal brief" legal-filing = "Legal filing" legal-notice = "Legal notice" legal-opinion = "Legal opinion" lesson-plan = "Lesson plan" letter = "Letter" letter-of-intent = "Letter of intent" license = "License" license-agreement = "License agreement" loan-agreement = "Loan agreement" loan-document = "Loan document" maintenance-log = "Maintenance log" manual = "Manual" market-research = "Market research" marketing-plan = "Marketing plan" media-kit = "Media kit" medical-invoice = "Medical invoice" medical-report = "Medical report" meeting-agenda = "Meeting agenda" meeting-minutes = "Meeting minutes" meeting-notes = "Meeting notes" membership-document = "Membership document" memo = "Memo" memorandum-of-understanding = "Memorandum of understanding" mortgage-document = "Mortgage document" nda = "NDA" newsletter = "Newsletter" non-compete-agreement = "Non-compete agreement" notice = "Notice" offer-letter = "Offer letter" onboarding-document = "Onboarding document" order-confirmation = "Order confirmation" order-form = "Order form" organization-chart = "Organization chart" packing-slip = "Packing slip" partnership-agreement = "Partnership agreement" patent = "Patent" pathology-report = "Pathology report" payment-reminder = "Payment reminder" payroll-document = "Payroll document" payslip = "Payslip" performance-review = "Performance review" permit = "Permit" petition = "Petition" pitch-deck = "Pitch deck" power-of-attorney = "Power of attorney" prescription = "Prescription" presentation = "Presentation" press-release = "Press release" price-list = "Price list" pricing-sheet = "Pricing sheet" privacy-policy = "Privacy policy" product-sheet = "Product sheet" proforma-invoice = "Proforma invoice" progress-report = "Progress report" project-charter = "Project charter" project-plan = "Project plan" promotional-material = "Promotional material" property-listing = "Property listing" proposal = "Proposal" public-notice = "Public notice" purchase-agreement = "Purchase agreement" purchase-order = "Purchase order" quality-report = "Quality report" quarterly-report = "Quarterly report" questionnaire = "Questionnaire" quick-start-guide = "Quick start guide" quote = "Quote" radiology-report = "Radiology report" receipt = "Receipt" recommendation-letter = "Recommendation letter" reference-letter = "Reference letter" referral-letter = "Referral letter" registration-confirmation = "Registration confirmation" registration-form = "Registration form" regulatory-filing = "Regulatory filing" release-notes = "Release notes" remittance-advice = "Remittance advice" rental-agreement = "Rental agreement" report = "Report" request-for-proposal = "Request for proposal" request-for-quotation = "Request for quotation" requirements-document = "Requirements document" research-abstract = "Research abstract" research-paper = "Research paper" reservation = "Reservation" resignation-letter = "Resignation letter" resume = "Resume" retrospective = "Retrospective" return-authorization = "Return authorization" risk-assessment = "Risk assessment" roadmap = "Roadmap" safety-data-sheet = "Safety data sheet" safety-procedure = "Safety procedure" sales-proposal = "Sales proposal" sales-report = "Sales report" schematic = "Schematic" scope-of-work = "Scope of work" service-agreement = "Service agreement" service-report = "Service report" settlement-agreement = "Settlement agreement" shareholder-agreement = "Shareholder agreement" shipping-confirmation = "Shipping confirmation" specification = "Specification" sponsorship-agreement = "Sponsorship agreement" standard-operating-procedure = "Standard operating procedure" statement-of-account = "Statement of account" statement-of-work = "Statement of work" status-report = "Status report" stock-report = "Stock report" study-guide = "Study guide" subpoena = "Subpoena" subscription-confirmation = "Subscription confirmation" supply-order = "Supply order" survey-form = "Survey form" survey-results = "Survey results" sustainability-report = "Sustainability report" table-of-contents = "Table of contents" tax-form = "Tax form" tax-return = "Tax return" tax-statement = "Tax statement" technical-drawing = "Technical drawing" technical-specification = "Technical specification" tenancy-agreement = "Tenancy agreement" tender-document = "Tender document" termination-letter = "Termination letter" terms-and-conditions = "Terms and conditions" terms-of-service = "Terms of service" test-plan = "Test plan" test-report = "Test report" thesis = "Thesis" ticket = "Ticket" timeline = "Timeline" timesheet = "Timesheet" title-document = "Title document" training-material = "Training material" transcript = "Transcript" travel-itinerary = "Travel itinerary" trust-document = "Trust document" user-guide = "User guide" utility-bill = "Utility bill" vendor-agreement = "Vendor agreement" visa-document = "Visa document" waiver = "Waiver" warehouse-receipt = "Warehouse receipt" warranty-document = "Warranty document" waybill = "Waybill" white-paper = "White paper" will = "Will" work-instruction = "Work instruction" work-order = "Work order" [classificationDemo] folderName = "Downloads" [classificationDemo.buttons] done = "Done" notNow = "Not now" skip = "Skip" stop = "Stop" [classificationDemo.chart] centre = "documents" hint = "Select a slice to see the document types behind it." label = "Documents by type: {{summary}}" noTypes = "These documents did not match a known type." [classificationDemo.defaultApp] body = "Make ZhmmCloud your default PDF app. Every PDF you open, from email, your browser, or your desktop, lands here, ready to read or edit. You can change this any time in Settings." cta = "Make ZhmmCloud my default" title = "Open every PDF in ZhmmCloud" [classificationDemo.followUp] background = "This runs in the background. The ring on the left shows progress." restCta = "Process the rest" serverCredits = "Your connected server manages credits for processing these files." title = "Want to keep going? You have {{count}} more PDFs in your Downloads folder." [classificationDemo.groups] other = "Other" [classificationDemo.offer] body = "Classify and organise the {{count}} most recent PDFs in your Downloads folder by type." cta = "Process my Downloads folder" privacy = "Your PDFs stay on this device. Your connected server records processing usage." title = "See what ZhmmCloud can do with a whole folder" [classificationDemo.phase] finishing = "Finishing up..." gathering = "Gathering PDF files..." processing = "Processing file {{done}}/{{total}}..." reading = "Reading Downloads folder..." [classificationDemo.processing] counts = "of {{total}} PDFs processed" [classificationDemo.results] documentCount_one = "{{count}} PDF" documentCount_other = "{{count}} PDFs" failedBody = "ZhmmCloud could not read your Downloads folder. Nothing on your computer was changed." failedTitle = "That did not finish" heading = "Your Downloads, sorted" summary = "ZhmmCloud read {{documents}} and sorted them into {{types}}." typeCount_one = "{{count}} type" typeCount_other = "{{count}} types" [classificationDemo.ring] done = "{{folder}} classified" doneDetail = "{{count}} PDFs sorted by type" progress = "{{done}} of {{total}} PDFs ({{percent}}%)" running = "Classifying {{folder}}" [classificationDemo.status] checked = "Checked {{checked}} of {{total}} files..." checking = "Checking each file's name and date..." connecting = "Connecting your Downloads folder..." library = "Adding it to your file library..." listing = "Listing the files in Downloads..." picking = "Looking for the {{count}} most recent PDFs..." [cloudBadge] tooltip = "This operation will use your cloud credits" [color.eyeDropper] tooltip = "Pick color from screen" [colorPicker] hue = "Hue" saturation = "Saturation and brightness" title = "Choose color" transparent = "Transparent" [common] actions = "Actions" back = "Back" cancel = "Cancel" change = "Change" clearFilters = "Clear filters" close = "Close" codeSample = "Code sample" collapse = "Collapse" confirm = "Confirm" continue = "Continue" copied = "Copied!" copy = "Copy" copyCode = "Copy code" copyFailed = "Copy failed" dismiss = "Dismiss" done = "Done" enterValue = "Enter value" error = "Error" expand = "Expand" filterEmpty = "Nothing to filter on" goToSlide = "Go to slide {{number}}" loading = "Loading..." moreInformation = "More information" next = "Next" noData = "No data" nOfTotal = "{{current}} of {{total}}" open = "Open" preview = "Preview" previous = "Previous" refresh = "Refresh" remaining = "Remaining" retry = "Retry" save = "Save" search = "Search" settingsSections = "Settings sections" showAllTotal = "Show all {{total}}" showLess = "Show less" stepOf = "Step {{current}} of {{total}}" [compare] clearSelected = "Clear selected" clearSlot = "Remove file" cta = "Compare" loading = "Comparing..." newLine = "new-line" pages = "Pages" tags = "differentiate,contrast,changes,analysis" title = "Compare" workbenchLabel = "Compare view" [compare.actions] linkScroll = "Link scroll" placeSideBySide = "Place side by side" resetView = "Reset view" stackVertically = "Stack vertically" unlinkScroll = "Unlink scroll" zoomIn = "Zoom in" zoomOut = "Zoom out" [compare.clear] confirm = "Clear Selected" confirmBody = "This will close the current comparison and take you back to Active Files." confirmTitle = "Clear selected PDFs?" [compare.dropdown] additions = "Additions ({{count}})" additionsLabel = "Additions" deletions = "Deletions ({{count}})" deletionsLabel = "Deletions" noResults = "No changes found" searchPlaceholder = "Search changes..." [compare.earlyDissimilarity] body = "We're seeing very few similarities so far. You can stop the comparison if these aren't related documents." stopButton = "Stop comparison" title = "These PDFs look highly different" [compare.edited] label = "Edited PDF" placeholder = "Select the edited PDF" selectBaseFirst = "Select original PDF first" [compare.error] filesMissing = "Unable to locate the selected files. Please re-select them." generic = "Unable to compare these files." selectRequired = "Select a original and edited document." title = "Comparison failed" [compare.large.file] message = "One or Both of the provided documents are too large to process" [compare.longJob] body = "These PDFs together exceed 2,000 pages. Processing can take several minutes." title = "Large comparison in progress" [compare.no.text] message = "One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison." [compare.original] label = "Original PDF" placeholder = "Select the original PDF" [compare.pixel] base = "Original" changed = "changed" comparison = "Edited" diff = "Differences" diffOnly = "Diff only" missingInBase = "Missing in original" missingInComparison = "Missing in edited" overall = "overall" overlay = "Overlay" pageLabel = "Page" pagesChanged = "pages changed" sideBySide = "Side-by-side" sizeMismatch = "Size mismatch" summaryTitle = "Pixel comparison" [compare.pixel.errors] canvasContextUnavailable = "Unable to acquire 2D canvas context for pixel comparison." [compare.pixel.warnings] noPages = "One or both documents have no pages." pageCountMismatch = "Page count mismatch: original has {{base}} page(s), edited has {{comparison}}. Extra pages are shown one-sided and marked as fully removed/added." [compare.rendering] complete = "Page rendering complete" inProgress = "At least one of these PDFs are very large, scrolling won't be smooth until the rendering is complete" pageNotReadyBody = "Some pages are still rendering. Navigation will snap once they are ready." pageNotReadyTitle = "Page not rendered yet" pagesRendered = "pages rendered" rendering = "rendering" [compare.review] title = "Comparison Result" [compare.selection] originalEditedTitle = "Select Original and Edited PDFs" [compare.status] complete = "Comparison ready" error = "Comparison failed" extracting = "Extracting text..." processing = "Analyzing differences..." [compare.summary] baseHeading = "Original document" comparisonHeading = "Edited document" pageLabel = "Page" [compare.swap] confirm = "Swap and Re-run" confirmBody = "This will rerun the tool. Are you sure you want to swap the order of Original and Edited?" confirmTitle = "Re-run comparison?" label = "Swap" [compare.toasts] unlinkedBody = "Tip: Arrow Up/Down scroll both panes; panning only moves the active pane." unlinkedTitle = "Independent scroll & pan enabled" [compare.too.dissimilar] message = "These documents appear highly dissimilar. Comparison was stopped to save time." [compress] desc = "Compress PDFs to reduce their file size." submit = "Compress" tags = "shrink,reduce,optimize,compress,smaller,downsize,file size,reduce size,minimize,make smaller,decrease size,optimize size" title = "Compress" [compress.compressionLevel] range1to3 = "Lower values preserve quality but result in larger files" range4to6 = "Medium compression with moderate quality reduction" range7to9 = "Higher values reduce file size significantly but may reduce image clarity" [compress.error] failed = "An error occurred while compressing the PDF." [compress.grayscale] label = "Apply Grayscale for Compression" [compress.linearize] label = "Linearize PDF for fast web viewing" [compress.lineArt] description = "Uses ImageMagick to reduce pages to high-contrast black and white for maximum size reduction." detailLevel = "Detail level" edgeEmphasis = "Edge emphasis" edgeHigh = "Strong" edgeLow = "Gentle" edgeMedium = "Balanced" label = "Convert images to line art" unavailable = "ImageMagick is not installed or enabled on this server" [compress.method] filesize = "File Size" quality = "Quality" title = "Compression Method" [compress.noReduction] multiple = "Compression ran successfully, but {{count}} of {{total}} files can't be compressed any further." multipleAtLevel = "Compression at this level made no improvement to {{count}} of {{total}} files. Try a higher compression level." single = "Compression ran successfully, but this file can't be compressed any further." singleAtLevel = "Compression at this level made no improvement to this file. Try a higher compression level." [compress.settings] desiredSize = "Desired File Size" desiredSizePlaceholder = "Enter size" desiredSizeUnit = "Size unit" title = "Settings" [compress.tooltip.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." title = "Description" [compress.tooltip.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." title = "Grayscale" [compress.tooltip.header] title = "Compress Settings Overview" [compress.tooltip.lineArt] text = "Convert pages to high-contrast black and white using ImageMagick. Use detail level to control how much content becomes black, and edge emphasis to control how aggressively edges are detected." title = "Line Art" [compress.tooltip.qualityAdjustment] bullet1 = "Lower values preserve quality" bullet2 = "Higher values reduce file size" 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." title = "Quality Adjustment" [compressPdfs] tags = "squish,small,tiny" [config] plan = "Plan" planDescription = "Your plan, credits and spend limit, and the invoices behind them." team = "Team" teamDescription = "Who shares this workspace, and invitations still waiting on an answer." [config.account.overview] confirmDelete = "Delete My Account" deleteAccount = "Delete Account" deleteAccountTitle = "Delete Account" deleteFailed = "Failed to delete account." deleteFailedTitle = "Unable to delete account" deleteWarning = "This action is permanent and cannot be undone. All your data will be deleted." enterEmailConfirm = "To confirm deletion, please type your email address ({{email}}) below:" guestDescription = "You are signed in as a guest. Consider upgrading your account above." label = "Overview" manageAccountPreferences = "Manage your account preferences" signedInAs = "Account" title = "Account Settings" [config.account.profilePicture] description = "Upload an image to personalize your account." help = "PNG, JPG, or WebP up to 2MB." remove = "Remove" removeFailed = "Failed to remove profile picture" sizeError = "Please select an image smaller than 2MB." switchedToCustom = "Switched to custom picture. You can now upload your own." switchFailed = "Failed to switch to custom picture" title = "Profile picture" upload = "Upload" uploadFailed = "Failed to upload profile picture" useCustom = "Use custom picture" usingProvider = "Using {{provider}} profile picture" [config.account.profilePicture.cropper] cropError = "Failed to crop image. Please try again." invalidImage = "Invalid image file. Please select a valid PNG, JPG, or WebP file." processing = "Processing crop..." save = "Save Cropped Image" sizeErrorAfterCrop = "Cropped image is too large. Please zoom out or crop a smaller area." title = "Crop Profile Picture" zoom = "Zoom" [config.account.security] changeFailed = "Failed to change password" changePassword = "Change password" description = "Manage your password and security settings." title = "Passwords & Security" update = "Update password" [config.account.upgrade] description = "Link your account to preserve your history and access more features!" email = "Email" emailPassword = "or enter your email & password" emailPlaceholder = "Enter your email" failed = "Failed to upgrade account" failedWithProvider = "Failed to upgrade account with {{provider}}" linkWith = "Link with" linkWithProvider = "Link with {{provider}}" password = "Password (optional)" passwordNote = "Leave empty to use email verification only" passwordPlaceholder = "Set a password" socialLogin = "Upgrade with Social Account" success = "Account upgraded successfully! You can now sign in with your email." title = "Upgrade Guest Account" upgradeButton = "Upgrade Account" [config.apiKeys] copyKeyAriaLabel = "Copy API key" description = "Your API key for accessing ZhmmCloud's suite of PDF tools. Copy it to your project or refresh to generate a new one." docsDescription = "Learn more about integrating with ZhmmCloud PDF:" docsLink = "API Documentation" docsTitle = "API Documentation" generateError = "We couldn't generate your API key." goToAccount = "Go to Account" guestInfo = "Guest users do not receive API keys. Create an account to get an API key you can use in your applications." intro = "Use your API key to programmatically access ZhmmCloud PDF's processing capabilities." label = "API Key" publicKeyAriaLabel = "Public API key" refreshAriaLabel = "Refresh API key" schemaLink = "API Schema Reference" usage = "Include this key in the X-API-KEY header with all API requests." [config.apiKeys.alert] apiKeyErrorTitle = "API Key Error" apiKeyRefreshed = "API Key Refreshed" apiKeyRefreshedBody = "Your API key has been successfully refreshed." failedToCreateApiKey = "Failed to create API key." failedToFetchApiKey = "Failed to fetch API key." failedToRefreshApiKey = "Failed to refresh API key." failedToRetrieveApiKey = "Failed to retrieve API key from response." [config.apiKeys.refreshModal] confirmCta = "Refresh Keys" confirmPrompt = "Are you sure you want to continue?" impact = "Any applications or services currently using these keys will stop working until you update them with the new keys." title = "Refresh API Keys" warning = "⚠️ Warning: This action will generate new API keys and make your previous keys invalid." [config.mcp] apiKeyModeNotice = "This server uses API-key mode. Clients that can send a header - Claude Desktop, Claude Code, VS Code - work with the snippets below. ChatGPT and the claude.ai connector only support OAuth, so an administrator must switch the MCP auth mode to built-in for them." description = "Model Context Protocol (MCP) lets AI assistants like Claude use your ZhmmCloud PDF tools directly. Connect a client once and your assistant can convert, edit, secure and process documents on your behalf." disabled = "The MCP server is turned off on this instance. An administrator can enable it under Settings > Integrations." guestInfo = "Guest users can't connect MCP clients. Create an account to use the MCP server and let your AI assistant run ZhmmCloud PDF tools on your behalf." navLabel = "MCP Server" tip = "Every action your assistant runs is performed as your account and counts toward your usage, just like using ZhmmCloud PDF directly." viewApiKeys = "View API keys" [config.mcp.copy] configLabel = "Config" copied = "Copied" copy = "Copy" endpointLabel = "Endpoint URL" tooltip = "Copy {{label}}" tooltipCopied = "{{label}} copied" [config.mcp.endpoint] connectorHint = "In ChatGPT or claude.ai, add a custom connector with this URL. You'll sign in with your ZhmmCloud account and approve access." label = "Your MCP endpoint" [config.mcp.grants] empty = "No apps connected yet. Once you approve one, it appears here and you can revoke it at any time." lastUsed = "Last used {{when}}" loading = "Loading connected apps..." neverUsed = "Not used yet" revoke = "Revoke" revoking = "Revoking..." title = "Connected apps" [config.mcp.setup] addTo = "Add to" hint = "Pick your client, paste the snippet into the file shown, then restart it. You'll sign in with your ZhmmCloud account on first use - no keys to copy." hintApiKey = "Create an API key under API Keys, paste the snippet into the file shown, replace YOUR_API_KEY, then restart the client." title = "Connect your AI assistant" [config.overview] description = "Current application settings and configuration details." error = "Error" loading = "Loading configuration..." title = "Application Configuration" warning = "Configuration Warning" [config.overview.sections] basic = "Basic Configuration" integration = "Integration Configuration" security = "Security Configuration" system = "System Configuration" [connect] loading = "Checking this request." redirecting = "Returning you to your server." step = "Step {{current}} of {{total}}" [connect.confirm] acknowledge = "I recognise this address and want to connect it to my team" approve = "Connect server" cannotDecide = "Only a team owner can approve or decline this connection. Use a different account or dismiss this prompt to continue using ZhmmCloud." deny = "Decline" dismiss = "Dismiss" lead = "A ZhmmCloud server is asking to connect to your team. Check the address below is yours before you approve." originLabel = "Address" signedInAs = "Signed in as" switchAccount = "Use a different account" title = "Connect this server?" unknownAccount = "an unknown account" [connect.confirm.insecure] body = "This address does not use HTTPS, so your sign-in will be sent over an unencrypted connection. Only approve it on a network you trust." label = "Not an encrypted address" [connect.declined] body = "Nothing was connected. You can close this page." title = "Request declined" [connect.error] failed = "That did not go through. Only a team owner can connect a server." [connect.meta] title = "Connect a server" [connect.notFound] body = "This connection request is not valid. It may have expired, or already been used. Start another one from your server." title = "Request not valid" [connect.renewal] approve = "Renew sign-in" currentOwnerRequired = "Sign in as the current owner of the linked cloud team to renew this server's sign-in. If ownership was transferred, use the new owner's account." failed = "Your sign-in could not be renewed. Try again, or dismiss this page and start again from your server." lead = "This server is already linked to your account. Renew your sign-in to return to billing and usage on your server." title = "Renew your server sign-in" [convert] autoRotate = "Auto Rotate" autoRotateDescription = "Automatically rotate images to better fit the PDF page" blackwhite = "Black & White" cbrDpi = "DPI for image rendering" cbrOptions = "CBR Options" cbrOutputOptions = "PDF to CBR Options" cbrToPdf = "CBR → PDF" cbzDpi = "DPI for image rendering" cbzOptions = "CBZ to PDF Options" cbzOutputOptions = "PDF to CBZ Options" cbzToPdf = "CBZ → PDF" color = "Color" colorType = "Color Type" combineImages = "Combine Images" combineImagesDescription = "Combine all images into one PDF, or create separate PDFs for each image" combineSvgs = "Combine SVGs into single PDF" combineSvgsDescription = "Combine all SVG files into one PDF with multiple pages, or create separate PDFs for each SVG" conversionResults = "Conversion Results" convertFiles = "Convert Files" convertFrom = "Convert from" converting = "Converting..." convertTo = "Convert to" desc = "Convert files between different formats" downloadHtml = "Download HTML intermediate file instead of PDF" dpi = "DPI" ebookToPdf = "eBook → PDF" emailOptions = "Email to PDF Options" emlToPdf = "Email → PDF" errorConversion = "An error occurred while converting the file." fileToPdf = "Office/Document → PDF" fillPage = "Fill Page" fitDocumentToPage = "Fit Document to Page" fitOption = "Fit Option" grayscale = "Grayscale" imageOptions = "Image Options" includeAllRecipients = "Include CC and BCC recipients in header" includeAttachments = "Include email attachments" maintainAspectRatio = "Maintain Aspect Ratio" maxAttachmentSize = "Maximum attachment size (MB)" multiple = "Multiple" optimizeForEbook = "Optimize PDF for ebook readers (uses Ghostscript)" output = "Output" outputFormat = "Output Format" pdfaAccessibleFormat = "{{format}} (accessible)" pdfaDigitalSignatureWarning = "The PDF contains a digital signature. This will be removed in the next step." pdfaNote = "PDF/A-1b is more compatible, PDF/A-2b supports more features, PDF/A-3b supports embedded files." pdfaOptions = "PDF/A Options" pdfOptions = "PDF Options" pdfToCbr = "PDF → CBR" pdfToCbz = "PDF → CBZ" pdfToEpub = "PDF → EPUB" pdfUaAltTextNotice = "Images need a written description before a document can be certified. Descriptions are never generated automatically, because an invented one passes the checker while telling a screen-reader user nothing. Any image left without one is reported, and the file comes back tagged but not certified." pdfUaAltTextScanFailed = "The images could not be listed. Convert anyway and the response reports what is missing." pdfUaAltTextSingleFileOnly = "Descriptions belong to one document: an image is identified by its position, which is a different image in every file. Convert these {{fileCount}} files to tag them, then convert one at a time to describe its images." pdfUaEmbedFonts = "Embed missing fonts" pdfUaEmbedFontsHelp = "PDF/UA requires every font to be embedded. Turning this off is faster but usually prevents conformance." pdfUaFigureLabel = "Page {{page}} {{kind}}" pdfUaFigurePlaceholder = "What this image tells the reader" pdfUaFindImages = "Find images needing a description" pdfUaLanguage = "Document language" pdfUaLanguageHelp = "A BCP-47 tag such as en-GB. Used only when the document does not already declare its own language." pdfUaNoImagesNeedingText = "No image is missing a description." pdfUaOptions = "PDF/UA Options" pdfUaOverrideLanguage = "Replace the document's own language" pdfUaOverrideLanguageHelp = "Only tick this if the language above is right and the document's own is wrong. Relabelling a document into a language it is not written in makes a screen reader unintelligible." pdfUaProfile = "Conformance level" pdfUaSignatureWarning = "This PDF is digitally signed. Tagging rewrites the page content the signature covers, so the signature will stop verifying. Convert first, then re-sign." pdfUaTitle = "Document title" pdfUaTitleHelp = "Shown by a reader instead of the filename. Left blank, the first heading is used." selectSourceFormatFirst = "Choose a source format first" settings = "Settings" single = "Single" sourceFormatPlaceholder = "Source format" zhmmOfficeConvert = "Use ZhmmCloud Office Convert (beta)" zhmmOfficeConvertDescription = "Better, faster conversions with less memory. Turn off to use the standard converter." strictMode = "Strict Mode" strictModeDesc = "Error if conversion is not perfect (uses VeraPDF verification)" svgPdfOptions = "SVG to PDF Options" svgToPdf = "SVG → PDF" svgVectorNote = "SVG files are rendered as vector graphics for crisp output at any resolution. Dimensions from the SVG determine the PDF page size." tags = "transform,change,convert,PDF to Word,PDF to Excel,PDF to image,Word to PDF,Excel to PDF,PowerPoint to PDF,HTML to PDF,export,import,file conversion,format change,save as" targetFormatPlaceholder = "Target format" title = "Convert" webOptions = "Web to PDF Options" zoomLevel = "Zoom Level" [convert.ebookOptions] embedAllFonts = "Embed all fonts" embedAllFontsDesc = "Embed all fonts from the eBook into the generated PDF" includePageNumbers = "Include page numbers" includePageNumbersDesc = "Add page numbers to the generated PDF" includeTableOfContents = "Include table of contents" includeTableOfContentsDesc = "Add a generated table of contents to the resulting PDF" optimizeForEbookPdf = "Optimize for ebook readers" optimizeForEbookPdfDesc = "Optimize the PDF for eBook reading (smaller file size, better rendering on eInk devices)" [convert.epubOptions] detectChapters = "Detect chapters" detectChaptersDesc = "Detect headings that look like chapters and insert EPUB page breaks" kindleEink = "Kindle e-Ink (text optimized)" outputFormat = "Output format" outputFormatDesc = "Choose the output format for the ebook" tabletPhone = "Tablet/Phone (with images)" targetDevice = "Target device" targetDeviceDesc = "Choose an output profile optimized for the reader device" [convert.formatGroups] archive = "Archive" document = "Document" ebook = "eBook" email = "Email" file = "File" image = "Image" multipleFiles = "Multiple Files" presentation = "Presentation" spreadsheet = "Spreadsheet" text = "Text" web = "Web" [convert.formatOptions] any = "Any" images = "Images" msgOutlook = "MSG (Outlook)" [cookieBanner.popUp] acceptAllBtn = "Okay" acceptNecessaryBtn = "No Thanks" showPreferencesBtn = "Manage preferences" title = "How we use Cookies" [cookieBanner.popUp.description] 1 = "We use cookies and other technologies to make ZhmmCloud PDF work better for you-helping us improve our tools and keep building features you'll love." 2 = "If you'd rather not, clicking 'No Thanks' will only enable the essential cookies needed to keep things running smoothly." [cookieBanner.preferencesModal] acceptAllBtn = "Accept all" acceptNecessaryBtn = "Reject all" closeIconLabel = "Close modal" savePreferencesBtn = "Save preferences" serviceCounterLabel = "Service|Services" subtitle = "Cookie Usage" title = "Consent Preferences Center" [cookieBanner.preferencesModal.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-ZhmmCloud PDF cannot and will never track the content of the documents you work with." title = "Analytics" [cookieBanner.preferencesModal.description] 1 = "ZhmmCloud PDF uses cookies and similar technologies to enhance your experience and understand how our tools are used. This helps us improve performance, develop the features you care about, and provide ongoing support to our users." 2 = "ZhmmCloud PDF cannot-and will never-track or access the content of the documents you use." 3 = "Your privacy and trust are at the core of what we do." [cookieBanner.preferencesModal.necessary] description = "These cookies are essential for the website to function properly. They enable core features like setting your privacy preferences, logging in, and filling out forms-which is why they can't be turned off." [cookieBanner.preferencesModal.necessary.title] 1 = "Strictly Necessary Cookies" 2 = "Always Enabled" [cookieBanner.services] posthog = "PostHog Analytics" scarf = "Scarf Pixel" [createPortfolio] coverTitle = "Cover page title" coverTitlePlaceholder = "PDF Portfolio" description = "Every selected file is kept whole inside the new PDF, whatever its type. Readers that don't support portfolios show a cover page with the files attached." goToFileEditor = "Go to file editor" info = "Combines your files into one PDF that keeps each file whole inside it. Open the result to browse the files and view or save any of them on their own." settings = "Portfolio Settings" submit = "Create Portfolio" title = "Portfolio Results" viewerModeHint = "A portfolio needs 2 or more files. Head to the file editor to select them." [createPortfolio.error] failed = "An error occurred while creating the PDF portfolio." [createPortfolio.tooltip.description] title = "What it does" [createPortfolio.tooltip.header] title = "About PDF Portfolios" [crop] autoCrop = "Auto-crop whitespace" noFileSelected = "Add a PDF file to begin cropping" reset = "Reset to full PDF" submit = "Apply Crop" title = "Crop" [crop.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." [crop.coordinates] title = "Position and Size" [crop.coordinates.height] desc = "Crop height (points)" label = "Height" [crop.coordinates.width] desc = "Crop width (points)" label = "Width" [crop.coordinates.x] desc = "Left edge (points)" label = "X Position" [crop.coordinates.y] desc = "Bottom edge (points)" label = "Y Position" [crop.error] failed = "Failed to crop PDF" [crop.pageNumbers] description = "Crop the selected area on specific pages, or 'all' for every page." error = "Invalid page selection. Use e.g. 1, 3, 5-8 or all." label = "Pages to Crop" placeholder = "e.g. 1, 3, 5-8 or all" [crop.preview] title = "Crop Area Selection" [crop.results] title = "Crop Results" [crop.steps] selectArea = "Select Crop Area" [crop.tooltip] 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" precision = "Use coordinate inputs for precise positioning" resize = "Drag the corner and edge handles to resize" title = "How to Crop PDFs" [damagedPdf] description = "This PDF is damaged and can't be opened." label = "Damaged" repair = "Repair" repaired = "Repaired {{name}}" repairFailed = "Couldn't repair {{name}}" [database] backupCreated = "Database backup successful" fileName = "File Name" title = "Database Import/Export" [defaultApp] title = "Set as Default PDF App" [defaultApp.error] message = "Failed to set default PDF handler" title = "Error" [defaultApp.settingsOpened] message = "In Windows Settings, search for 'PDF' and select ZhmmCloud PDF as your default app" title = "Settings Opened" [defaultApp.success] message = "ZhmmCloud PDF is now your default PDF editor" title = "Default App Set" [desktop.fileSave] saveFilesTitle_one = "Save {{count}} file" saveFilesTitle_other = "Save {{count}} files" [desktop.saasError] body = "This tool requires cloud processing but encountered an error: {{error}}. Please check your connection and try again." title = "Cloud Processing Failed" [desktop.titleBar] maximize = "Maximize" minimize = "Minimize" restore = "Restore" [desktopBilling] description = "Manage usage and billing in your browser. Sign in with the same ZhmmCloud account you use here." open = "Open Usage & Billing in browser" openFailed = "Could not open Usage & Billing. Check your connection and try again." selfHostedDescription = "Manage usage and billing on your connected server in your browser. Sign in with your server owner account." [desktopFileLink] saveAs = "Save as…" useDiskVersion = "Use disk version" [desktopFileLink.conflict] hint = "Keeping your changes overwrites the file on disk when you next save." keepMine = "Keep my changes" prompt = "This file changed on disk while you had unsaved changes here. Only one version can be kept." remaining = "{{count}} more to review" title = "File changed on disk" useDisk = "Use the disk version" [desktopFileLink.missing] body = "\"{{name}}\" has been deleted or moved on disk, so it has been removed from your files." title = "File no longer exists" [desktopFileLink.openDeleted] body_one = "\"{{name}}\" no longer exists on disk. It is still open here - saving will ask you for a new location." body_other = "{{count}} files no longer exist on disk. They are still open here - saving each one will ask you for a new location." title_one = "File deleted on disk" title_other = "Files deleted on disk" [desktopFileLink.reloaded] body = "\"{{name}}\" changed on disk and has been reloaded." title = "Updated from disk" [desktopFileLink.tooLarge] body = "\"{{name}}\" changed on disk. It is large enough that reloading it will take a while, so the version here has been left alone." title = "File changed on disk" [desktopPrivacy] blocked = "Your administrator requires documents to stay on this device. This feature is unavailable." localFiles = "Local files" [desktopUpdate] downloading = "Downloading update..." installing = "Installing update..." installingWarning = "The app will close automatically to complete the installation." installNow = "Install Now" readyToRestart = "Update Ready" restartMessage = "The update has been installed. Restart the app to finish." restartNow = "Restart Now" updateFailed = "Update Failed" updateFailedMessage = "Failed to download or install the update." [desktopUpdate.blocked] docsLink = "View installation documentation" message = "ZhmmCloud PDF does not have permission to update itself on this machine." title = "Administrator permissions required" [devAirgapped] tags = "air-gapped,offline,isolated,no internet,disconnected,secure,network isolation,standalone" [devApi] tags = "API,development,documentation,developer,REST,integration,endpoints,programmatic,automation,scripting" [devFolderScanning] tags = "automation,folder,scanning,watch folder,hot folder,automatic processing,batch,monitor folder,auto process,folder monitoring" [devSsoGuide] tags = "SSO,single sign-on,authentication,SAML,OAuth,OIDC,login,enterprise,identity provider,IdP" [dropdownList] noItems = "No items available" noResults = "No results found" searchPlaceholder = "Search..." selectedCount = "{{count}} selected" selectLanguages = "Select languages" selectOption = "Select an option" [editableSecretField] edit = "Edit" editSecretValue = "Edit secret value" [editTableOfContents] submit = "Apply table of contents" tags = "bookmarks,contents,edit,table of contents,TOC,outline,navigation,chapters,sections,add bookmarks,edit bookmarks,PDF outline" workbenchLabel = "Outline workspace" [editTableOfContents.actions] clipboardUnavailable = "Clipboard access is not available in this browser." export = "Export bookmarks" exportClipboard = "Copy JSON to clipboard" exportJson = "Download JSON" importClipboard = "Paste JSON from clipboard" importJson = "Import JSON" loadFromPdf = "Load from selected PDF" noFile = "Select a PDF to extract existing bookmarks." selectedFile = "Loaded from {{file}}" source = "Load bookmarks" [editTableOfContents.editor] addTopLevel = "Add top-level bookmark" childBadge = "Child" confirmRemove = "Remove this bookmark and all of its children?" defaultChildTitle = "Child bookmark" defaultSiblingTitle = "New bookmark" defaultTitle = "New bookmark" description = "Add, nest, and reorder bookmarks to craft your PDF outline." heading = "Bookmark editor" pagePreview = "Page {{page}}" untitled = "Untitled bookmark" [editTableOfContents.editor.actions] addChild = "Add child bookmark" addSibling = "Add sibling bookmark" remove = "Remove bookmark" toggle = "Toggle children" [editTableOfContents.editor.empty] action = "Add first bookmark" description = "Import existing bookmarks or start by adding your first entry." title = "No bookmarks yet" [editTableOfContents.editor.field] page = "Target page number" title = "Bookmark title" [editTableOfContents.error] failed = "Failed to update the table of contents" [editTableOfContents.info] line1 = "Each bookmark needs a descriptive title and the page it should open." line2 = "Use child bookmarks to build a hierarchy for chapters, sections, or subsections." line3 = "Import bookmarks from the selected PDF or from a JSON file to save time." [editTableOfContents.messages] copied = "Copied to clipboard" copiedBody = "Bookmark JSON copied successfully." copyFailed = "Copy failed" exported = "JSON download ready" imported = "Bookmarks imported" importedBody = "Your JSON outline replaced the current editor contents." importedClipboard = "Clipboard data replaced the current bookmark list." invalidJson = "Invalid JSON structure" invalidJsonBody = "Please provide a valid bookmark JSON file and try again." loadedBody = "Existing bookmarks from the PDF were loaded into the editor." loadedTitle = "Bookmarks extracted" loadFailed = "Unable to extract bookmarks from the selected PDF." noBookmarks = "No bookmarks were found in the selected PDF." [editTableOfContents.results] subtitle = "Download the processed file or undo the operation below." title = "Updated PDF with bookmarks" [editTableOfContents.settings] replaceExisting = "Replace existing bookmarks (uncheck to append)" replaceExistingHint = "When disabled, the new outline is appended after the current bookmarks." title = "Bookmarks & outline" [editTableOfContents.workbench] changeFile = "Change PDF" filePrompt = "Select a PDF from your library or upload a new one to begin." selectFile = "Select PDF" subtitle = "Import bookmarks, build hierarchies, and apply the outline without cramped side panels." [editTableOfContents.workbench.empty] description = "Select the Edit Table of Contents tool to load its workspace." title = "Open the tool to start editing" [encryptedPdfUnlock] actionIgnored = "{{action}} restriction ignored" actionUnlocked = "{{action}} unlocked for this session" advanced = "Advanced" allowed = "Allowed" annotations = "Annotations" authoriseAction = "This PDF requires permission to use {{action}}." changeOwnerPassword = "Change permissions password" checkingPermissions = "Checking PDF permissions..." chooseOwnerPassword = "Choose a different password" continue = "Continue" copyFailed = "Unable to create the copy. Your PDF is unchanged." copying = "Copying content" editing = "Editing" enterPassword = "Enter password" ignoredByServer = "Permissions are ignored by this server's settings. The PDF's protection is unchanged." incorrectPassword = "Incorrect password" inspectionFailed = "Unable to check this PDF's permissions. Try again." lowQualityPrintUnsupported = "This PDF allows low-quality printing only, which this viewer does not support." lowResolutionOnly = "Low resolution only" manageProtection = "Manage protection" missingFile = "The selected file is no longer available." mixedProtection = "These PDFs have separate protection settings. Process them individually." newOwnerPassword = "New permissions password" notRequired = "Not required" openingPassword = "Password to open" openPdf = "Open PDF" ownerPassword = "Permissions password" ownerRequired = "Enter the permissions password to continue." ownerTitle = "Enter permissions password" passwordRetained = "Kept unchanged" passwordsMustDiffer = "The two passwords must be different." permissionsUnlocked = "Permissions unlocked for this session" prepareFailed = "Unable to prepare this protected PDF for processing." printing = "Printing" printRestricted = "Printing is restricted. Verify permissions in Manage protection." protectedPdf = "Protected PDF" protectionRetained = "Protection retained" protectionSaved = "Protection saved" removePasswordHelp = "Open Remove Password to choose which passwords to remove." removeProtection = "Create an unprotected copy" replaceProtection = "These settings replace the PDF's current protection." required = "Enter the password to continue." requiredStatus = "Required" requiredToApply = "Required to apply changes" restoreFailed = "Unable to preserve PDF protection. No unprotected result was saved." restrictActions = "Restrict actions" restricted = "Restricted" restrictedActions = "restricted actions" restrictedOperation = "This action requires the permissions password." retainOwnerVerification = "Verify the permissions password to keep it unchanged while removing the opening password. This will not remove it." saveProtection = "Save protection" securityChangeFailed = "Unable to change protection. Check the permissions password and the new security settings." sessionDetails = "Open for this session. The PDF stays protected." sessionDetailsLabel = "About session unlocking" sessionFailed = "Unable to unlock this PDF. Please try again." sessionSuccessBody = "Protection retained." sessionSuccessBodyWithName = "Protection retained for {{fileName}}." sessionSuccessTitle = "PDF opened" sessionTitle = "Open PDF" signedReadOnly = "This signed PDF can be viewed, but cannot be edited here." title = "Enter PDF password" toolUnavailable = "This tool doesn't support encrypted PDFs. Remove the password first." toolUnavailableDetails = "Why {{name}} is unavailable" unlock = "Unlock" unlockAll = "Use for all ({{count}})" unlockAllPartialFail = "Wrong password for: {{names}}" unlockAllSuccess_one = "Unlocked {{count}} file." unlockAllSuccess_other = "Unlocked {{count}} files." unlockedForSession = "Unlocked for this session using your permissions password." unlockPrompt = "Open PDF to continue" unprotectedCopyConsequence = "The copy will have no passwords or restrictions. The original stays protected." unsupportedTool = "This tool cannot yet preserve this PDF's protection." verifiedForSession = "Verified for this session" verifyPermissions = "Verify permissions for this session" viewerLocked = "This PDF is password-protected" viewerUnlock = "Open PDF" [encryptedPdfUnlock.password] label = "PDF password" placeholder = "Enter the PDF password" [endpointStatistics] title = "Endpoint Statistics" [error] _value = "Error" dismissAllErrors = "Dismiss All Errors" failedFiles = "Failed files: {{ids}}" generic = "An error occurred" invalidOrCorruptedFiles = "Process failed due to invalid/corrupted file(s)" networkError = "Network error" requestError = "Request error" requestFailed = "Request failed" requestFallback = "There was an error processing your request." serverError = "Server error" unknown = "Unknown error occurred" [error.pdfOpen] code = "Could not open the PDF (error {{code}})." corrupted = "The PDF file is corrupted and could not be read." invalid = "This file is not a valid PDF or is corrupted." pageLoadFailed = "A page in this PDF could not be loaded." passwordProtected = "This PDF is password-protected." unknown = "Could not open the PDF (unknown error)." unsupportedSecurity = "This PDF uses an unsupported security scheme." [error.processing] cancelled = "Processing was cancelled by user." corruption = "This PDF file appears to be corrupted or encrypted. Please try a different file." failed = "Processing failed: {{message}}" memory = "Insufficient memory to process this file. Try closing other applications or processing a smaller file." network = "Network connection failed. Please check your internet connection and try again." parsing = "Failed to process PDF: {{message}}" timeout = "Processing timed out. This file may be too large or complex to process." [errorBoundary] title = "Something went wrong" tryAgain = "Try Again" [extractImages] allowDuplicates = "Save duplicate images" selectText = "Select image format to convert extracted images to" submit = "Extract" tags = "picture,photo,save,archive,zip,capture,grab" title = "Extract Images" [extractImages.error] failed = "An error occurred while extracting images from the PDF." [extractImages.settings] title = "Settings" [extractPage] tags = "extract" [extractPages] submit = "Extract Pages" tags = "pull,select,copy,extract,extract pages,get pages,pull out,save pages,export pages,copy pages,select pages,specific pages" title = "Extract Pages" [extractPages.error] failed = "Failed to extract pages" [extractPages.pageNumbers] label = "Pages to Extract" placeholder = "e.g., 1,3,5-8 or odd & 1-10" [extractPages.results] title = "Pages Extracted" [extractPages.settings] title = "Settings" [extractPages.tooltip] description = "Extracts the selected pages into a new PDF, preserving order." [fileCard] openInFileEditor = "Open in File Editor" viewInViewer = "View in Viewer" [fileDropdownMenu] closeFile = "Close file" [fileEditor] closedFile = "Closed {{name}}" couldNotSave = "Could not save {{name}}" filesReordered_one = "File reordered" filesReordered_other = "{{count}} files reordered" loadedFromStorage_one = "Loaded {{count}} file from storage" loadedFromStorage_other = "Loaded {{count}} files from storage" loadFromStorageFailed = "Failed to load some files from storage" pinnedFile = "Pinned {{name}}" savedAndClosed = "Saved and closed {{name}}" saveFailed = "Save failed" unpinnedFile = "Unpinned {{name}}" unzipping = "Unzipping {{name}}" [fileEditor.addCard] dropHint = "or drop files anywhere" fromComputer = "Upload from computer" moreOptions = "More upload options" [fileEditor.unzip] error = "Error unzipping {{name}}" extracted_one = "Extracted {{count}} file from {{name}}" extracted_other = "Extracted {{count}} files from {{name}}" failed = "Failed to extract files from {{name}}" [fileManager] addToUpload = "Add to Upload" clearAll = "Clear All" clearSelection = "Clear" delete = "Delete" deleteAll = "Delete All" download = "Download" downloadSelected = "Download Files" filesSelected = "files" filesStored = "files stored" loadingFiles = "Loading files..." noFiles = "No files available" noFilesFound = "No files found matching your search" openInFileEditor = "Open in File Editor" openInPageEditor = "Open in Page Editor" reloadFiles = "Reload Files" saveSelected = "Save Files" searchFiles = "Search files..." share = "Share" shared = "Shared" sharedEditNoticeBody = "You do not have edit rights to the server version of this file. Any edits you make will be saved as a local copy." sharedEditNoticeConfirm = "Got it" sharedEditNoticeTitle = "Read-only server copy" sharedWithYou = "Shared with you" showAll = "Show All" showAllCount_one = "Show All ({{count}} file)" showAllCount_other = "Show All ({{count}} files)" sortBy = "Sort files" sortByDate = "Sort by Date" sortByName = "Sort by Name" sortBySize = "Sort by Size" storage = "Storage" storageUsed = "Storage used" title = "Upload PDF Files" unsupported = "Unsupported" unzip = "Unzip" updateOnServer = "Update on Server" uploadToServer = "Upload to Server" versionHistory = "Version history" [filePicker] add_one = "Add {{count}} file" add_other = "Add {{count}} files" addHere = "Add here" adding = "Adding files…" chooseDestination = "Choose a folder, or add here." dropHint = "Choose the files you want to work with." dropTitle = "Drop files here, or click to browse" emptyZip = "No files could be extracted from this ZIP." error = "Could not add these files. Please try again." errorTitle = "Couldn't add files" filesUnavailable = "Could not add: {{names}}" fileUnavailable = "{{name}} is no longer available." folderPath = "Folder path" fromComputer = "From your computer" fromPhone = "From your phone" limit = "Choose up to {{count}} files." selectedLimit = "{{count}} of {{limit}} selected" selectVersion = "Select version {{version}}" sources = "File sources" subtitle = "Choose from your library or add something new." title = "Add files" unsupported = "This file type isn't supported by the selected tool." [filePreview] loadingThumbnail = "Loading thumbnail..." locked = "Locked" previewOf = "Preview of {{name}}" [files] addFiles = "Add files" created = "Created" notIncludedInToolRun = "Not included in this tool run" selectFromWorkbench = "Add files to the workbench or " selectMultipleFromWorkbench = "Add at least {{count}} files to the workbench or " size = "File Size" title = "Files" upload = "Upload" uploadFiles = "Upload Files" [fileSelectorPicker] empty = "No files available" placeholder = "Select file" search = "Filter files…" tabListLabel = "Saved files, workbench, upload" upload = "Upload from computer" [fileSelectorPicker.sort] dateAsc = "Oldest first" dateDesc = "Newest first" dateLabel = "Latest" nameAsc = "A to Z" nameDesc = "Z to A" nameLabel = "A–Z" [fileSelectorPicker.tabs] saved = "Saved files" upload = "Upload" workbench = "Workbench" [fileSidebar] addFiles = "Add files" addingFiles = "Adding files…" collapse = "Collapse sidebar" customizeGroups = "Customize groups" dataLostBody = "This browser lost this file's contents. Upload it again to keep working with it." dataLostTitle = "File data is unavailable" downloadFailed = "Download failed" dropHint = "Open files to get started" duplicateFailed = "Could not duplicate file" expand = "Expand sidebar" googleDrive = "Google Drive" library = "PDF Library" myFiles = "File library" noFiles = "No files yet" openFileManager = "Browse all files & folders" openFromComputer = "Open from computer" openSettings = "Open settings" other = "Other" recent = "Recent" searchFiles = "Search files" uploadFailedBody = "Could not add the selected files." uploadFailedTitle = "Upload failed" viewAll = "View all {{count}} files" [fileSidebar.fileItem] closeViewer = "Close viewer" dataLost = "Data lost" dataLostTooltip = "This browser lost this file's contents. Upload it again to keep working with it." delete = "Delete" duplicate = "Duplicate" moreActions = "More actions" openInViewer = "Open in viewer" rename = "Rename" savedToServer = "Saved to server" updateOnServer = "Update on server" uploadToServer = "Upload to server" versionHistory = "Version history" [fileSidebar.groupsModal] done = "Done" reset = "Show all" subtitle = "Show or hide categories in the files sidebar." title = "Sidebar categories" [fileSidebar.rename] cancel = "Cancel" error = "Could not rename the file." illegalCharacters = "A file name can't contain \\ / : * ? \" < > |" label = "File name" save = "Rename" title = "Rename file" [filesPage] addedToLibrary = "Added to ZhmmCloud library" addingToLibrary = "Adding to ZhmmCloud library…" addToLibrary = "Add to ZhmmCloud library…" addToLibraryFailed = "Some files could not be added" addToWorkspace = "Add to workspace" addToWorkspaceCount = "Add {{count}} to workspace" allFiles = "ZhmmCloud library" back = "Back" backToFolder = "Back to {{folder}}" backToMyFiles = "Back to File library" breadcrumbs = "Folder path" breadcrumbsOverflow = "Show parent folders" bulkActions = "Actions" cancel = "Cancel" classification = "Classification" clearSelection = "Clear selection" closeDetails = "Close details" create = "Create" cycleBlocked = "Can't move a folder into one of its own subfolders." delete = "Delete" deleteFilesChoiceBody = "Some of these files are saved both on this device and in the cloud. Where should they be deleted from?" deleteFilesCloudBody_one = "Delete 1 file from the cloud? This cannot be undone." deleteFilesCloudBody_other = "Delete {{count}} files from the cloud? This cannot be undone." deleteFilesError = "Could not delete. Try again." deleteFilesLocalBody_one = "Delete 1 file from this device? This cannot be undone." deleteFilesLocalBody_other = "Delete {{count}} files from this device? This cannot be undone." deleteFilesTitle_one = "Delete 1 file?" deleteFilesTitle_other = "Delete {{count}} files?" deleteFolder = "Delete folder" deleteFolderBody = "Delete folder \"{{name}}\"?" deleteFolderContents_one = "Also delete {{count}} file inside the folder" deleteFolderContents_other = "Also delete {{count}} files inside the folder" deleteFolderContentsWarning = "Files will be permanently removed and cannot be recovered." deleteFolderError = "Could not delete the folder. Try again." deleteFolderKeepHint = "Files inside will be moved to ZhmmCloud library." deleteFolderTitle = "Delete folder?" deselectAll = "Clear selection" details = "Details" detailsCount_one = "{{count}} file selected" detailsCount_other = "{{count}} files selected" dismissError = "Dismiss" download = "Download" downloadAll = "Download all" downloadVersion = "Download this version" dropOverlay = "Drop files to upload" dropOverlaySub = "Files appear in Recents. Organize them into folders any time." dropOverlaySubFolder = "They'll be added to this folder." duplicate = "Duplicate" file = "File" fileInfo = "File info" fileMenu = "File actions" folder = "Folder" folderItems_one = "{{count}} item" folderItems_other = "{{count}} items" folderMenu = "Folder actions" folderSettings = "Folder settings" inPath = "in {{path}}" inWorkspace = "Open" inWorkspaceAria = "Already in workspace" localFolderManagedByDisk = "This folder is managed by its directory on disk." moveAcrossKindsBlocked = "These folders live in different places, so one can't go inside the other." moveIntoMountCloudSkipped_one = "{{count}} server file stayed in your files. It lives on the server, not on this disk." moveIntoMountCloudSkipped_other = "{{count}} server files stayed in your files. They live on the server, not on this disk." moveIntoMountFailed_one = "{{count}} file could not be written into the folder." moveIntoMountFailed_other = "{{count}} files could not be written into the folder." moveIntoVirtualCloudSkipped_one = "{{count}} server file was left in place. Server files can't live in browser-only folders." moveIntoVirtualCloudSkipped_other = "{{count}} server files were left in place. Server files can't live in browser-only folders." moveSkippedRemote_one = "{{count}} file couldn't be moved on the server (no permission or already deleted)." moveSkippedRemote_other = "{{count}} files couldn't be moved on the server (no permission or already deleted)." moveTo = "Move to…" newFolder = "New folder" newFolderStorageDisabled = "Server folder storage isn't enabled." newFolderTabUnavailable = "Switch to ZhmmCloud library to create folders." offlineNoFolderEdits = "Server folder sync unavailable - folder changes are disabled. Check sign-in and storage configuration." open = "Open" openVersionInWorkspace = "Open in workspace" originFilter = "Filter by source" recentFiles = "Recents" refresh = "Refresh" refreshNeedsConnection = "Sign in to refresh from the server." remove = "Delete" removeLocalFolder = "Unmount from ZhmmCloud" removeVersion = "Remove this version" rename = "Rename" renamed = "Renamed" renameFolder = "Rename folder" save = "Save" saveToServer = "Save to server" saveToServerDisabledHint = "Saving to the server isn't enabled on this server. Ask your admin to enable it." selectAll = "Select all" selectedCount = "{{count}} selected" selectedFile = "{{name}}, selected" selectFile = "Select file {{name}}" serverFolderNeedsConnection = "Sign in to ZhmmCloud or connect a self-hosted server to use server folders." shareDisabledHint = "File sharing isn't enabled on this server. Ask your admin to enable it." shareManage = "Manage sharing" showDetails = "Show details" signInRequired = "Sign in to use cloud storage." summary_one = "{{count}} item" summary_other = "{{count}} items" tree = "Folders" unmount = "Unmount" unmountFolderBody = "Unmount \"{{name}}\"? The folder and its files stay on your disk." unmountFolderTitle = "Unmount from ZhmmCloud?" upload = "Upload" uploadFromMobile = "Upload from Mobile" versionActions = "Version actions" versionCollapse = "Collapse middle versions" versionHistory = "Version history" versionHistoryEmpty = "This file has no earlier versions." versionOrigin = "Original upload" versionsCount = "{{count}} versions" versionShowHidden = "Show {{count}} earlier versions" viewVersionHistory = "Version journey ({{count}})" [filesPage.appearance] colour = "Color" done = "Done" edit = "Appearance..." icon = "Icon" title = "Appearance" useColour = "Use color {{c}}" [filesPage.column] added = "Added" modified = "Modified" name = "Name" size = "Size" status = "Status" type = "Type" [filesPage.deleteScope] cloud = "Cloud only" cloudHint = "Deletes from the server. A copy stays on this device." device = "This device only" deviceHint = "Removes the local copy. The cloud copy is kept." everywhere = "Everywhere" everywhereHint = "Deletes the file from this device and the cloud." [filesPage.diskLink] conflict = "Disk changed" conflictHint = "The file on disk changed while you had unsaved edits. Your version is shown - saving will overwrite the one on disk." orphaned = "Not on disk" orphanedHint = "The original at {{path}} is gone. This copy is only here - saving it will ask for a new location." unavailable = "Unavailable" unavailableHintOffline = "The drive or share this file lives on is not connected. Reconnect it to pick up changes again." unavailableHintPermission = "ZhmmCloud is not allowed to read this location. Grant access in System Settings to pick up changes again." unavailableHintUnknown = "This file cannot be reached right now. The copy here is unchanged." [filesPage.diskState] all = "All" done = "Ready" doneHint = "Processed - opens the result" failed = "Failed" processing = "Processing" processingHint = "This file will be available when processing is complete" retry = "Retry" retryHint = "Run this file again" waiting = "Queued" waitingHint = "This file is queued and will be available when processing is complete" [filesPage.empty] hint = "Drop PDFs anywhere on this page to upload, or use the New folder button to organize your files." title = "This folder is empty" uploadCta = "Upload files" [filesPage.empty.cloud] hint = "Upload a file to start, or create a folder to organize." offlineHint = "Reconnect to load your cloud library." offlineTitle = "No cached cloud files" title = "No cloud files yet" [filesPage.empty.noResults] hint = "No files in this folder match your filter. Try a different term or clear the filter." title = "No matching files" [filesPage.empty.recent] hint = "Files you open or edit will appear here." title = "Nothing modified yet" [filesPage.empty.shared] hint = "When someone shares a file via link, it appears here." title = "Nothing shared with you" [filesPage.empty.sharedByMe] hint = "Create a share link or invite a teammate from any of your files to see it here." title = "You haven't shared any files yet" [filesPage.error] actionFailed = "Could not {{action}}." actionFailedDetail = "Could not {{action}}: {{message}}" addFolderFailed = "Could not add the folder." addFolderFailedDetail = "Could not add the folder: {{message}}" cloudDeleteFailed_one = "Couldn't delete 1 file from the cloud." cloudDeleteFailed_other = "Couldn't delete {{count}} files from the cloud." createOutsideMount = "Cannot create a folder outside a mounted directory" deleteFolderFailed = "Could not delete folder." deleteFolderFailedDetail = "Could not delete folder: {{message}}" diskFoldersUnsupported = "This build cannot create folders on disk" downloadFailed = "Could not download the file." duplicateFailed = "Could not duplicate the file." folderAppearanceFailed = "Could not update folder appearance." folderAppearanceFailedDetail = "Could not update folder appearance: {{message}}" folderDetachFailed = "Folder was deleted, but some files couldn't be detached locally. Refresh to fix." folderOperationFailed = "Folder operation failed" folderSyncFailed = "Folder sync failed: {{message}}" loadFilesFailed = "Failed to load files" moveAcrossKinds = "Folders can only move within their own kind" moveFilesFailed = "Could not move files." moveFilesFailedDetail = "Could not move files: {{message}}" moveFolderFailed = "Could not move folder." moveFolderFailedDetail = "Could not move folder: {{message}}" moveLocalFolder = "A local folder sits where its directory sits" openDiskFileFailed = "Could not open {{name}}." openDiskFileFailedDetail = "Could not open {{name}}: {{message}}" processingStatusUnavailable = "Could not refresh processing status. File locks have been released until the connection recovers." readFolderFailed = "Could not read the folder." readFolderFailedDetail = "Could not read the folder: {{message}}" recolourLocalFolder = "Local folders cannot be recoloured yet" removeDiskSubfolder = "Subfolders of a mounted directory are removed on disk" removeFilesFailed = "Could not remove files." removeFilesFailedDetail = "Could not remove files: {{message}}" removeFolderFailed = "Could not remove folder." removeFolderFailedDetail = "Could not remove folder: {{message}}" retryFailed = "Could not retry {{name}}." retryFailedDetail = "Could not retry {{name}}: {{message}}" revertAllFailed = "Could not restore originals." revertAllFailedDetail = "Could not restore originals: {{message}}" revertFailed = "Could not restore {{name}}." revertFailedDetail = "Could not restore {{name}}: {{message}}" uploadFilesFailed = "Could not upload files." uploadFilesFailedDetail = "Could not upload files: {{message}}" [filesPage.field] added = "Added" count = "Files" folder = "Folder" labels = "Labels" modified = "Modified" size = "Size" totalSize = "Total size" type = "Type" versionHistory = "Version journey" [filesPage.filters] activeCount = "{{count}} filters active" clearAll = "Clear filters" label = "Filters" [filesPage.folderKind] local = "Local folder" virtual = "Browser folder" [filesPage.folderName] cancel = "Cancel" error = "Could not save folder. Try again." label = "Folder name" placeholder = "Folder name" [filesPage.folderOrigin] diskHint = "A folder mounted from a directory on your disk" serverHint = "A folder stored on the ZhmmCloud server" virtualHint = "A folder that lives only in this browser" [filesPage.moveDialog] cancel = "Cancel" confirm = "Move here" error = "Could not move. Try again." hint = "Pick a destination folder. Tip: you can also drag and drop files onto folders in the tree on the left." newFolderCancel = "Discard" newFolderCreate = "Create" newFolderError = "Could not create folder. Try again." newFolderLabel = "New folder name" newFolderPlaceholder = "Folder name" newFolderToggle = "Create new folder…" title = "Move to folder" [filesPage.newFolderMenu] addExisting = "Add local folder" server = "New folder on the server" serverHint = "Synced to your account, available wherever you sign in." [filesPage.origin] all = "All sources" cloud = "Cloud" cloudHint = "Stored on the ZhmmCloud server" diskFileHint = "Stored on your computer" diskHint = "A file in the mounted folder on your disk" local = "Local" localHint = "Not backed up" shared = "Shared" sharedHint = "Shared with you via link" [filesPage.processing] active = "Processing folder" blockedNeedsConnection = "Sign in to ZhmmCloud or connect a self-hosted server to process folders." edit = "Edit processing..." nothingToRestore = "No originals to restore - these files are already their originals." paused = "Processing paused" remove = "Remove processing" restore = "Restore original" restoreAll = "Restore all originals" resume = "Resume processing" revertCancel = "Cancel" revertConfirm = "Restore and pause" revertConfirmAll = "Restore every original in this folder? Processing will be paused, and restored files show as queued until you resume." revertConfirmFile = "Restore \"{{name}}\" to its original? Processing for this folder will be paused, and the file shows as queued until you resume." revertConfirmTitle = "Restore originals?" section = "Processing" start = "Process files in this folder..." stop = "Pause processing" sweep = "Retry failed files" [filesPage.processingSetup] back = "Back" cancel = "Cancel" [filesPage.search] clear = "Clear search" label = "Search filenames" placeholder = "Search filenames…" [filesPage.sort] label = "Sort files" modifiedAsc = "Oldest first" modifiedDesc = "Recent first" nameAsc = "Name A→Z" nameDesc = "Name Z→A" sizeAsc = "Smallest first" sizeDesc = "Largest first" [filesPage.syncError] client = "Folder sync failed." network = "Could not reach the server." server = "Server error during folder sync." [filesPage.treeMenu] actions = "Folder actions for {{name}}" delete = "Delete folder" newSubfolder = "New subfolder" rename = "Rename" [filesPage.typeFilter] allTypes = "All types" label = "Filter by type" [filesPage.viewMode] grid = "Grid view" label = "View mode" list = "List view" [fileStorage.unreadable] body = "\"{{name}}\" is saved in this browser but its contents can no longer be read. Upload the file again to keep working on it." title = "File data is unavailable" [fileSync.openFailed] multiple_one = "Couldn't open {{count}} file including \"{{name}}\"." multiple_other = "Couldn't open {{count}} files including \"{{name}}\"." single = "Couldn't open \"{{name}}\"." singleWithStatus = "Couldn't open \"{{name}}\" (HTTP {{status}})." title = "Some files couldn't be opened" [fileSync.pullFailed] body = "Showing only files cached in this browser. Refresh to retry once the connection is back." signInTitle = "Sign-in required to load cloud files" unreachableTitle = "Could not reach the cloud library" [fileToPDF] tags = "transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint" title = "File to PDF" [fileUpload] dropFilesHere = "Drop files here or click the upload button" dropFilesHereOpen = "Drop files here or click the open button" droppedFileUnreadable = "Could not read a dropped file." filesAvailableCount_one = "{{count}} file available" filesAvailableCount_other = "{{count}} files available" loadFromStorage = "Load from Storage" noFilesInStorage = "No files available in storage. Upload some files first." noFilesInStorageOpen = "No files available in storage. Open some files first." open = "Open" openFile = "Open File" openFiles = "Open Files" selectedCount = "{{count}} selected" selectFile = "Select {{name}}" selectFromStorage = "Select from Storage" upload = "Upload" uploadFile = "Upload File" uploadFiles = "Upload Files" [firstLogin] allFieldsRequired = "All fields are required" changePassword = "Change Password" confirmPassword = "Confirm New Password" currentPassword = "Current Password" enterCurrentPassword = "Enter your current password" enterNewPassword = "Enter new password (min 8 characters)" error = "Error" loggedInAs = "Logged in as" newPassword = "New Password" passwordChangedSuccess = "Password changed successfully! Please log in again." passwordChangeFailed = "Failed to change password. Please check your current password." passwordMustBeDifferent = "New password must be different from current password" passwordsDoNotMatch = "New passwords do not match" passwordTooShort = "Password must be at least 8 characters" reEnterNewPassword = "Re-enter new password" setPasswordTitle = "Set Your Password" title = "First Time Login" welcomeMessage = "For security reasons, you must change your password on your first login." welcomeTitle = "Welcome!" [flatten] submit = "Flatten" tags = "simplify,remove,interactive,flatten,flatten form,remove form fields,make static,finalize form,lock form,disable editing,convert to image,non-editable" title = "Flatten" [flatten.error] failed = "An error occurred while flattening the PDF." [flatten.options] stepTitle = "Flatten Options" [flatten.options.flattenOnlyForms] desc = "Only flatten form fields, leaving other interactive elements intact" label = "Flatten only forms" [flatten.renderDpi] help = "Leave blank to use the system default. Higher DPI sharpens output but increases processing time and file size." label = "Rendering DPI (optional, recommended 150 DPI)" placeholder = "e.g. 150" [flatten.results] title = "Flatten Results" [flatten.tooltip.description] 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" 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." title = "What does flattening do?" [flatten.tooltip.formsOnly] bullet1 = "Forms become non-editable" bullet2 = "Links still work when clicked" bullet3 = "Comments and notes remain visible" bullet4 = "Bookmarks still help you navigate" text = "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments." title = "What does 'Flatten only forms' mean?" [flatten.tooltip.header] title = "About Flattening PDFs" [footer] discord = "Discord" issues = "GitHub" [formFill] allSaved = "All saved" analyzingFields = "Analysing form fields..." applyFailed = "Could not apply the changes" extractCsvError = "Failed to extract CSV" extractXlsxError = "Failed to extract XLSX" filled = "filled" flattenAfterFilling = "Flatten after filling" goToPage = "Go to this page" noFields = "No fillable form fields found in this PDF." page = "Page" placeholderEnter = "Enter" placeholderSelect = "Select" requiredAbbreviation = "req" requiredFieldsError = "Please fill in all required fields" rescanFields = "Re-scan fields" rescanFormFields = "Re-scan form fields" save = "Save" saveShortcut = "Ctrl+S to save" saving = "Saving..." selectOptionPlaceholder = "— select —" skippedEdits_one = "1 change could not be applied:" skippedEdits_other = "{{count}} changes could not be applied:" skippedEditsTruncated = "{{count}} more not listed." unsavedChanges = "Unsaved changes" [formFill.create] empty = "No fields drawn yet." goToField = "Go to this field" hint = "Pick a field type, then draw it on the page." placing = "Draw a {{type}} field on the page. Press Esc to stop." preview = "Hold to preview" previewHelp = "Hold to see the fields as they will look once added, without the editing outlines." removeField = "Remove field" [formFill.editor] action = "Button action" actionHelp = "What the button does when clicked." actionNone = "None" actionPrint = "Print" actionReset = "Reset form" actionSubmit = "Submit to URL" actionUri = "Open URL" actionUrl = "URL" actionUrlHelp = "The address the button opens or submits to." addOption = "Add option" caption = "Button caption" captionHelp = "The text printed on the button face." defaultValue = "Default value" defaultValueHelp = "What the field contains before anyone fills it in. Leave blank for an empty field." fontSize = "Font size" fontSizeHelp = "Text size inside the field. Leave blank to let the reader size it to fit." label = "Label" labelHelp = "The wording shown to whoever fills the form. Leave it blank to fall back to the field name." maxLength = "Max length (comb)" maxLengthHelp = "Caps how many characters fit, drawn as evenly spaced boxes." multiline = "Multi-line" multilineHelp = "Allows more than one line of text and wraps at the field's edge." multiSelect = "Allow multiple selection" multiSelectHelp = "Lets more than one option be chosen at once." name = "Field name" nameHelp = "The field's internal name. Used when exporting data or filling the form from another system, so keep it unique and free of spaces." optionGap = "Option spacing" optionGapHelp = "Gap between buttons, in points. Leave blank to spread them evenly down the box." optionPlaceholder = "Option {{n}}" options = "Options" optionsEmpty = "Add at least one option." optionsHelp = "The choices offered in the list. Each one is stored as typed, so keep them short and distinct." optionSize = "Option size" optionSizeHelp = "Width and height of each button, in points. Leave blank to fit them to the box you drew." readOnly = "Read-only" readOnlyHelp = "Shows a value but stops anyone editing it." removeOption = "Remove option" required = "Required" requiredHelp = "The form cannot be submitted until this field is filled in." signatureNote = "Placeholder only - you don't sign here. It marks where a signature belongs so a PDF signer (Adobe Acrobat, a signing service, etc.) places the signature in this spot when the document is signed." tooltip = "Tooltip" tooltipHelp = "The hint shown when someone hovers the field in a PDF reader." type = "Type" typeHelp = "What kind of field this is. Changing it rebuilds the field, so its current value is not carried over." [formFill.fieldTypes] button = "Button" checkbox = "Checkbox" combobox = "Dropdown" listbox = "List box" radio = "Radio" radioGroup = "Radio group" signature = "Signature" text = "Text" [formFill.mode] create = "Create" fill = "Fill" label = "Form editor mode" modify = "Modify" [formFill.modify] commit = "Save {{count}} change(s)" delete = "Delete" empty = "This PDF has no form fields yet." groupSizeHint = "Use Option size" hint = "Select a field to edit its properties, drag it on the page, or delete it." restore = "Restore" [formFill.sidebar] close = "Close sidebar" empty = "No form fields found in this PDF" loading = "Loading form fields..." pageNumber = "Page {{page}}" title = "Form Fields" [getPdfInfo] downloadJson = "Download JSON" downloads = "Downloads" indexTitle = "Index" noData = "No Data" noneDetected = "None detected" noResults = "Run the tool to generate a report." processing = "Extracting information..." results = "Results" submit = "Get Info" tags = "infomation,data,stats,statistics" title = "Get Info on PDF" [getPdfInfo.compliance] failed = "Failed" failedCount = "failed" noVerification = "No Verification Performed" noVerificationDesc = "PDF standards compliance was not verified for this document." passed = "Passed" passedCount = "passed" secCompliant = "Document meets SEC EDGAR filing requirements" secNotCompliant = "Document does not meet SEC EDGAR filing requirements" [getPdfInfo.error] partial = "Some files could not be processed." unexpected = "Unexpected error during extraction." [getPdfInfo.other] attachments = "Attachments" created = "Created: {{date}}" embeddedFiles = "Embedded Files" fileSizeBytes = "({{size}} bytes)" javaScript = "JavaScript" layers = "Layers" modified = "Modified: {{date}}" structureTree = "StructureTree" unnamedAttachment = "Unnamed attachment" unnamedFile = "Unnamed file" xmp = "XMPMetadata" [getPdfInfo.perPage] annotations = "Annotations" fonts = "Fonts" images = "Images" links = "Links" multimedia = "Multimedia" size = "Size" unnamedImage = "Image" xobjects = "XObject Counts" [getPdfInfo.report] shortTitle = "PDF Information" [getPdfInfo.sections] basicInfo = "Basic Info" compliance = "Compliance" documentInfo = "Document Info" encryption = "Encryption" formFields = "Form Fields" metadata = "Metadata" other = "Other" permissions = "Permissions" perPageInfo = "Per Page Info" tableOfContents = "Table of Contents" [getPdfInfo.status] complete = "Extraction complete" [getPdfInfo.summary] author = "Author" basic = "Basic Information" complianceChecked = "Standards verified ({{failed}} failed)" compliancePassed = "{{standards}} compliant" created = "Created" documentInfo = "Document Information" fileSize = "File Size" language = "Language" modified = "Modified" noCompliance = "No Compliance Standards" overviewTitle = "PDF Overview" pages = "Pages" pdfVersion = "PDF Version" permsAll = "All Permissions Allowed" permsMixed = "Some permissions restricted" permsRestricted_one = "{{count}} restriction" permsRestricted_other = "{{count}} restrictions" securityTitle = "Security Status" technical = "Technical" title = "PDF Summary" [getPdfInfo.summary.overview] text = "This is a {{pages}}-page PDF titled {{title}} created by {{author}} (PDF version {{version}})." unknown = "Unknown Author" untitled = "an untitled document" [getPdfInfo.summary.security] encrypted = "Encrypted PDF - Password protection present" unencrypted = "Unencrypted PDF - No password protection" [getPdfInfo.summary.tech] bookmarks = "Bookmarks" embeddedFiles = "Embedded Files" fonts = "Fonts" formFields = "Form Fields" images = "Images" javaScript = "JavaScript" layers = "Layers" multimedia = "Multimedia" [groupSigning.steps] back = "Back" [groupSigning.steps.configureDefaults] continue = "Continue" invisible = "Signatures will be invisible (metadata only)" locationLabel = "Location:" preview = "Preview" reasonLabel = "Reason:" visible = "Signatures will be visible on page {{page}}" [groupSigning.steps.review] document = "Document" dueDate = "Due Date (Optional)" dueDatePlaceholder = "Select due date..." invisible = "Invisible (metadata only)" location = "Location:" logo = "Logo:" logoHidden = "No logo" logoShown = "ZhmmCloud PDF logo shown" participantCount_one = "{{count}} participant selected" participantCount_other = "{{count}} participants selected" participants = "Participants" reason = "Reason:" send = "Send Signing Requests" signatureSettings = "Signature Settings" title = "Review Session Details" visibility = "Visibility:" visible = "Visible on page {{page}}" [groupSigning.steps.selectDocument] continue = "Continue" noFile = "Please select a single PDF file from your active files to create a signing session." selectedFile = "Selected document" [groupSigning.steps.selectParticipants] continue = "Continue" count_one = "{{count}} participant selected" count_other = "{{count}} participants selected" label = "Select participants" placeholder = "Choose participants to sign..." [groupSigning.tooltip] header = "About Group Signing" [groupSigning.tooltip.finalization] bullet1 = "The final PDF includes all accepted signatures" bullet2 = "Review outstanding participants before finalizing with partial signatures" bullet3 = "Finalization closes the request; outstanding participants can no longer sign" description = "After at least one participant has signed, the owner can finalize the request and generate the signed PDF." title = "Finalization Process" [groupSigning.tooltip.roles] bullet1 = "Owner (you): Creates session, configures signature defaults, finalizes document" bullet2 = "Participants: Choose a certificate and optionally place a visible signature on the PDF" bullet3 = "Participants can adjust their signature reason and location before submitting" description = "The owner sets request defaults; each participant chooses their certificate and optional visible mark." title = "Participant Roles" [groupSigning.tooltip.sequential] bullet1 = "Participants do not need to wait for another signer" bullet2 = "Track each participant's progress in Signing Sessions" bullet3 = "A due date is a reminder; it does not expire access" description = "Assigned participants can review and sign independently, in any order." title = "Signing in Any Order" [guestBanner] dismiss = "Dismiss banner" message = "Create a free account to save your work, access more features, and support the project." signUp = "Sign Up Free" title = "You're using ZhmmCloud PDF as a guest!" [home.addAttachments] desc = "View, add, extract, rename, or delete embedded PDF attachments" tags = "embed,attach,include,attachments,attach files,embed files,include files,add files,file attachment,associated files,supplementary files,extract,manage" title = "Manage Attachments" [home.addImage] desc = "Adds a image onto a set location on the PDF" tags = "insert,embed,place,add image,insert image,place image,embed image,add photo,add picture,add logo,graphics,insert picture,place photo,PNG,JPG,JPEG" title = "Add image" [home.addPageNumbers] desc = "Add Page numbers throughout a document in a set location" tags = "number,pagination,count,add page numbers,page numbering,page numbers,footer,header,number pages,sequential,pagination tool" title = "Add Page Numbers" [home.addPassword] desc = "Add password protection and restrictions to PDF files" tags = "encrypt,password,lock,secure,protect,security,encryption,safeguard,confidential,private,restrict access" title = "Add Password" [home.addStamp] desc = "Add text or add image stamps at set locations" tags = "stamp,mark,seal,approved,rejected,confidential,stamp tool,rubber stamp,date stamp,approval stamp,received,void,copy,original" title = "Add Stamp to PDF" [home.addText] desc = "Add custom text anywhere in your PDF" tags = "text,annotation,label,add text,insert text,place text,text box,add label,add caption,type on PDF,write on PDF,add words,add note,text overlay,typewriter" title = "Add Text" [home.adjustContrast] desc = "Adjust Colors/Contrast, Saturation and Brightness of a PDF" tags = "contrast,brightness,saturation,adjust colors,color correction,enhance,lighten,darken,improve quality,color balance,hue,vibrance" title = "Adjust Colors/Contrast" [home.annotate] desc = "Highlight, draw, add notes and shapes in the viewer" tags = "annotate,highlight,draw,markup,comment,notes,review,redline,feedback,markup tools,sticky notes,shapes,arrows,text box,freehand" title = "Annotate" [home.autoFormDetection] desc = "Automatically detect form fields with AI and make your PDF fillable." tags = "form,detect,fillable,acroform,auto detect,ai,fields,make fillable,form detection" title = "Auto Form Detection" unavailable = "Needs the AI detection model, which isn't installed on this server. An administrator can add it under Settings > Features > AI Form Detection." [home.automate] desc = "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." tags = "workflow,sequence,automation,automate,batch,batch processing,pipeline,chain,multi-step,recurring,scheduled,automatic,process multiple,bulk operations" title = "Automate" [home.autoRename] desc = "Auto renames a PDF file based on its detected header" tags = "auto-detect,header-based,organize,relabel,auto rename,automatic rename,smart rename,rename by content,filename,file naming,detect title" title = "Auto Rename PDF File" [home.autoRotate] desc = "Detect each page's orientation and rotate it upright automatically." tags = "auto rotate,fix orientation,upside down,sideways,straighten,orient,detect orientation,correct rotation,auto orient,scanned,OSD" title = "Auto Rotate" [home.autoSizeSplitPDF] tags = "auto,split,size" title = "Auto Split by Size/Count" [home.autoSplitPDF] tags = "auto,split,QR,auto split,QR code,QR split,barcode,automatic split,divider page,separator page,scan divider,batch scanning" title = "Auto Split Pages" [home.bookletImposition] desc = "Create booklets with proper page ordering and multi-page layout for printing and binding" tags = "booklet,print,binding,imposition,booklet printing,saddle stitch,fold,pamphlet,brochure,print booklet,duplex,two-sided,signature,book layout,page imposition,print layout" title = "Booklet Imposition" [home.certSign] desc = "Signs a PDF with a Certificate/Key (PEM/P12)" tags = "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto,digital certificate,certificate signature,PKI,cryptographic signature,trusted signature" title = "Sign with Certificate" [home.changeMetadata] desc = "Change/Remove/Add metadata from a PDF document" tags = "edit,modify,update,metadata,properties,document properties,author,title,subject,keywords,creator,producer,info,document info,file properties" title = "Change Metadata" [home.changePermissions] desc = "Change document restrictions and permissions" tags = "permissions,restrictions,rights,access control,allow,deny,printing,copying,editing,modify permissions,security settings,user rights" title = "Change Permissions" [home.classify] desc = "Identify what kind of document this is and tag it." title = "Classify" [home.compare] desc = "Compares and shows the differences between 2 PDF Documents" tags = "difference,compare,diff,compare PDFs,compare documents,find differences,show differences,changes,what changed,track changes,revisions,version compare,side by side,contrast,delta" title = "Compare" [home.compress] desc = "Compress PDFs to reduce their file size." tags = "shrink,reduce,optimize,compress,smaller,downsize,file size,reduce size,minimize,make smaller,decrease size,optimize size" title = "Compress" [home.convert] desc = "Convert files between different formats" tags = "transform,change,convert,PDF to Word,PDF to Excel,PDF to image,Word to PDF,Excel to PDF,PowerPoint to PDF,HTML to PDF,export,import,file conversion,format change,save as" title = "Convert" [home.createPortfolio] desc = "Bundle multiple files into an Adobe PDF Portfolio" tags = "portfolio,collection,package,bundle,combine files,pdf portfolio,adobe portfolio,pdf collection,container" title = "Create Portfolio" [home.crop] desc = "Crop a PDF to reduce its size (maintains text!)" tags = "trim,cut,resize,crop,crop PDF,trim PDF,trim margins,remove margins,cut edges,trim borders,remove white space,crop pages,trim pages,reduce margins,set margins" title = "Crop PDF" [home.devAirgapped] desc = "Link to air-gapped setup guide" tags = "air-gapped,offline,isolated,no internet,disconnected,secure,network isolation,standalone" title = "Air-gapped Setup" [home.devApi] desc = "Link to API documentation" tags = "API,development,documentation,developer,REST,integration,endpoints,programmatic,automation,scripting" title = "API" [home.devFolderScanning] desc = "Link to automated folder scanning guide" tags = "automation,folder,scanning,watch folder,hot folder,automatic processing,batch,monitor folder,auto process,folder monitoring" title = "Automated Folder Scanning" [home.devSsoGuide] desc = "Link to SSO guide" tags = "SSO,single sign-on,authentication,SAML,OAuth,OIDC,login,enterprise,identity provider,IdP" title = "SSO Guide" [home.editTableOfContents] desc = "Add or edit bookmarks and table of contents in PDF documents" tags = "bookmarks,contents,edit,table of contents,TOC,outline,navigation,chapters,sections,add bookmarks,edit bookmarks,PDF outline" title = "Edit Table of Contents" [home.extractImages] desc = "Extracts all images from a PDF and saves them to zip" tags = "pull,save,export,extract images,get images,save images,export images,extract photos,extract pictures,pull images,download images,rip images,extract graphics,save photos" title = "Extract Images" [home.extractPages] desc = "Extract specific pages from a PDF document" tags = "pull,select,copy,extract,extract pages,get pages,pull out,save pages,export pages,copy pages,select pages,specific pages" title = "Extract Pages" [home.flatten] desc = "Remove all interactive elements and forms from a PDF" tags = "simplify,remove,interactive,flatten,flatten form,remove form fields,make static,finalize form,lock form,disable editing,convert to image,non-editable" title = "Flatten" [home.formFill] desc = "Fill, create, edit, and delete PDF form fields with a visual editor" title = "Form Editor" [home.getPdfInfo] desc = "Grabs any and all information possible on PDFs" tags = "info,metadata,details,PDF info,document info,properties,file info,get info,show info,view properties,document properties,statistics,page count,file details,inspect" title = "Get ALL Info on PDF" [home.manageCertificates] tags = "certificates,import,export,manage certificates,digital certificates,certificate management,PFX,P12,keystore,import certificate,export certificate,certificate store,PKI" title = "Manage Certificates" [home.merge] desc = "Easily merge multiple PDFs into one." tags = "combine,join,unite,merge,merge PDFs,combine PDFs,join PDFs,concatenate,append,stitch,combine files,join files,merge documents" title = "Merge" [home.mobile] brandAlt = "ZhmmCloud 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" [home.multiTool] desc = "Merge, Rotate, Rearrange, Split, and Remove pages" tags = "multiple,tools,multi-tool,all-in-one,swiss army,page organizer,page editor,edit pages,manage pages,organize,reorganize" title = "PDF Multi Tool" [home.ocr] desc = "Cleanup scans and detects text from images within a PDF and re-adds it as text." tags = "extract,scan,OCR,optical character recognition,text recognition,scan to text,image to text,scanned document,searchable PDF,make searchable,extract text,recognize text,read scanned" title = "OCR / Cleanup scans" [home.overlay-pdfs] desc = "Overlay one PDF on top of another" tags = "overlay,combine,merge,layer,superimpose,overlay PDF,layer PDFs,combine PDFs,stack,overlay pages,background,foreground,composite" title = "Overlay PDFs" [home.pageLayout] desc = "Merge multiple pages of a PDF document into a single page" tags = "layout,arrange,combine,N-up,2-up,4-up,multiple per page,pages per sheet,layout pages,tile,grid layout,multi-page layout,combine on page,handout" title = "Multi-Page Layout" [home.pdfOrganiser] tags = "organize,rearrange,reorder,arrange pages,sort,move pages,delete pages,remove pages,page management,page organizer,resequence" title = "Organize" [home.pdfTextEditor] desc = "Edit existing text and images inside PDFs" tags = "edit text,modify text,change text,edit content,update text,rewrite,correct,amend,redline,revise,text editor,content editor" title = "PDF Text Editor" [home.pdfToSinglePage] desc = "Merges all PDF pages into one large single page" tags = "combine,merge,single,single page,one page,merge to single,combine all,stitch pages,concatenate vertical,long page,poster" title = "PDF to Single Large Page" [home.read] desc = "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." tags = "view,open,display,read,viewer,PDF viewer,PDF reader,open PDF,view PDF,display PDF,preview,browse" title = "Read" [home.redact] desc = "Redacts (blacks out) a PDF based on selected text, drawn shapes and/or selected page(s)" tags = "censor,blackout,hide,redact,redaction,black out,block out,remove sensitive,hide text,privacy,confidential,GDPR,PII,sensitive data,permanently remove,cover up,legal redaction" title = "Redact" [home.removeAnnotations] desc = "Removes all comments/annotations from a PDF" tags = "delete,clean,strip,remove annotations,remove comments,delete comments,remove markup,remove highlights,clean annotations,strip comments,remove notes,delete markup,clear comments" title = "Remove Annotations" [home.removeBlanks] desc = "Detects and removes blank pages from a document" tags = "delete,clean,empty,remove blank,delete blank pages,empty pages,white pages,remove empty,clean up,cleanup blank" title = "Remove Blank pages" [home.removeCertSign] desc = "Remove certificate signature from PDF" tags = "remove,delete,unlock,remove certificate,remove signature,delete signature,unsigned,remove digital signature,strip signature,remove cert,unsign" title = "Remove Certificate Sign" [home.removeImage] desc = "Remove image from PDF to reduce file size" tags = "remove,delete,clean,remove image,delete image,strip images,remove pictures,delete photos,clean images,reduce size,remove graphics" title = "Remove image" [home.removePages] desc = "Remove specific pages from a PDF document" tags = "delete,extract,exclude,remove pages,delete pages,remove page,delete page,exclude pages,take out pages,discard pages,drop pages" title = "Remove Pages" [home.removePassword] desc = "Remove the opening password, permissions password, or both." tags = "unlock,remove password,unlock PDF,decrypt,remove encryption,unprotect,open protected PDF,password removal,unlock protected,disable password,remove security,remove owner password" title = "Remove Password" [home.reorganizePages] desc = "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." tags = "rearrange,reorder,organize,reorganize,move pages,page order,sort pages,arrange pages,shuffle,resequence" title = "Reorganize Pages" [home.repair] desc = "Tries to repair a corrupt/broken PDF" tags = "fix,restore,repair,fix PDF,fix broken,fix corrupt,repair PDF,repair corrupt,broken PDF,corrupt PDF,damaged PDF,recover,fix errors,PDF won't open,can't open PDF,PDF errors,troubleshoot,restore PDF,rebuild,corrupted" title = "Repair" [home.replaceColor] desc = "Replace or invert colors in PDF documents" tags = "replace color,invert color,color replacement,swap colors,change color,invert,negative,color swap,find and replace color,convert color,color change" title = "Replace & Invert Color" [home.rotate] desc = "Easily rotate your PDFs." tags = "turn,flip,orient,rotate,orientation,landscape,portrait,90 degrees,180 degrees,clockwise,counterclockwise,counter-clockwise,fix orientation" title = "Rotate" [home.sanitize] desc = "Remove potentially harmful elements from PDF files" tags = "clean,purge,remove,sanitize,remove scripts,remove javascript,remove metadata,strip metadata,security,clean document,remove hidden data,privacy" title = "Sanitize" [home.scalePages] desc = "Change the size/scale of a page and/or its contents." tags = "resize,adjust,scale,page size,resize page,scale page,change size,adjust size,enlarge,shrink page,fit to page,A4,letter size" title = "Adjust page size/scale" [home.scannerImageSplit] desc = "Detect and split scanned photos into separate pages" tags = "detect,split,photos,auto detect,detect photos,split photos,separate photos,split scanned images,multiple photos,auto split,photo detection,image detection,scan separation" title = "Detect & Split Scanned Photos" [home.sharedSign] title = "Shared Signing" [home.showJS] desc = "Searches and displays any JS injected into a PDF" tags = "javascript,code,script,show javascript,show JS,find javascript,detect javascript,view javascript,embedded scripts,malware,security,inspect,debug" title = "Show Javascript" [home.sign] desc = "Adds signature to PDF by drawing, text or image" tags = "signature,autograph,e-sign,electronic signature,digital signature,sign document,approval,signoff,authorize,endorse,ink signature,handwriting" title = "Sign" [home.split] desc = "Split PDFs into multiple documents" tags = "divide,separate,break,split,extract pages,separate pages,divide document,break apart,separate files,unbind,split by page,divide by chapter" title = "Split" [home.splitByChapters] tags = "split,chapters,structure,split by chapters,split by bookmarks,bookmarks,outline,table of contents,TOC split,chapter split,divide by sections" title = "Split PDF by Chapters" [home.splitBySections] tags = "split,sections,divide,split by sections,grid split,divide pages,split into sections,cut pages,divide grid,section split,horizontal split,vertical split" title = "Split PDF by Sections" [home.swagger] tags = "API,documentation,test,swagger,API docs,REST API,endpoints,developer,API reference,API testing,OpenAPI,integration,developer docs" title = "API Documentation" [home.timestampPdf] desc = "Add an RFC 3161 document timestamp to prove when your PDF existed" tags = "timestamp,RFC 3161,TSA,time stamp authority,document timestamp,proof of existence,timestamp token,trusted timestamp,sign timestamp,notarize" title = "Timestamp PDF" [home.unlockPDFForms] desc = "Remove read-only property of form fields in a PDF document." tags = "unlock,enable,edit,unlock forms,enable forms,editable forms,remove read only,make editable,unlock fields,enable editing,form fields,fillable,unprotect forms" title = "Unlock PDF Forms" [home.validateSignature] desc = "Verify digital signatures and certificates in PDF documents" tags = "validate,verify,certificate,validate signature,verify signature,check signature,digital signature,certificate verification,signature validation,authentic,trust,signed,verify certificate" title = "Validate PDF Signature" [home.viewPdf] title = "View/Edit PDF" [home.watermark] desc = "Add a custom watermark to your PDF document." tags = "stamp,mark,overlay,watermark,branding,logo,confidential,draft,copyright,trademark,text overlay,image overlay,background text" title = "Add Watermark" [HTMLToPDF] header = "HTML To PDF" tags = "markup,web-content,transformation,convert" title = "HTML To PDF" [image.upload] hint = "Upload a PNG, JPG, SVG, or other image file to place on the PDF. SVG files will be converted to PNG for compatibility." label = "Upload Image" placeholder = "Select image file" [imageToPDF] header = "Image to PDF" title = "Image to PDF" [imageToPdf] tags = "conversion,img,jpg,picture,photo" [invite] acceptError = "Failed to create account" accountFor = "Creating account for" alreadyHaveAccount = "Already have an account?" choosePassword = "Choose a password" confirmPassword = "Confirm password" confirmPasswordPlaceholder = "Re-enter your password" createAccount = "Create account" creating = "Creating Account..." email = "Email address" emailPlaceholder = "Enter your email address" emailRequired = "Email address is required" goToLogin = "Go to Login" invalidEmail = "Invalid email address" invalidInvitation = "Invalid Invitation" invalidToken = "Invalid invitation link" linkExpires = "Link expires" linkExpiresAt = "Link expires: {{date}} at {{time}}" passwordMismatch = "Passwords do not match" passwordPlaceholder = "Enter your password" passwordRequired = "Password is required" signIn = "Sign in" validating = "Validating invitation..." validationError = "Failed to validate invitation link" welcome = "Welcome to ZhmmCloud PDF" welcomeSubtitle = "Complete your account setup to get started" welcomeTitle = "You've been invited!" [landing] addFiles = "Add Files" mobileUpload = "Upload from Mobile" openFromComputer = "Open from computer" settingUpSession = "Setting up your session..." uploadFromComputer = "Browse files" [language] direction = "ltr" [legacyBilling] currentTeamAllowance = "Current allowance for your legacy team" loadError = "We couldn't check your existing subscription. Try again before purchasing another plan." loading = "Checking your subscription..." portalError = "We couldn't open Stripe billing. Please try again." pro = "Pro (legacy)" retry = "Try again" team = "Team (legacy)" teamUsers = "Your team: {{used}} of {{limit}} users" unlimitedUsers = "Your team: unlimited users ({{used}} in use)" usersUnavailable = "We couldn't confirm your team's user allowance. Contact support to check your legacy plan." [legacyBilling.status] active = "Active" incomplete = "Payment pending" past_due = "Payment overdue" paused = "Paused" trialing = "Trial" unpaid = "Unpaid" [legal] accessibility = "Accessibility" cookie = "Cookie Policy" iAgreeToThe = "I agree to all of the" impressum = "Impressum" privacy = "Privacy Policy" showCookieBanner = "Cookie Preferences" terms = "Terms and Conditions" [licenses] title = "3rd Party Licenses" [localMode] automationUnavailable = "Sign in to ZhmmCloud or a self-hosted server to use processing folders and pipelines." toolUnavailable = "This tool requires an account. Sign in to ZhmmCloud or connect to a self-hosted server to use it." [localMode.toolPicker] message = "Sign in to unlock all tools." signIn = "Sign In" [login] accountCreatedSuccess = "Account created successfully! You can now sign in." backToSignIn = "Back to sign in" changePasswordWarning = "Please change your password after logging in for the first time" createAccount = "Create an account" credentialsUpdated = "Your credentials have been updated. Please sign in again." defaultCredentials = "Default Login Credentials" email = "Email" enterEmail = "Enter your email" enterEmailForMagicLink = "Enter your email for magic link" enterMfaCode = "Enter 6-digit code" enterPassword = "Enter your password" enterUsername = "Enter username" failedToSignIn = "Failed to sign in with {{provider}}: {{message}}" forgotPassword = "Forgot your password?" loggingIn = "Logging In..." login = "Login" magicLinkSent = "Magic link sent to {{email}}! Check your email and click the link to sign in." mfaCode = "Authentication Code" mfaRequired = "Two-factor code required" or = "Or" password = "Password" passwordChangedSuccess = "Password changed successfully! Please sign in with your new password." passwordResetSent = "Password reset link sent to {{email}}! Check your email and follow the instructions." passwordUpdatedSuccess = "Your password has been updated successfully." pleaseEnterBoth = "Please enter both email and password" pleaseEnterEmail = "Please enter your email address" resetHelp = "Enter your email to receive a secure link to reset your password. If the link has expired, please request a new one." resetYourPassword = "Reset your password" sending = "Sending…" sendMagicLink = "Send Magic Link" sendResetLink = "Send reset link" sessionExpired = "Your session has expired. Please sign in again." signin = "Sign in" signingIn = "Signing in..." signInWith = "Sign in with" signInWithProvider = "Sign in with {{provider}}" ssoRedirectFailed = "SSO redirect failed" title = "Sign in" unexpectedError = "Unexpected error: {{message}}" updatePassword = "Update password" useMagicLink = "Use magic link instead" username = "Username" [margin] large = "Large" medium = "Medium" small = "Small" xLarge = "Extra Large" [MarkdownToPDF] header = "Markdown To PDF" tags = "markup,web-content,transformation,convert,md" title = "Markdown To PDF" [merge] goToFileEditor = "Go to file editor" submit = "Merge" tags = "merge,Page operations,Back end,server side" title = "Merge" viewerModeHint = "Merge needs 2 or more files. Head to the file editor to add them." [merge.error] failed = "An error occurred while merging the PDFs." [merge.generateTableOfContents] label = "Generate table of contents in the merged file?" [merge.generateTableOfContents.tooltip] description = "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." title = "Generate Table of Contents" [merge.removeDigitalSignature] label = "Remove digital signature in the merged file?" [merge.removeDigitalSignature.tooltip] description = "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." title = "Remove Digital Signature" [merge.settings] title = "Settings" [merge.sortBy] ascending = "Ascending" dateModified = "Date Modified" descending = "Descending" description = "Files will be merged in the order shown. Drag to reorder or sort below." filename = "File Name" label = "Sort By" sort = "Sort" [merge.sortFiles] title = "Sort Files" [merge.tooltip.header] title = "Merge Settings Overview" [mobileScanner] addMore = "Add More" back = "Back" camera = "Camera" cameraAccessDenied = "Camera access denied. Please enable camera access." cameraDescription = "Scan documents using your device camera with automatic edge detection" capture = "Capture Photo" chooseMethod = "Choose Upload Method" chooseMethodDescription = "Select how you want to scan and upload documents" clearAll = "Clear All" closeTabHint = "You can close this tab now." dismiss = "Dismiss" edgeDetection = "Edge Detection" fileDescription = "Upload existing photos or documents from your device" fileReadFailed = "Could not read that file." fileUpload = "File Upload" flashlight = "Flashlight" httpsRequired = "Camera access requires HTTPS or localhost. Please use HTTPS or access via localhost." imageCount_one = "{{count}} image" imageCount_other = "{{count}} images" imagePosition = "Image {{index}} of {{total}}" invalidFileType = "Please choose an image file." noSessionMessage = "Please scan a valid QR code to access this page." processing = "Processing..." remove = "Remove" retake = "Retake" scanAnother = "Scan another" selectFilesPrompt = "Select files to upload" selectImages = "Select Images" sessionExpired = "This session has expired. Please refresh and try again." sessionInvalid = "Session Error" sessionNotFound = "Session not found. Please refresh and try again." sessionValidationError = "Unable to verify session. Please try again." startingCamera = "Starting camera…" title = "Mobile Scanner" uploadFailed = "Upload failed. Please try again." uploading = "Uploading..." uploadSuccess = "Upload Successful!" uploadSuccessMessage = "Your images have been transferred." uploadWithCount = "Upload ({{total}})" validating = "Validating session..." [mobileSign] clear = "Clear" drawingArea = "Signature drawing area" invalidSession = "Session expired" invalidSessionMessage = "This QR code is no longer valid. Open the Sign tool on your computer and scan the new code." penSizeLabel = "Pen size" send = "Send to computer" sendAnother = "Send another signature" sendError = "Could not send the signature. Check the connection and try again." sentMessage = "Signature sent to your computer. You can send another or close this page." tabsLabel = "Signature source" undo = "Undo" validating = "Checking session…" [mobileSign.photo] fromGallery = "From gallery" hint = "Photograph a signature on white paper, or choose an existing image." invalidType = "Please choose an image file." previewAlt = "Signature" takePhoto = "Take a photo" [mobileSign.tab] draw = "Draw" photo = "Photo" type = "Type" [mobileSign.type] placeholder = "Your name" previewPlaceholder = "Signature preview" [mobileUpload] description = "Scan to upload photos. Images auto-convert to PDF." descriptionNoConvert = "Scan to upload photos from your mobile device." error = "Connection Error" expiryWarning = "Session Expiring Soon" expiryWarningMessage = "This QR code will expire in {{seconds}} seconds. A new code will be generated automatically." filesReceived_one = "{{count}} file received" filesReceived_other = "{{count}} files received" instructions = "Scan with your phone camera. Images convert to PDF automatically." instructionsNoConvert = "Scan with your phone camera to upload files." pollingError = "Error checking for files" sessionCreateError = "Failed to create session" title = "Upload from Mobile" [multiTool] tags = "Multi Tool,Multi operation,UI,click drag,front end,client side,interactive,intractable,move,delete,migrate,divide" title = "PDF Multi Tool" [navFooter] openEditor = "Open PDF Editor" openProcessor = "Open PDF Processor" [navFooter.credits] count = "{{remaining}} of {{total}}" label = "Free credits" [notifications] adoptFailed = "The document was unlocked but could not be opened here. Try the tool directly." empty = "You're all caught up." handoffUnavailable = "This browser will not let the processor pass the document to the editor. Open it from the editor instead." inSmartFolder = "This document is in a smart folder, so it is handled on the server rather than here." inSmartFolderNamed = "{{name}} is in a smart folder, so it is handled on the server rather than here." noDocumentLinked = "This failure is not linked to a specific document, so it cannot be opened or retried here." notOnThisDevice = "This document is not on this device, so it cannot be opened or retried here." occurrences = "{{count}} times" open = "Notifications" repairAdoptFailed = "The document was repaired but could not be opened here. Try the Repair tool directly." repairedNotRerun = "The document was repaired and opened here, but the policy could not be run on it again." repairedRerunNotAdopted = "The repaired document went through, but its result could not be opened here." repairedRerunUndelivered = "The document was repaired and the policy re-run started, but its result cannot be delivered here, so this failure stays open." rerunRejected = "The policy could not be run again just now. Try again in a moment." rerunUndelivered = "The policy re-run started, but its result cannot be delivered here, so this failure stays open." retryInFolderFailed = "That document could not be run again just now." retryUnavailable = "This document can no longer be retried from this browser." title = "Notifications" unlockedNotRerun = "The document was unlocked and opened here, but the policy could not be run on it again." unlockedRerunUndelivered = "The document was unlocked and the policy re-run started, but its result cannot be delivered here, so this failure stays open." unread = "Unread" [notifications.action] copiedLog = "Copied" copyLog = "Copy log" failed = "That did not work. Try again in a moment." more = "More options" unavailable = "Not available for this notification." [notifications.section] earlier = "Earlier" new = "New" [oauth.error] message = "Authentication was not successful. You can close this window and try again." title = "Authentication Failed" [oauth.success] message = "You can close this window and return to ZhmmCloud PDF." title = "Authentication Successful" [oauthAuthorize] failed = "This connection request could not be started. Try connecting again from your app." [oauthConsent] approve = "Allow access" approving = "Allowing..." decisionFailed = "Could not complete this authorization. It may already have been used or expired - start the connection again from your app." deny = "Deny" denying = "Denying..." loadFailed = "This authorization request is invalid or has expired. Close this tab and try connecting again from the app." loading = "Loading authorization request..." missingId = "Missing authorization request. Start the connection from your app and try again." redirecting = "Returning you to the app..." requesting = "{{app}} wants to access your ZhmmCloud PDF account" scopesIntro = "This will allow {{app}} to:" signedInAs = "Signed in as {{name}}" signInButton = "Sign in to continue" signInPrompt = "Sign in to your ZhmmCloud PDF account to continue connecting the app." title = "Authorize access" unknownApp = "A third-party application" unverifiedApp = "Unverified app name. Access goes to {{host}}, so only continue if you trust that site." verifiedDomain = "Published by {{domain}}" [oauthConsent.access] actAsYou = "Act as you - everything {{app}} does runs under your account and counts towards your usage" tools = "Use your ZhmmCloud PDF tools on your behalf - convert, edit, sign, secure and process your documents" [oauthConsent.scope] email = "See your email address" offlineAccess = "Stay connected without asking you to sign in again" openid = "Confirm your identity" phone = "See your phone number" profile = "See your basic profile information" toolsRead = "Read your documents and run read-only tools" toolsWrite = "Convert, edit, sign and secure your documents" [ocr] desc = "Cleanup scans and detects text from images within a PDF and re-adds it as text." tags = "recognition,text,image,scan,read,identify,detection,editable" title = "OCR / Scan Cleanup" [ocr.advanced] title = "Advanced" [ocr.error] failed = "OCR operation failed" [ocr.languagePicker] additionalLanguages = "Looking for additional languages?" loading = "Loading available languages..." viewSetupGuide = "View setup guide →" [ocr.operation] submit = "Process OCR and Review" [ocr.results] title = "OCR Results" [ocr.settings] title = "Settings" [ocr.settings.advancedOptions] clean = "Clean input file" cleanFinal = "Clean final output" deskew = "Deskew pages" label = "Processing Options" sidecar = "Create a text file" [ocr.settings.compatibilityMode] label = "Compatibility Mode" [ocr.settings.languages] label = "Languages" placeholder = "Select languages" [ocr.settings.ocrMode] auto = "Auto (skip text layers)" force = "Force (re-OCR all, replace text)" label = "OCR Mode" strict = "Strict (abort if text found)" [ocr.tooltip.advanced.clean] text = "Preprocesses the input by removing noise, enhancing contrast, and optimizing the image for better OCR recognition before processing." title = "Clean Input File" [ocr.tooltip.advanced.cleanFinal] text = "Post-processes the final PDF by removing OCR artifacts and optimizing the text layer for better readability and smaller file size." title = "Clean Final Output" [ocr.tooltip.advanced.compatibility] 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." title = "Compatibility Mode" [ocr.tooltip.advanced.deskew] text = "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." title = "Deskew Pages" [ocr.tooltip.advanced.header] title = "Advanced OCR Processing" [ocr.tooltip.advanced.sidecar] text = "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." title = "Create Text File" [ocr.tooltip.header] title = "OCR Settings Overview" [ocr.tooltip.languages] text = "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." title = "Languages" [ocr.tooltip.mode] 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." text = "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight." title = "OCR Mode" [ocr.tooltip.output] 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." text = "Decide how you want the text output formatted:" title = "Output" [onboarding] activeFiles = "The Active Files view shows all of the PDFs you have loaded into the tool." allTools = "This is the Tools panel, where you can browse and select from all available PDF tools." close = "Close" 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." dialogLabel = "Onboarding" fileCheckbox = "Files on the workbench are selected for processing. You can select multiple files for batch operations using the left files sidebar." fileReplacement = "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools." 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." finish = "Finish" next = "Next" pinButton = "You can use the Pin button if you'd rather your files stay active after running tools on them." 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. " runButton = "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs." selectCropTool = "Let's select the Crop tool to demonstrate how to use one of the tools." stepOf = "Step {{current}} of {{total}}" 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." workbench = "This is the Workbench - the main area where you view and edit your PDFs." wrapUp = "You're all set! You can replay this tour anytime - just open Settings and find it here in the Tours section under Help." [onboarding.buttons] back = "Back" continue = "Continue" download = "Download →" getStarted = "Get started" next = "Next →" showMeAround = "Show me around" skipForNow = "Skip for now" skipTheTour = "Skip the tour" [onboarding.checklist] dismiss = "Dismiss" title = "Set up ZhmmCloud PDF" [onboarding.checklist.downloadDesktop] description = "Run ZhmmCloud natively on your machine" title = "Download ZhmmCloud for Desktop" [onboarding.checklist.inviteTeam] description = "Collaborate with your team" title = "Invite team members" [onboarding.checklist.setDefaultApp] description = "Open PDF files in ZhmmCloud PDF" title = "Make ZhmmCloud your default" [onboarding.checklist.takeTour] description = "See how ZhmmCloud works in a quick walkthrough" title = "Take the tour" [onboarding.desktopInstall] body = "ZhmmCloud works best as a desktop app. You can use it offline, access documents faster, and make edits locally on your computer." selectOs = "Select operating system" title = "Download" titleWithOs = "Download for {{osLabel}}" [onboarding.desktopWelcome] body = "There's a whole host of new changes to explore, including Agent Chat, automatic document classification, and more." freeLine = "The editor is now completely free." title = "Welcome to ZhmmCloud Desktop" [onboarding.mfa] authenticationCode = "Authentication code" description = "Secure your account by linking an authenticator app. Scan the QR code or enter the setup key, then confirm the 6-digit code to finish." enable = "Enable MFA" enableError = "Unable to enable two-factor authentication. Check the code and try again." enterCode = "Enter the 6-digit code from your app." enterCodeError = "Enter the authentication code to continue." logout = "Logout" openAuthenticator = "Open Google Authenticator, Authy, or 1Password." qrCodeLoading = "Generating your QR code…" regenerateQrCode = "Regenerate QR code" scanQrCode = "Scan the QR code or enter the setup key below." setupError = "Unable to start two-factor setup. Please try again." setupKey = "Setup key (manual entry)" stepByStep = "Step-by-step" success = "MFA has been enabled. You can now continue." title = "Multi-Factor Authentication Setup" [onboarding.planOverview] adminBodyLoginDisabled = "Once you enable login mode, you can manage users, configure settings, and monitor server health. The first {{freeTierLimit}} people on your server get to use ZhmmCloud free of charge." adminBodyLoginEnabled = "As an admin, you can manage users, configure settings, and monitor server health. The first {{freeTierLimit}} people on your server get to use ZhmmCloud free of charge." adminTitle = "Admin Overview" userBody = "Invite teammates, assign roles, and keep your documents organized in one secure workspace. Enable login mode whenever you're ready to grow beyond solo use." userTitle = "Plan Overview" [onboarding.processorIntro] body = "ZhmmCloud now runs Policies — automated rules that classify, secure, and process every document as it arrives. Set them up and monitor runs in the Processor." cta = "Check out the Processor" title = "Check out the ZhmmCloud Processor" [onboarding.saas.freeEditor] freeLine = "The editor is now completely free." premium = "We've added loads of new features, including Policies and Agent Chat." title = "Welcome to ZhmmCloud" [onboarding.saas.team] addButton = "Add" createBody = "Work on documents together: teammates share files, automations and your plan. Add the first member by email to create your team." createTitle = "Create your team" inviteBody = "Everyone on your team shares files, automations and your plan. Add teammates by email and they'll get an invite." inviteTitle = "Invite members to your team" [onboarding.saas.usage] body = "Automations, AI and API requests draw from your free allowance. Manual editing never counts against it." title = "Your free Processor allowance" [onboarding.securityCheck] message = "The application has undergone significant changes recently. Your server admin's attention may be required. Please confirm your role to continue." roleAdmin = "Admin" rolePlaceholder = "Confirm your role" roleUser = "User" title = "Security Check" [onboarding.serverLicense] freeBody = "Our Open-Core licensing includes OAuth SSO and up to {{freeTierLimit}} users for free. To scale uninterrupted, we recommend the ZhmmCloud Team plan - 100 users for $99/mo." freeTitle = "Team plan" overLimitBody = "Our licensing permits up to {{freeTierLimit}} users for free. You have {{overLimitUserCopy}} ZhmmCloud users. To continue uninterrupted, upgrade to the ZhmmCloud Team plan - 100 users, PDF text editing, and full admin control for $99/mo." overLimitTitle = "Team plan needed" seePlans = "See Plans →" upgrade = "Upgrade now →" [onboarding.tourOverview] body = "ZhmmCloud PDF V2 ships with dozens of tools and a refreshed layout. Take a quick tour to see what changed and where to find the features you need." title = "Tour Overview" [onboarding.welcomeSlide] body = "ZhmmCloud PDF is now ready for teams of all sizes. This update includes a new layout, powerful new admin capabilities, and our most requested feature - Edit Text." title = "Welcome to ZhmmCloud" [onboarding.whatsNew] activeFilesView = "Use Active Files to see everything you have open and pick what to work on." fileUpload = "Use the Files button to upload or pick a recent PDF. We will load a sample so you can see the workspace." leftPanel = "The left Tools panel lists everything you can do. Browse categories or search to find a tool quickly." pageEditorView = "Switch to the Page Editor to reorder, rotate, or delete pages." quickAccess = "Start at the Quick Access rail to jump between Reader, Automate, your files, and all the tours." topBar = "The top bar lets you swap between Viewer, Page Editor, and Active Files." wrapUp = "That is what is new in V2. Open the Tours menu anytime to replay this, the Tools tour, or the Admin tour." [overlay-pdfs] desc = "Overlay one PDF on top of another" submit = "Submit" tags = "Overlay" title = "Overlay PDFs" [overlay-pdfs.counts] item = "Count for file" label = "Overlay Counts (for Fixed Repeat Mode)" noFiles = "Add overlay files to configure counts" [overlay-pdfs.error] failed = "An error occurred while overlaying PDFs." [overlay-pdfs.mode] fixedRepeat = "Fixed Repeat Overlay" interleaved = "Interleaved Overlay" label = "Select Overlay Mode" sequential = "Sequential Overlay" [overlay-pdfs.overlayFiles] addMore = "Add more PDFs..." label = "Select Overlay PDF Files" placeholder = "Choose PDF(s)..." [overlay-pdfs.position] background = "Background" foreground = "Foreground" label = "Select Overlay Position" [overlay-pdfs.results] title = "Overlay Results" [overlay-pdfs.settings] title = "Settings" [overlay-pdfs.tooltip.counts] 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." title = "Counts (Fixed Repeat only)" [overlay-pdfs.tooltip.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." title = "Description" [overlay-pdfs.tooltip.header] title = "Overlay PDFs Overview" [overlay-pdfs.tooltip.mode] fixedRepeat = "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." interleaved = "Interleaved Overlay: Take one page from each overlay in turn." sequential = "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next." text = "Choose how to distribute overlay pages across the base PDF pages." title = "Overlay Mode" [overlay-pdfs.tooltip.overlayFiles] 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." title = "Overlay Files" [overlay-pdfs.tooltip.position] text = "Foreground places the overlay on top of the page. Background places it behind." title = "Overlay Position" [ownership] acceptInvite = "They can create an account or sign in, then accept the invitation." accessUpdated = "Their owner access is ready." accountLinkDisabled = "This server still has a cloud link, but account linking is turned off. Ask the server operator to enable account linking, then resume this transfer or unlink the server in settings." anotherTeam = "Already on another team?" billing = "The subscription, wallet, payment method and existing licenses stay in place. Billing contact details do not change automatically." billingDetails = "Billing details" billingUnchanged = "Subscription and billing stay in place" bothDone = "Server and cloud ownership are now aligned." cancel = "Cancel transfer" check = "Check again" checkAccount = "Check account" chooseEmail = "Choose their account in {{team}}, or enter an email to invite them." close = "Close transfer dialog" cloudAccount = "ZhmmCloud account" cloudScopeStyled = "{{name}} will manage {{team}}, its members and billing." cloudTargetChanged = "Choose another cloud member. This account is no longer eligible for the handover." confirm = "I understand the access and ownership changes." done = "Ownership transferred" error = "We couldn't complete this step. Check the recipient is active and the server is connected, then check again. A pending transfer can be resumed here." finish = "Finish server transfer" inProgress = "Another recipient already has a pending transfer. Close this dialog and resume it from Users." instances = "This team has {{count}} linked servers. Their cloud billing stays with this team; other servers' local owners do not change." invitationSent = "Invitation sent" invite = "Send invitation" inviteAddress = "Invite {{email}} to {{team}}." inviteBlocked = "The invitation could not be sent. Check available team seats and whether the recipient already has a paid subscription." linkChanged = "The server's cloud link changed. Ask the server operator to restore the original link before resuming." linkedServerCount = "{{count}} linked servers" linkRevoked = "This server's cloud link is no longer valid. Cancel the transfer, then reconnect your ZhmmCloud account in settings. Ownership will not change." localScope = "They will own this server and manage billing and cloud connections. You keep administrator access, but lose access to those settings." membershipDetails = "Team membership details" membershipFirst = "They must join the team before you can confirm the transfer." membershipRequired = "The recipient must join this cloud team before ownership can transfer. Ask them to accept their invitation, then check again." newOwnerLabel = "New owner" newOwnerStyled = "{{name}} is now the owner." noEmailMatches = "No matching members. Enter an email to invite." otherTeam = "If they belong to another team, accepting may move their account. A paid account or ownership of another team may need resolving first. We won't move their subscription or merge teams." ownerChanged = "Cloud ownership changed after this transfer started. Cancel this transfer and start again with the current cloud owner." ownerRequired = "Sign in as the current cloud team owner, then try this step again." partialError = "Cloud ownership has transferred. Finish the server transfer to keep both owners aligned." partialTargetChanged = "Restore the selected server user's access and original account details, then finish the server transfer. Cloud ownership has already transferred." pending = "An ownership transfer to {{name}} is pending." personalTeam = "Personal teams cannot transfer ownership." prepareHelp = "The recipient must have completed their first server login. You can retry here, or return to Users to choose someone else." resume = "Resume transfer" searchEmail = "Search or enter an email" serverAccount = "Server account" serverDetails = "Linked server details" signIn = "Sign in to cloud" startFromInstanceBody = "This team has linked servers. On the self-hosted server, open Settings → Users and change the recipient's role to Org Owner. That flow transfers cloud ownership before completing the server transfer." startFromInstanceTitle = "Start from your self-hosted server" stayOwner = "You stay the owner until transfer." targetChanged = "The recipient's account changed. Restore their access or cancel this transfer and choose them again." title = "Transfer ownership" transfer = "Transfer ownership" waitingForEmail = "Waiting for {{email}} to join {{team}}." working = "Checking and updating ownership..." yourCloudAccess = "You'll become a team member and lose owner access." [pageEdit] deselectAll = "None" selectAll = "Check All" [pageExtracter] title = "Extract Pages" [pageLayout] addBorder = "Add Borders" borderWidth = "Border Thickness" bottom = "Bottom Margin" cols = "Columns" colsPlaceholder = "Enter columns" innerMargin = "Inner Margin" left = "Left Margin" pagesPerSheet = "Pages per sheet:" right = "Right Margin" rows = "Rows" rowsPlaceholder = "Enter rows" submit = "Submit" tags = "merge,composite,single-view,organize" title = "Multi Page Layout" top = "Top Margin" [pageLayout.advanced.tooltip.arrangement] bullet1 = "By Rows: Fill each row first." bullet2 = "By Columns: Fill each column first." text = "Controls whether pages fill the grid row-by-row or column-by-column." title = "Page Arrangement" [pageLayout.advanced.tooltip.header] title = "Advanced Layout Options" [pageLayout.advanced.tooltip.orientation] text = "Choose the final sheet direction. Portrait works better for tall content, while landscape fits wider layouts." title = "Orientation" [pageLayout.advanced.tooltip.readingDirection] bullet1 = "LTR: Left to right order." bullet2 = "RTL: Right to left order." text = "Sets horizontal ordering in the grid, useful for left-to-right and right-to-left document conventions." title = "Reading Direction" [pageLayout.arrangement] byColumns = "By Columns" byRows = "By Rows" label = "Page arrangement:" [pageLayout.desc] 16 = "Place 16 pages on a single sheet (4 × 4 grid)." 2 = "Place 2 pages side-by-side on a single sheet." 4 = "Place 4 pages on a single sheet (2 × 2 grid)." 9 = "Place 9 pages on a single sheet (3 × 3 grid)." [pageLayout.error] failed = "An error occurred while creating the multi-page layout." innerMarginTooLarge = "Inner margin is too large for the selected layout." outerHorizontalMarginsTooLarge = "Left/Right margins are too large for this page size." outerVerticalMarginsTooLarge = "Top/Bottom margins are too large for this page size." [pageLayout.margins] borderThicknessPlaceholder = "Enter border thickness" bottomPlaceholder = "Enter bottom margin" innerPlaceholder = "Enter inner margin" leftPlaceholder = "Enter left margin" rightPlaceholder = "Enter right margin" topPlaceholder = "Enter top margin" [pageLayout.marginsBorders.tooltip.borders] text = "Enable borders to draw lines around each placed page. This can help visual separation or trimming." title = "Add Borders" [pageLayout.marginsBorders.tooltip.borderWidth] text = "Border thickness is only applied when borders are enabled. Higher values produce thicker lines." title = "Border Thickness" [pageLayout.marginsBorders.tooltip.header] title = "Margins and Borders" [pageLayout.marginsBorders.tooltip.innerMargin] text = "Inner margin adds spacing between cells in the page grid to improve separation and readability." title = "Inner Margin" [pageLayout.marginsBorders.tooltip.margins] text = "Use top, bottom, left, and right margins to control spacing around the full sheet output." title = "Margins" [pageLayout.mode] custom = "Custom" default = "Default" label = "Mode:" [pageLayout.orientation] label = "Orientation:" landscape = "Landscape" portrait = "Portrait" [pageLayout.readingDirection] label = "Reading Direction:" ltr = "Left to Right" rtl = "Right to Left" [pageLayout.steps] advanced = "Advanced settings" layout = "Layout settings" marginsBorders = "Margins and borders" [pageLayout.tooltip.header] title = "Page Layout Guide" [pageLayout.tooltip.mode] bullet1 = "Default: Pick a preset and the grid is calculated automatically." bullet2 = "Custom: Set rows and columns manually." text = "Choose how the grid is configured:" title = "Mode" [pageLayout.tooltip.overview] text = "Fit multiple pages onto a single sheet for handouts or to save paper." title = "What is Page Layout?" [pageLayout.tooltip.pagesPerSheet] text = "Choose how many pages per sheet (e.g. 4 → 2×2, 9 → 3×3)." title = "Pages per Sheet (Default Mode)" [pageLayout.tooltip.rowsCols] text = "Set exact grid dimensions. Total pages per sheet = rows × columns." title = "Rows & Columns (Custom Mode)" [pageRemover] title = "Page Remover" [pageSelection.tooltip] description = "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword." [pageSelection.tooltip.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" [pageSelection.tooltip.header] title = "Page Selection Guide" [pageSelection.tooltip.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" [pageSelection.tooltip.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" [pageSelection.tooltip.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" [pageSelection.tooltip.special] bullet1 = "all → selects all pages" title = "Special Keywords" [pageTracks] blankPage = "Blank page" deleteSelected = "Delete selected pages" downloadAsOneFile = "Download as one file" downloadEachPage = "Download each page individually" downloadSelectedPages = "Download selected pages" dragging_one = "{{count}} page" dragging_other = "{{count}} pages" duplicateSelected = "Duplicate selected pages" edited = "edited" emptyTrack = "No pages left. Drag pages here, or save to close this file." insertBlank = "Insert blank page" insertBlankAfterSelected = "Insert blank pages after selected pages" moveLeft = "Move left" moveRight = "Move right" nextPage = "Next page" page = "Page {{number}}" pageCount_one = "{{count}} page" pageCount_other = "{{count}} pages" pagePosition = "Page {{number}} of {{total}}" prevPage = "Previous page" readingPages = "Reading pages..." redo = "Redo" rotateLeft = "Rotate left" rotateRight = "Rotate right" rotateSelectedLeft = "Rotate selected pages left" rotateSelectedRight = "Rotate selected pages right" saveAsOneFile = "Save as one file" saveChanges = "Save changes to all files" saveEachPage = "Save each page individually" saveSelectedPages = "Save selected pages" saving = "Saving..." savingProgress = "Saving {{done}} of {{total}}" selectPage = "Select page {{number}}" splitAfterSelected = "Split after selected pages" splitHere = "Split here" undo = "Undo" viewError = "Couldn't render this page" viewPage = "View page" zoomIn = "Zoom in" zoomOut = "Zoom out" [pageTracks.close] message = "Are you sure you want to close all files?" unsaved = "These files have unsaved changes." [pageTracks.delete] page = "Delete page" [pageTracks.duplicate] page = "Duplicate page" [pageTracks.empty] body = "Add PDFs to expand them into editable page tracks" title = "No PDF files loaded" [pageTracks.exportFailed] body = "The edited files couldn't be prepared. Try again." title = "Couldn't download" [pageTracks.saveFailed] body = "Your edits haven't been lost. Try saving again." title = "Couldn't save changes" [pageTracks.track] close = "Close file" collapse = "Collapse" expand = "Expand" rename = "Rename file" [pageTracks.wrap] label = "Wrap pages" [payg.activity] docs = "docs" empty = "No billable activity yet this period." subtitle = "Only AI and automation draw from your budget. Everyday tools are free and aren't listed here." title = "Recent billable activity" [payg.cap] amount = "Cap amount" custom = "Custom" docsEstimate = "≈ {{docs}} credits / month" docsRate = "at {{rate}} / credit" noCapDesc = "Usage is billed without an upper limit. You can re-enable a cap at any time." noCapLabel = "No cap" noneShort = "No cap" perMonth = "/ month" save = "Update cap" subtitle = "Set your maximum spend. We convert this to PDFs using the current price tier." title = "Monthly spending cap" [payg.checkout] connecting = "Connecting to Stripe…" errorTitle = "Stripe error" [payg.checkout.error] startFailed = "Couldn't start checkout session" [payg.checkout.mock] backend = "Backend is in mock mode; no real Stripe session was created." continue = "Continue with mock subscription" noKey = "VITE_STRIPE_PUBLISHABLE_KEY is unset. Real iframe mounts here once configured." title = "Stripe Embedded Checkout (mock mode)" [payg.confirm] bodyWithAllowance = "Your team can now run automation, AI, and API operations beyond your {{limit}} free PDFs." capValue = "{{symbol}}{{amount}} / month" noCap = "No cap" note = "You can change your cap, cancel, or open the Stripe customer portal any time from this page." summaryLabel = "Monthly ceiling" title = "Welcome to the Processor plan" [payg.docHelp] billable = "Only automation runs, AI tools, and API calls count. Manual tools in the editor are always free." chains = "Running the same file through several steps of one automation counts it once, not once per step." perFile = "Each file you process counts as one PDF. Very long or very large files can count as more than one." refunds = "If a job fails on its first step, the PDF is credited back automatically." toggle = "What counts as a PDF?" [payg.error] body = "We couldn't reach the billing service. Refresh the page to try again." title = "Couldn't load your plan" [payg.free.cta] benefit1Body = "chain tools, schedule runs, batch process" benefit1Title = "Automation pipelines" benefit2Body = "summarize, classify, redact, AI-OCR" benefit2Title = "AI tools" benefit3Body = "call any ZhmmCloud endpoint programmatically" benefit3Title = "API access" button = "Turn on Processor →" reassurance = "No minimum · Set a $0 cap to test · Cancel anytime" subtitleWithAllowance = "Keep going past your {{limit}} free PDFs with automation, AI, and the API. Set a monthly ceiling, so you stay in control." title = "Turn on the Processor plan" [payg.free.editor] eyebrow = "Editor plan · Always free" [payg.free.header] freeBody = "View, edit, merge, split, sign, watermark, compress, convert and manual OCR — as much as you want, no matter where you trigger it." freeTitle = "Unlimited PDF editing" [payg.free.hero] barAria = "Free PDFs remaining" capSuffix = "of {{limit}} free PDFs left this month" metaCategories = "Automation · AI · API requests" [payg.free.member] ownerOnly = "Only your team owner can turn on Processor. Manual tools stay free for you to use as much as you like." [payg.free.proc] eyebrow = "Processor plan · metered" [payg.free.state] approachingLimit = "Approaching limit" limitReached = "Limit reached" plentyLeft = "Plenty left" [payg.gates] ai = "AI tools (AI Create, suggestions, AI-OCR)" automation = "Automations & pipelines" client = "Browser-only tools (viewer, page editor, file management)" offsite = "Server tools (compress, OCR, convert, watermark…)" pauses = "pauses at cap" title = "What happens when the cap is reached" [payg.header] eyebrow = "Processor plan · {{start}} – {{end}}" freeBody = "View, edit, merge, split, sign, watermark, compress, convert and manual OCR — as much as you want, no matter where you trigger it." freeLabel = "Always free" freeTitle = "Unlimited PDF editing" meterBody = "{{limit}} free PDFs to start, then billed per PDF up to your cap." meterLabel = "Metered" meterTitle = "Automation · AI · API" [payg.member] askLeader = "Only your team owner can change the cap." [payg.members] docs = "PDFs" subtitle = "Billable PDFs each teammate has processed this period." title = "Team member usage" [payg.prepaid] chip = "Prepaid year" [payg.prepaid.banner] exhausted = "Your prepaid capacity is used up; metered billing has resumed. Top up to keep the discount." expiring_one = "Your prepaid year ends in {{count}} day. Unused capacity expires — top up to start a fresh year." expiring_other = "Your prepaid year ends in {{count}} days. Unused capacity expires — top up to start a fresh year." low = "You're down to {{pct}}% of your prepaid capacity. Top up any time to keep processing uninterrupted." [payg.prepaid.card] subtitle = "Used before metered billing and outside your spend cap." title = "Prepaid capacity" [payg.prepaid.meter] capSuffix = "of {{total}} prepaid credits" expires = "Expires {{date}}" [payg.prepaid.state] exhausted = "Used up" healthy = "Plenty left" low = "Running low" [payg.role] leader = "Team owner" member = "Member" [payg.signupRequired] aiPromo = "Create, edit and ask about PDFs with AI" apiPromo = "Connect your apps and AI assistants" automationPromo = "Automate repetitive PDF tasks" createAccount = "Create free account" editorLabel = "PDF Editor" login = "Log in" manualToolsPromo = "Unlimited free manual PDF tools" processorLabel = "PDF Processor" processorTitle = "Welcome to ZhmmCloud PDF" readerLabel = "PDF Reader" [payg.spendCapMeter] barAria = "Spend against cap" capSuffix = "/ {{amount}} cap" metaCategories = "Automation · AI · API spend" resets = "Resets each billing period" [payg.state] degraded = "Cap reached" full = "Healthy" warned = "Approaching cap" [payg.stripe] open = "Open billing portal" subtitle = "Receipts, invoices, payment method, billing currency." title = "Manage billing in Stripe" [payg.stripe.toast.unavailable] body = "Billing portal isn't available right now. Try again in a moment." title = "Billing portal unavailable" [payg.upgrade] backAria = "Back" closeAria = "Close" [payg.upgrade.button] cancel = "Cancel" continue = "Continue →" finish = "Finish" [payg.upgrade.cap] help = "We'll never charge above this. Set $0 if you want to keep everything free while testing." title = "Set your monthly spend ceiling" usdNote = "Estimated in USD. You can adjust your cap any time after subscribing, in your own currency." [payg.upgrade.checkout] capValue = "{{symbol}}{{amount}} / month" edit = "Edit" help = "Stripe handles your card details. ZhmmCloud never sees them." loading = "Loading checkout…" noCap = "No cap" title = "Add your payment method" [payg.upgrade.help] aiBody = "summarize, classify, redact, AI-OCR" aiTitle = "AI tools" apiBody = "programmatic access to any ZhmmCloud endpoint" apiTitle = "API calls" automationBody = "chained tools or scheduled runs that don't need clicks" automationTitle = "Automation pipelines" footnoteUnlimited = "Manual tools (viewing, editing, merging, splitting, watermarking, compressing, manual OCR) are always free, even after your included credits are used. The distinction is the type of work, not where you click." title = "What we count toward billing" [payg.upgrade.promise] body = "You only pay for automation pipelines, AI tools, and API calls, the work that goes beyond a single click. Edit, merge, split, sign, compress as much as you want, no charge." highlight = "Manual tools stay free, always." [payg.upgrade.steps] cap = "Set monthly ceiling" payment = "Add payment method" [payg.upgrade.title] confirm = "You're subscribed" default = "Upgrade to Processor plan" [payg.usage] breakdown = "AI {{ai}} • Automation {{automation}} • API {{api}}" capLine = "{{cap}}/mo cap" estBill = "≈ {{amount}} so far this period" firstFree = "First {{free}} free" noCap = "No monthly cap" ofLimitProcessed = "/ {{limit}} PDFs processed" processed = "PDFs processed" resetsIn = "Resets in {{days}} days" resetsTomorrow = "Resets tomorrow" thisPeriod = "This billing period" [payment] billingPeriod = "Billing period" cancelTeamChange = "Keep current plan" canCloseWindow = "You can now close this window." createSessionFailed = "Failed to create checkout session" error = "Payment Error" generatingLicense = "Generating your license key..." licenseActivated = "License activated! Your license key has been saved. A confirmation email has been sent to your registered email address." licenseDelayed = "Payment successful! Your license is being generated. You will receive an email with your license key shortly. If you don't receive it within 10 minutes, please contact support." licenseDelayedMessage = "Your license key is being generated. Please check your email shortly or contact support." licenseInstructions = "This has been added to your installation. You will receive a copy in your email as well." licenseKey = "Your License Key" licensePollingError = "Payment successful but we couldn't retrieve your license key automatically. Please check your email or contact support with your payment confirmation." licenseRetrievalError = "Payment successful but license retrieval failed. You will receive your license key via email. Please contact support if you don't receive it within 10 minutes." licenseSaveError = "Failed to save license key. Please contact support with your license key to complete activation." manageSubscription = "Manage subscription" monthly = "Monthly" paymentCanceled = "Payment was canceled. No charges were made." perMonth = "/month" perUserBlock = "per 100 users" planPeriodUnavailable = "Selected plan period is not available" preparing = "Preparing your checkout..." redirecting = "Redirecting to secure checkout..." success = "Payment Successful!" successMessage = "Your subscription has been activated successfully. You will receive a confirmation email shortly." syncError = "Payment successful but license sync failed. Your license will be updated shortly. Please contact support if issues persist." syncingLicense = "Syncing your upgraded license..." teamActivated = "Your Team capacity is active" teamActivating = "Confirming your Team capacity..." teamChangeCurrent = "Your current allowance remains available until then. Keep your current plan to cancel this change before making another adjustment." teamChangePending = "{{users}} users · {{period}} from {{date}}" teamChangeSupport = "Your Team subscription has a scheduled change that needs billing support to adjust." teamChangeUnavailable = "Scheduled Team changes could not be loaded. Refresh to try again." teamPending = "Your Team purchase is still processing. Refresh this page shortly." teamProcessing = "Team purchase processing" teamScheduled = "Your Team change is scheduled for {{date}}. Your current capacity stays active until then." unknownError = "An unknown error occurred" upgradeComplete = "Upgrade Complete" upgradeCompleteMessage = "Your subscription has been upgraded successfully. Your existing license key has been updated." upgradeSuccess = "Payment successful! Your subscription has been upgraded. The license has been updated on your server. You will receive a confirmation email shortly." upgradeTitle = "Upgrade to {{planName}}" yearly = "Yearly" [payment.addCapacity] [payment.adjustTeam] title = "Adjust Team plan" [payment.capacityStage] adjustmentNote = "Stripe will show the exact charge, any prorations and your next billing date before you confirm. Your saved payment method will be used if available." continue = "Continue to payment" currencyAtCheckout = "Stripe confirms the final amount and payment currency at checkout." customLabel = "Number of users" dueToday = "Due today" enterpriseQuote = "Get an enterprise quote" estimatedTotal = "Estimated total" lineItem = "Team · {{price}}{{period}} per {{block}} users" minimumForCurrentUsers = "You have {{users}} users, so the plan must cover at least {{minimum}}." modalTitle = "Upgrade to {{planName}}" newPlanTotal = "New plan total" other = "Other" overCapacityBody = "{{users}} users are on this server; your current allowance is {{limit}}. Choose a Team plan below to cover everyone." overCapacityConsequence = "Existing accounts stay in place. Adding or inviting users is blocked until you add capacity or free up seats." overCapacityTitle = "Your server has more users than your plan covers" perMonth = "/mo" perYear = "/yr" reductionNote = "The lower capacity starts at your next renewal. Until then, you can use your current allowance. Existing users stay; new users are blocked if you are over capacity when the change takes effect." renewalNote = "Renews at {{total}}{{period}}. Cancel any time in Usage & Billing." reviewChange = "Review change in Stripe" roundsTo = "rounds to {{users}}" subheading = "Covers everyone you invite, in blocks of {{users}} users." subheadingAdd = "Your plan covers {{current}} users today. Choose the new total." usersLabel = "Users" userTotal = "{{users}} users" [payment.emailStage] continue = "Continue" description = "We'll use this to send your license key and receipts." emailLabel = "Email Address" emailPlaceholder = "your@email.com" [payment.paymentStage] modalTitle = "Complete Payment - {{planName}}" [payment.planStage] billedYearly = "Billed yearly at {{currency}}{{amount}}" modalTitle = "Select Billing Period - {{planName}}" savePercent = "Save {{percent}}%" savingsAmount = "You save {{amount}}" selectedMonthly = "Monthly" selectedYearly = "Yearly" selectMonthly = "Select Monthly" selectYearly = "Select Yearly" [payment.priceDisplay] basePrice = "Base Price" perPeriod = "/{{period}}" perSeat = "Per Seat" perSeatPeriod = "/seat/{{period}}" totalSeats_one = "Total ({{count}} seat)" totalSeats_other = "Total ({{count}} seats)" [payment.upgradeTeam] title = "Upgrade to Team" [pdfOrganiser] placeholder = "(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)" tags = "duplex,even,odd,sort,move" title = "Page Organizer" [pdfOrganiser.mode] 1 = "Custom Page Order" 10 = "Odd-Even Merge" 11 = "Duplicate all pages" 2 = "Reverse Order" 3 = "Duplex Sort" 4 = "Booklet Sort" 5 = "Side Stitch Booklet Sort" 6 = "Odd-Even Split" 7 = "Remove First" 8 = "Remove Last" 9 = "Remove First and Last" _value = "Organization mode" [pdfOrganiser.mode.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)." [pdfTextEditor] download = "Download" downloadTooltip = "Save and download the edited PDF" save = "Save PDF" saveTooltip = "Apply changes to the file in your workspace ({{shortcut}})" tags = "edit text,modify text,change text,edit content,update text,rewrite,correct,amend,redline,revise,text editor,content editor" title = "PDF Text Editor" unsaved = "(unsaved)" workbenchLabel = "Editor" [pdfTextEditor.annotations] freetext = "Annotation text - not page text, so it can't be edited here" stamp = "Stamp annotation - not page text, so it can't be edited here" widget = "Form field - not page text, so it can't be edited here" [pdfTextEditor.commands] edit = "Edit" mergeRuns_one = "Merge {{count}} run into a paragraph" mergeRuns_other = "Merge {{count}} runs into a paragraph" setColour = "Set colour on {{run}}" setOutline = "Set outline on {{run}}" typeInto = "Type into {{run}}" ungroupParagraph = "Ungroup paragraph {{run}}" wrap = "Wrap {{run}}" [pdfTextEditor.discard] body = "Opening {{name}} closes the document you are editing. Your unsaved changes will be lost." cancel = "Cancel" confirm = "Discard and open" hint = "Cancel, then Save PDF to keep them in your workspace first." title = "Discard unsaved changes?" [pdfTextEditor.drop] hint = "Releases on the editor stage replace any open document." title = "Drop a PDF to open" [pdfTextEditor.error] decodeImage = "Could not decode the selected image." insertImage = "Could not insert the selected image." [pdfTextEditor.externalEdit] pngFileType = "PNG image" [pdfTextEditor.find] close = "Close find bar" count = "{{current}} of {{total}}" findPlaceholder = "Find" ignoreAccents = "Ignore accents" matchCase = "Match case" next = "Next match" noMatches = "No matches" previous = "Previous match" replace = "Replace" replaceAll = "Replace all" replaced = "{{count}} replaced" replacePlaceholder = "Replace with" wholeWord = "Whole word" [pdfTextEditor.fontPicker] builtInGroup = "Built-in fonts" deviceFontsNone = "No extra device fonts were found." deviceFontsUnavailable = "Device fonts are unavailable. The built-in fonts still work." deviceGroup = "Device fonts" documentGroup = "Document font" label = "Font family" mixed = "Mixed" noMatch = "No matching font" placeholder = "Font family" useDeviceFonts = "Use device fonts" [pdfTextEditor.fonts] allPresent = "All letters & numbers present" missing = "Missing: {{glyphs}}" title = "Fonts" [pdfTextEditor.fonts.compat] info = "Existing text edits perfectly. A new character an embedded font doesn't include falls back to a standard font." ok = "Every font includes the full alphabet and digits - type freely." warnOther = "{{count}} fonts missing some letters or numbers - typing those uses a standard fallback font." [pdfTextEditor.fonts.pill] info = "Embedded" ok = "All glyphs" warn = "{{count}} with gaps" [pdfTextEditor.fonts.status.embedded] label = "Embedded" [pdfTextEditor.fonts.status.standard] label = "Standard" [pdfTextEditor.fonts.status.subset] label = "Subset" [pdfTextEditor.help] ariaLabel = "Keyboard shortcuts" title = "Keyboard shortcuts" tooltip = "Keyboard shortcuts (?)" [pdfTextEditor.help.clipboard] copyDesc = "Copy selected text" cutDesc = "Cut selected (copy + delete)" heading = "Clipboard" pasteDesc = "Paste clipboard text as new run" pastePlainDesc = "Paste as plain text" [pdfTextEditor.help.document] escDesc = "Clear selection / close find / close help" heading = "Document" helpDesc = "This help" saveDesc = "Save to your workspace" [pdfTextEditor.help.editing] deleteDesc = "Remove selected" duplicateDesc = "Duplicate selected" groupDesc = "Group selected runs into one paragraph" heading = "Editing" marqueeDesc = "Drag on empty space to select several objects (Shift adds)" moveDesc = "Move text run" selectAllDesc = "Select all" shiftClickDesc = "Add / remove a run from selection" undoRedoDesc = "Undo / Redo" [pdfTextEditor.help.find] heading = "Find & replace" nextDesc = "Next match (add Shift for previous)" openDesc = "Open find bar (and replace)" [pdfTextEditor.help.navigation] firstLastDesc = "First / last page" heading = "Navigation" pageDesc = "Previous / next page" zoomDesc = "Zoom in / out" [pdfTextEditor.inspector] document = "Document" fontEmbedded = "Embedded font · a character it lacks falls back to Helvetica." fontGap = "{{name}} · missing {{glyphs}} - typing those falls back to Helvetica." geometry = "Position & size" height = "Height" heightHint = "A text box's height follows its type size and line count." image = "Image" images = "Images" manyImages = "{{count}} images" manyShapes = "{{count}} shapes" manyText = "Text · {{count}} boxes" mixed = "{{count}} objects" multiGeometry = "Select a single object to edit its position and size." nothingSelected = "Nothing selected" nothingSelectedHint = "Click any text, image or shape on the page to edit it here." ocrDocumentChanged = "The document changed while OCR was running. Run OCR again to include your latest changes." ocrInvalidResult = "OCR did not return a PDF. Please try again." ocrNoLanguages = "No OCR languages are installed on the server." ocrProtected = "OCR cannot yet preserve this PDF's protection. The protected original remains available for viewing." ocrRunning = "Recognizing text..." ocrUnavailable = "OCR is unavailable on this server." oneImage = "Image" oneShape = "Shape" oneText = "Text" pages = "Pages" runOcr = "Run OCR" scanHint_one = "This page is a scanned image with no text to edit. Run OCR first to make its text editable." scanHint_other = "{{count}} pages are scanned images with no text to edit. Run OCR first to make their text editable." scannedText = "Scanned text · changed words are covered and redrawn in a matching font." tabDocument = "Document" tabSelected = "Selected" textBoxes = "Text boxes" width = "Width" widthHint = "Text re-wraps to fit the width." x = "X" y = "Y" [pdfTextEditor.mobile] actions = "Editor actions" addImage = "Image" addText = "Text" cancel = "Cancel" delete = "Delete" details = "Details" document = "Document" done = "Done" download = "Save and download" find = "Find" lock = "Lock" openPdf = "Open a PDF" panelHint = "Editing happens in the Workspace view. Tap text on the page to change it." save = "Save" style = "Style" tapToPlace = "Tap the page where the text should go" unlock = "Unlock" [pdfTextEditor.pageView] pageNumber = "Page {{page}}" renderFailed = "Failed to render page" [pdfTextEditor.password] incorrect = "Incorrect password - try again." label = "Password" [pdfTextEditor.rulers] guide = "Alignment guide at {{value}} {{unit}} - drag onto a ruler to remove" hint = "Drag from a ruler to add an alignment guide" horizontal = "Horizontal ruler" unit = "pt" vertical = "Vertical ruler" [pdfTextEditor.run] lockedTitle = "Locked - use the Unlock button to edit" [pdfTextEditor.saveRisk] cancel = "Cancel" intro = "Saving the edited copy changes the file. That means:" note = "Your edits are kept. The changes listed above are unavoidable when saving the edited copy." saveAnyway = "Save anyway" title = "Saving will change this PDF" [pdfTextEditor.settings] advanced = "Advanced" find = "Find in document" findTooltip = "Find ({{shortcut}})" view = "View" [pdfTextEditor.shape] groupedTitle = "Part of a group in this PDF: it can be deleted but not moved." [pdfTextEditor.sidebar] addImage = "Add image" addTable = "Add table" addText = "Add text" clickPageToAddTable = "Click page to add a table" clickPageToAddText = "Click page to add text" document = "Document" group = "Group" groupingAuto = "Auto" groupingAutoHint = "Groups equal-spaced lines into paragraphs. Changing this re-reads the document and clears undo history." groupingLine = "Line" groupTooltip = "Merge selected runs into one paragraph ({{shortcut}})" groupTooltipDisabled = "Select 2+ runs to merge" image = "Image" noFile = "No file loaded" noFileHint = "Pick a PDF from the Files panel on the left, or drop one in. The editor will open it automatically." opening = "Opening document..." paragraph = "Paragraph" rulers = "Rulers and guides" table = "Table" text = "Text" textBoxWidth = "New text box width" textGrouping = "Text grouping" ungroup = "Ungroup" ungroupTooltip = "Split this paragraph into one run per line" ungroupTooltipDisabled = "Select a multi-line paragraph to ungroup" widthGrow = "Grow" widthGrowHint = "Grow widens a box as you type; Wrap keeps its width and flows onto new lines." widthWrap = "Wrap" [pdfTextEditor.spellcheck] auto = "Automatic" enable = "Check spelling as you type" language = "Dictionary language" [pdfTextEditor.stage] loadingDocument = "Loading document" loadingProgress = "Loading progress" noDocument = "No document loaded." pickPrompt = "Pick a PDF from the Files panel on the left to begin editing." renderingPreview = "Rendering preview" [pdfTextEditor.table] addColumn = "Add column" addRow = "Add row" column = "Col" deleteColumn = "Delete column" deleteRow = "Delete row" done = "Done" doneHint = "Stop editing this as a table" edit = "Edit" editHint = "Edit as a table - type in cells, add or remove rows and columns" move = "Move" moveTable = "Drag to move the whole table" recognizedHint = "Recognized table - click to select all its text" resizeColumn = "Drag to resize this column (Alt: share with the next)" resizeRow = "Drag to resize this row (Alt: share with the next)" resizeTable = "Drag to resize the whole table" row = "Row" [pdfTextEditor.toolbar] addTextTooltip = "Add a text box - then click the page" advancedColour = "Advanced colour" advancedColourTooltip = "Advanced colour (glyph outline)" alignBottom = "Align bottom" alignCentre = "Align centre" alignLabel = "Align · needs 2+ objects" alignLeft = "Align left" alignMiddle = "Align middle" alignRight = "Align right" alignTop = "Align top" arrange = "Arrange" bringForward = "Bring forward" bringToFront = "Bring to front" caseLower = "lowercase" caseSentence = "Sentence case" caseTitle = "Title Case" caseUpper = "UPPERCASE" changeCase = "Change case" changeCaseTooltip = "Change case (text runs only)" delete = "Delete selected" deleteTooltip = "Delete (Del or Backspace)" distributeHorizontally = "Distribute horizontally" distributeLabel = "Distribute · needs 3+ objects" distributeVertically = "Distribute vertically" editImageExternally = "Edit in another app" flipHorizontal = "Flip horizontal" flipVertical = "Flip vertical" fontColour = "Font colour" fontSize = "Font size" formatting = "Text formatting" italic = "Italic" italicUnavailable = "This font has no italic version. Load your device fonts or pick another font family." lock = "Lock selection" lockTooltip = "Lock selection - prevents accidental edits" more = "More actions" order = "Order" outlineColour = "Outline colour" outlineWidth = "Outline width (0 = none)" redo = "Redo" redoTooltip = "Redo ({{shortcut}})" replaceImage = "Replace, keeping placement" rotateLeft = "Rotate 90° left" rotateRight = "Rotate 90° right" sendBackward = "Send backward" sendToBack = "Send to back" undo = "Undo" undoTooltip = "Undo ({{shortcut}})" unlock = "Unlock selection" unlockTooltip = "Unlock selection - makes it editable again" [pdfTextEditor.tooltip.alpha] text = "This alpha viewer is still evolving-certain fonts, colors, transparency effects, and layout details may shift slightly. Please double-check the generated PDF before sharing." title = "Alpha Viewer" [pdfTextEditor.tooltip.header] title = "Preview Limitations" [pdfTextEditor.tooltip.previewVariance] text = "Some visuals (such as table borders, shapes, or annotation appearances) may not display exactly in the preview. The exported PDF keeps the original drawing commands whenever possible." title = "Preview Variance" [pdfTextEditor.tooltip.textFocus] text = "This workspace focuses on editing text and repositioning embedded images. Complex page artwork, form widgets, and layered graphics are preserved for export but are not fully editable here." title = "Text and Image Focus" [pdfTextEditor.zoom] fit = "Fit" fitToWidth = "Fit to width" in = "Zoom in" out = "Zoom out" reset = "Reset zoom to 100%" [PDFToCSV] header = "PDF to CSV" title = "PDF to CSV" [PDFToHTML] header = "PDF to HTML" tags = "web content,browser friendly" title = "PDF to HTML" [pdfToImage] tags = "conversion,img,jpg,picture,photo" title = "PDF to Image" [PDFToMarkdown] header = "PDF To Markdown" tags = "markup,web-content,transformation,convert,md" title = "PDF To Markdown" [pdfToPDFA] header = "PDF To PDF/A" tags = "archive,long-term,standard,conversion,storage,preservation" title = "PDF To PDF/A" [pdfToPDFUA] header = "PDF To PDF/UA" tags = "accessibility,accessible,tagged,screen reader,wcag,eaa,section 508,conversion" title = "PDF To PDF/UA" [pdfToPDFX] tags = "print,standard,conversion,production,prepress,archive" title = "PDF To PDF/X" [PDFToPresentation] header = "PDF to Presentation" tags = "slides,show,office,microsoft" title = "PDF to Presentation" [PdfToSinglePage] tags = "single page" [pdfToSinglePage] 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." submit = "Convert To Single Page" tags = "combine,merge,single,single page,one page,merge to single,combine all,stitch pages,concatenate vertical,long page,poster" title = "PDF To Single Page" [pdfToSinglePage.error] failed = "An error occurred while converting to single page." [pdfToSinglePage.results] title = "Single Page Results" [PDFToText] header = "PDF to RTF (Text)" tags = "richformat,richtextformat,rich text format" title = "PDF to RTF (Text)" [PDFToWord] header = "PDF to Word" tags = "doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile" title = "PDF to Word" [PDFToXLSX] header = "PDF to Excel" tags = "spreadsheet,excel,xlsx,table,extract,convert" title = "PDF to Excel (XLSX)" [PDFToXML] header = "PDF to XML" tags = "data-extraction,structured-content,interop,transformation,convert" title = "PDF to XML" [permissions] tags = "read,write,edit,print" title = "Change Permissions" [pipeline] tags = "automate,sequence,scripted,batch-process" title = "Pipeline" [plan] contact = "Contact Us" current = "Current Plan" featureComparison = "Feature Comparison" fetchError = "Failed to fetch pricing data" from = "From" hideComparison = "Hide Feature Comparison" licensedSeats = "Licensed: {{count}} seats" manage = "Manage" perMonth = "/month" perSeat = "/seat" popular = "Popular" selectPlan = "Select Plan" showComparison = "Compare All Features" upgrade = "Upgrade" withServer = "+ Team plan" [plan.api] large = "5,000 Credits" medium = "1,000 Credits" perCredit = "{{price}} per credit" perCreditWithDiscount = "{{price}} per credit • {{discount}}% discount" small = "500 Credits" xsmall = "100 Credits" [plan.availablePlans] currency = "Billing currency" subtitle = "Choose the plan that fits your needs" title = "Available Plans" [plan.enterprise] highlight1 = "Custom pricing" highlight2 = "Dedicated support" highlight3 = "Latest features" name = "Enterprise" requiresServer = "Requires Team plan" requiresServerMessage = "Please upgrade to the Team plan first before upgrading to Enterprise." [plan.feature] api = "API Access" automation = "Automate tool workflows" customPricing = "Custom Pricing" fileSize = "File Size Limit" pdfTools = "Basic PDF Tools" priority = "Priority Support" title = "Feature" [plan.features] allPdfOperations = "All PDF operations" auditing = "Auditing" communitySupport = "Community support" customPdfMetadata = "Custom PDF metadata" editingTextInPdfs = "Editing text in pdfs" externalDatabase = "External Database" googleDriveIntegration = "Google drive integration" prometheusSupport = "Prometheus Support" regularUpdates = "Regular updates" saml = "SAML" secureLoginSupport = "Secure Login Support" selfHostedDeployment = "Self-hosted deployment" sso = "SSO (OAuth2/OIDC)" upToFiveUsers = "Up to 5 users" upToFiveUsersLowercase = "up to 5 users" usageTracking = "Usage tracking" usersIncluded = "100 users included" usersLimitedToSeats = "Users limited to seats" [plan.free] forever = "Forever free" highlight1 = "Limited Tool Usage Per week" highlight2 = "Access to all tools" highlight3 = "Community support" included = "Included" name = "Free" [plan.freeLimit] cta = "View Processor Plan" dismiss = "Maybe Later" message = "That's your whole free allowance for automation, AI and the API this month. Seriously impressive! It resets next month, or keep the momentum going now for just pennies a day." title = "Woah, {{total}} PDFs Processed!" [plan.highlights] advancedIntegrations = "Advanced integrations" allBasicFeatures = "All basic features" cancelAnytime = "Cancel anytime" customPdfMetadata = "Custom PDF metadata" editingTextInPdfsCaps = "Editing text in PDFs" enterpriseFeatures = "Enterprise features (SAML, Auditing)" perSeatLicensing = "Per-seat licensing" saveWithAnnualBilling = "Save with annual billing" selfHosted = "Self-hosted" selfHostedOnInfrastructure = "Self-hosted on your infrastructure" ssoOAuth = "SSO (OAuth2/OIDC)" upToFiveUsers = "Up to 5 users" usageTrackingPrometheus = "Usage tracking & Prometheus" usersIncluded = "100 users included" [plan.period] month = "month" year = "year" [plan.pro] highlight1 = "Unlimited Tool Usage" highlight2 = "Advanced PDF tools" highlight3 = "No watermarks" name = "Pro" [plan.spendCap] cta = "View Spending Limit" dismiss = "Not Now" message = "You've made the most of this month's cap. That's a load of automation, AI and API work! Bump it up whenever you like to keep going." title = "You're on a Roll!" [plan.static] activateLicense = "Activate Your License" contactToUpgrade = "Contact us to upgrade or customize your plan" getLicense = "Get the Team plan" monthlyBilling = "Monthly Billing" selectPeriod = "Select Billing Period" upgradeToEnterprise = "Upgrade to Enterprise" upTo = "Up to" yearlyBilling = "Yearly Billing" [plan.static.billingPortal] message = "You will need to verify your email address in the Stripe billing portal. Check your email for a login link." title = "Email Verification Required" [plan.static.licenseActivation] activate = "Activate License" checkoutOpened = "Checkout Opened in New Tab" doLater = "I'll do this later" enterKey = "Enter your license key below to activate your plan:" instructions = "Complete your purchase in the Stripe tab. Once your payment is complete, you will receive an email with your license key." keyDescription = "Paste the license key from your email" success = "License Activated!" successMessage = "Your license has been successfully activated. You can now close this window." [plan.team] maxUsers = "100 users" name = "Team" [policies.activity] outputsUnavailable = "Policy outputs are no longer available to download." partialOutputsUnavailable = "Some policy outputs are no longer available to download." runNotFound = "The enforcement run could no longer be found." timedOut = "Enforcement timed out before the run could finish." [policies.editorPanel] collapse = "Hide pipelines" empty = "Nothing runs on import or export yet" expand = "Show pipelines" openProcessor = "Open the PDF Processor" rowFailed = "{{label}} - last run failed" rowIdle = "{{label}} runs automatically" rowRunning = "{{label}} is running now" runsToday_one = "{{count}} run today" runsToday_other = "{{count}} runs today" title = "PDF Processor" triggerExport = "Runs on export" triggerImport = "Runs on import" [policies.enforcement] applying = "Applying {{names}}" applyingProgress = "Applying {{names}} ({{done}} of {{total}})" exportFailureBody = "Security policies couldn't be applied. Files were exported as-is." exportFailureTitle = "Exported without enforcement" failureBody = "Some policies couldn't be applied to {{failures}} of {{total}} file(s)." failureTitle = "Exported without full enforcement" printPolicyAppliedBody = "This PDF was updated to meet a policy. Review the changes, then print again." printPolicyAppliedTitle = "Policy applied before printing" successTitle = "{{names}} applied" summaryMore = "{{first}}, {{second}} and {{more}} more" summaryTwo = "{{first}} and {{second}}" [policies.labels] categoryCount = "categories" hideCategory = "Hide category" labelCount = "labels" sharedNote = "These labels are built in and shared across your whole team." showCategory = "Show category" [policies.pii] account = "Account numbers (labelled)" card = "Credit / debit cards" email = "Email addresses" fieldLabel = "PII to redact" iban = "IBANs" phone = "Phone numbers" placeholder = "Select PII types" routing = "US routing numbers (ABA)" ssn = "Social Security numbers" [policy] badgeEnforcing = "{{name}} enforcing..." badgeRan = "{{name}} policy ran on this file" badgeRunning = "{{name}} running..." blockingAction = "{{action}} blocked while enforcing policy, please wait..." dismiss = "Dismiss overlay" enforcingPipelineTitle = "Enforcing pipeline..." enforcingPolicyTitle = "Enforcing policy..." exportBlocked = "A required policy failed. The export was cancelled. Try exporting again." recoveryBody = "We couldn't apply a required policy to these files. Try again, or close the affected files to continue working." recoveryClose_one = "Close file" recoveryClose_other = "Close {{count}} files" recoveryClosing_one = "Closing file..." recoveryClosing_other = "Closing {{count}} files..." recoveryContactAdmin = "Contact your administrator for help." recoveryContactOwner = "Contact {{owner}} for help." recoveryError = "The action couldn't be completed. Try again." recoveryOwnedPolicy = "Check the policy settings, then retry." recoveryRetry_one = "Retry file" recoveryRetry_other = "Retry {{count}} files" recoveryRetrying_one = "Retrying file..." recoveryRetrying_other = "Retrying {{count}} files..." recoverySummary_one = "{{count}} file affected." recoverySummary_other = "{{count}} files affected." recoveryTechnicalDetails = "Technical details" recoveryTitle = "Policy enforcement failed" viewAnyway = "View file (policy still enforcing)" [policyOption] pdfa-1 = "PDF/A-1b" pdfa-2b = "PDF/A-2b" pdfa-3b = "PDF/A-3b" [portal.accountLink] ownerRequired = "Only the org owner can link or unlink this server." [portal.accountLink.card] billingNote = "This server shares your team’s processing allowance in ZhmmCloud." connectDescription = "Connect this server to use your team’s processing allowance in ZhmmCloud." disconnectBody = "This server will stop using your team’s processing allowance in ZhmmCloud. Your local files stay on this server. To connect again, follow the original connection steps." disconnectTitle = "Disconnect this instance?" eyebrow = "This instance" linkButton = "Connect your ZhmmCloud account" loading = "Checking account connection" notLinked = "Not connected" signedInAs = "Signed in to ZhmmCloud as" statusError = "Couldn’t check the account connection" title = "ZhmmCloud" unlink = "Disconnect this instance" [portal.accountLink.card.error] title = "Couldn’t update the connection" [portal.accountLink.card.loginNotConfigured] description = "Ask your server administrator to enable the connection to ZhmmCloud." title = "Account connection unavailable" [portal.accountLink.connect] adminRequired = "Ask your server administrator to open Usage & billing and link a ZhmmCloud account for more monthly credits. Manual PDF tools are still available." adminTitle = "Ask your server administrator" close = "Close" copied = "Copied" copyAdminMessage = "Copy message for administrator" exhaustedLede = "This server has used its free credits for the month. Link a new or existing ZhmmCloud account to access your team’s monthly allowance." notNow = "Not now" start = "Connect ZhmmCloud account" step = "Step {{current}} of {{total}}" [portal.accountLink.connect.benefits] billingDetail = "Manage usage, billing and linked servers together" billingLabel = "One account" creditsDetail = "Access your team’s free monthly allowance" creditsLabel = "Monthly credits" processingDetail = "Buy more credits for API, AI and automation as you grow" processingLabel = "More processing" teamsDetail = "Add more users with a paid Team plan" teamsLabel = "Larger teams" [portal.accountLink.connect.callback] linkedNotSignedIn = "You are not signed in to ZhmmCloud in this browser, so usage and billing will ask you to sign in." retry = "Try again" signedInAnyway = "You are signed in to ZhmmCloud, so billing and usage will load. Only the server link is incomplete." working = "Finishing the connection." [portal.accountLink.connect.callback.expired] body = "Connection requests are short lived. Start another one." title = "Request expired" [portal.accountLink.connect.callback.malformed] body = "This page was opened without a valid connection response. Start the connection from settings." title = "Could not read the response" [portal.accountLink.connect.callback.rejected] body = "This request was declined or has already been used. Start another one if that was not intended." title = "Connection not completed" [portal.accountLink.connect.callback.unfinished] body = "ZhmmCloud did not confirm the connection. This is usually temporary." title = "Not finished yet" [portal.accountLink.connect.done] accountLabel = "Account" addPolicy = "Add a policy" buildPipeline = "Set up a pipeline" creditsBarLabel = "Free credits remaining" creditsSuffix = "of {{allowance}} free credits left" cta = "Done" inviteTeam = "Invite your team" lede = "This server now runs against your ZhmmCloud account." pendingTitle = "Almost there" switchOnProcessor = "Switch on the Processor" title = "Connected" [portal.accountLink.connect.handoff] opening = "Opening ZhmmCloud sign-in..." reauthLede = "Your ZhmmCloud session expired. Signing in again keeps usage and billing visible. This server stays connected either way." title = "Connecting" [portal.accountLink.connectionNotice] expiredBody = "This server has not reached ZhmmCloud within its offline allowance. Cloud-backed Team features and Processor work are paused. Existing data and installed licence rights are preserved. Access returns automatically after a successful connection confirms your plan." expiredTitle = "Cloud access paused" offlineBody = "Your last confirmed plan remains available until {{deadline}}. Restore this server’s connection before then to avoid pausing cloud-backed features and processing." offlineTitle = "ZhmmCloud is unreachable" retry = "Check connection" revokedBody = "ZhmmCloud rejected this account connection. Reconnect the account in Settings to restore eligible cloud-backed features." revokedTitle = "Account connection revoked" [portal.accountLink.failure] automatic = "Pipeline “{{pipeline}}” stopped during an automatic run because this server is out of credits." export = "Pipeline “{{pipeline}}” stopped before download because this server is out of credits." manage = "Open pipeline settings" manual = "Pipeline “{{pipeline}}” stopped when you ran it because this server is out of credits." openFailed = "Open the Processor on your connected server to manage this pipeline." pipeline = "Pipeline" upload = "Pipeline “{{pipeline}}” stopped after upload because this server is out of credits." [portal.accountLink.gate] retry = "Try again" [portal.accountLink.instances] unnamed = "Unnamed instance" [portal.accountLink.instances.empty] description = "Connect a self-hosted server to your team to see it here." otherDescription = "This is the only connected instance shown for your team." otherTitle = "No other connected instances" title = "No connected instances" [portal.accountLink.modal] callbackMismatch = "This server's configured frontend address does not match the address you opened. Open the server at its configured address, or update Frontend URL in General settings, then try again." cancel = "Cancel" continueReauth = "Sign in again" exhaustedTitle = "Keep your workflows running" identity = "ZhmmCloud account" linkTitle = "Connect your ZhmmCloud account" noAuthorizeUrl = "ZhmmCloud did not return somewhere to continue. Try again in a moment." startFailed = "Could not reach ZhmmCloud to start the connection. Check this server's outbound network access, then try again." transferPending = "An ownership transfer is pending. Go to Settings → Users to finish or cancel it, then try linking again." [portal.accountLink.modal.loginNotConfigured] after = "so this server can finish the connection when you come back." and = "and" before = "Set" title = "ZhmmCloud connection not configured" [portal.accountLink.notice] loadFailed = "The account linking dialog could not be loaded." openFailed = "Could not open your browser. Open Usage & billing on your connected server to link an account." [portal.accountLink.panel] instancesSub = "Self-hosted servers connected to the same team." instancesTitle = "Connected instances" manageCloud = "Manage on zhmmcloud.com" otherInstancesSub = "Other self-hosted servers connected to the same team in ZhmmCloud." otherInstancesTitle = "Other connected instances" revokeError = "Couldn't revoke instance" sessionRequired = "Connected instances will appear after you renew billing access." sub = "Manage this server’s connection to your ZhmmCloud account." [portal.accountLink.panel.loadError] forbidden = "Only the team owner can manage connected instances." generic = "Your connections could not be checked. Try again." title = "Couldn’t load connected instances" [portal.accountLink.pipelines] editorExport = "Editor · before download" editorUpload = "Editor · on upload" empty = "No active pipelines." loadFailed = "Could not load pipelines. Open pipeline settings to try again." loading = "Loading pipelines…" manual = "Manual runs" paused = "Paused" required = "Required policy · manage in pipeline settings" saveFailed = "Could not change this pipeline. Open pipeline settings to review it." title = "Active pipelines" triggered = "Triggered this prompt" viewAll = "View all pipelines" [portal.accountLink.rail] adminCta = "How to get more credits" adminSub = "Ask your server administrator to link a ZhmmCloud account for more credits. Manual PDF tools are still available." exhaustedCta = "Link account for more credits" exhaustedSub = "Link for monthly credits, shared billing and the option to grow with a Team plan." exhaustedTitle = "This server’s free credits are used up" [portal.accountLink.renewal] dataUnavailable = "Your plan and usage will appear after you renew billing access. This server stays connected, and local document processing remains available." expired = "This sign-in request expired. Try again to renew billing access; your server is still connected." expiredTitle = "Sign-in request expired" incomplete = "This server is still connected, but we could not restore billing access in this browser. Try signing in again." malformed = "We could not verify this sign-in response. Start again from Usage & billing; your server is still connected." malformedTitle = "Could not verify sign-in" rejected = "This sign-in request was declined or has already been used. Try again to renew billing access." rejectedTitle = "Sign-in not completed" retry = "ZhmmCloud could not finish renewing billing access. Try again in a moment; your server is still connected." retryTitle = "Billing access not restored" success = "Your billing access has been renewed. This server is still connected to the same ZhmmCloud account." title = "Renew billing access" working = "Restoring billing access." [portal.accountLink.state] free = "Editor plan" subscribed = "Processor plan" unlinked = "Not linked" [portal.assistant] close = "Close assistant" error = "Couldn't reach the assistant." errorWithDetail = "Couldn't reach the assistant: {{detail}}" inputAriaLabel = "Ask the assistant" inputPlaceholder = "Ask about ZhmmCloud…" open = "Open assistant" send = "Send" title = "Assistant" tryAsking = "Try asking" typing = "Typing" [portal.auth] loading = "Loading" redirectingToEditor = "Redirecting to the editor..." [portal.billing] dataUnavailable = "Usage figures are currently unavailable." [portal.billing.activation] maybeLater = "Maybe later" title = "Switch on the Processor" [portal.billing.activation.payg] sub = "Set a monthly limit. Pay for what you run." title = "Pay as you go" [portal.billing.activation.prepay] badge = "2 months free" sub = "One invoice, card or bank transfer." title = "Prepay a year" [portal.billing.checkout] noClientSecret = "Edge function returned no client_secret." title = "Add a payment method" [portal.billing.checkout.activationSlow] body = "Your payment succeeded, but activation is taking a little longer than usual. It'll switch on automatically - close this and it'll appear here shortly." close = "Close" title = "Almost there" [portal.billing.checkout.cap] amountAria = "Monthly spend limit" continue = "Continue to payment" error = "Couldn't set your spend limit" title = "Set your spend limit" [portal.billing.checkout.card] fields = "Card number · MM / YY · CVC · ZIP" label = "Card details" note = "Card details collected by Stripe. ZhmmCloud never stores PAN or CVC." [portal.billing.checkout.error] title = "Couldn't start checkout" [portal.billing.checkout.finalizing] body = "Your payment went through. We're switching on metered processing across your linked instances - this usually takes a few seconds." hint = "Please keep this window open." title = "Activating your Processor plan..." [portal.billing.checkout.pay] limit = "Monthly spend limit {{amount}}/mo. Processing pauses at the limit." limitNoCap = "No spend limit. Processing won't pause. Invoices post monthly." [portal.billing.chip] plan = "Plan" procurement = "Procurement" usage = "Usage" [portal.billing.compare] current = "Current" enterpriseData = "Data residency and SCIM" enterpriseName = "Enterprise" enterprisePrice = "Under your agreement" enterpriseProcessing = "Metered or flat" enterpriseSignIn = "SAML and auditing" enterpriseSupport = "Uptime SLAs, deployment help" enterpriseUsers = "No ceiling" enterpriseWhere = "Plus multi-node and air-gapped" exploreEnterprise = "Explore Enterprise" freeData = "Stays where you run it" freeName = "Free" freePrice = "No card, no expiry" freeProcessing = "{{allowance}} credits a month" freeProcessingUnknown = "A monthly credit allowance" freeSignIn = "Email, Google and SSO" freeSignInNote = "OAuth2/OIDC" freeSupport = "Community" freeUsers = "Up to {{users}}" freeUsersUnknown = "A small team" freeWhere = "Cloud, desktop or self-hosted" lede = "Every plan includes every PDF tool and SSO. What changes is how many people use it, where it runs, and what support you get." open = "Compare plans" rowData = "Your data" rowHeader = "Feature" rowProcessing = "Processing" rowSignIn = "Sign-in" rowSupport = "Support" rowUsers = "Users" rowWhere = "Where it runs" teamData = "Google Drive, your own database" teamName = "Team" teamPrice = "$99/mo per 100 users" teamProcessing = "{{allowance}} a month, then metered" teamProcessingUnknown = "A larger allowance, then metered" teamSignIn = "The same" teamSupport = "Email" teamUsers = "100 per block" teamWhere = "Cloud, desktop or self-hosted" title = "Compare plans" upgradeTeam = "Upgrade to Team" [portal.billing.cycle] credits = "Credits" creditsNote = "{{units}} used · includes free and prepaid credits" day = "Day {{day}} of {{of}}" editors = "Editors deployed" estimated = "estimated · the meter settles at close" estimatedPending = "estimated · includes {{pending}} not yet synced from your instances" pdfs = "PDFs processed" users = "Users" [portal.billing.enterprise] active = "Agreement active through {{date}}" cta = "Get an enterprise quote" included = "Included in Enterprise" payment_pending = "Payment pending · access through {{date}}" pdfsAgreed = "{{used}} / {{agreed}} PDFs" pdfsOver_one = "{{count}} PDF over agreed volume" pdfsOver_other = "{{count}} PDFs over agreed volume" pdfsUsed_one = "{{count}} PDF processed" pdfsUsed_other = "{{count}} PDFs processed" period = "Agreement period: {{start}} – {{end}}" sub = "Air-gapped deployment, SCIM, data residency, uptime SLAs, and an agreement to match." title = "Running ZhmmCloud in a regulated environment?" trial = "{{days}}-day trial · ends {{date}}" usersAgreed = "{{used}} / {{agreed}} agreed users" usersOver_one = "{{count}} user over agreed quantity" usersOver_other = "{{count}} users over agreed quantity" [portal.billing.freePlan] checkoutErrorTitle = "Couldn't start checkout" noTeamResolved = "No team is resolved on your wallet yet — refresh and try again." payInvoice = "Pay invoice to complete" viewQuote = "View quote" [portal.billing.identity] oauthSso = "SSO (OAuth2/OIDC)" [portal.billing.identity.free] chipAnywhere = "Web, desktop & self-hosted" chipCredits = "{{allowance}} free credits monthly" chipTools = "Every PDF tool" name = "Free" sub = "The full PDF Editor." [portal.billing.identity.processor] chipMetered = "Metered processing" chipPipelines = "Pipelines & API" name = "Processor" sub = "Team base plus {{rate}} per credit" subNoRate = "Team base plus metered processing" [portal.billing.identity.team] chipFleet = "Fleet control" chipIncluded = "{{allowance}} included credits monthly" name = "Team" sub = "Up to {{users}} users" subNoLimit = "No user limit" [portal.billing.invoiceRow] current = "Current" failed = "Unpaid" paid = "Paid" undated = "Undated" unknownAmount = "Unknown" view = "View" [portal.billing.license] add = "Add" addTitle = "Add license" empty = "No license installed" label = "License key" update = "Update" updateTitle = "Update license" view = "View" [portal.billing.payment] billedTo = "Billed to" card = "{{brand}} ending {{last4}}" cardWithExpiry = "{{brand}} ending {{last4}} · expires {{month}} / {{year}}" dateUnavailable = "Billing date not available yet" invoicesTo = "Invoices go to" method = "Payment method" nextInvoice = "Next invoice" noCard = "No card on file" update = "Update" [portal.billing.pdfsProcessed] emptyPeriod = "No processing yet this period." eyebrow = "PDFs processed this period" legendValue_one = "{{formatted}} PDFs" legendValue_other = "{{formatted}} PDFs" segbarAriaLabel = "PDFs split by category" segmentAgentsDesc = "AI agent actions" segmentAgentsLabel = "Agents" segmentApiDesc = "Direct API requests" segmentApiLabel = "API" segmentAutomationDesc = "Automations & pipelines" segmentAutomationLabel = "Automation" summary = "{{unique}} unique · {{units}} meter units · {{avg}} avg per PDF" summaryNoRate = "{{unique}} unique · {{units}} meter units" unit = "PDFs" unitsPending_one = "{{units}} meter unit pending sync from linked instances" unitsPending_other = "{{units}} meter units pending sync from linked instances" [portal.billing.prepaid.buy] back = "Back" cancel = "Cancel" cancelPurchase = "Cancel purchase" close = "Close" continueToPayment = "Continue to payment" creditTitle = "Prepay the year" finalise = "Finalise" invoiceErrorTitle = "Couldn't generate the invoice" loadingTitle = "Loading your quote" payTitle = "Pay for your year" step = "Step {{current}} of {{total}}" [portal.billing.prepaid.calc] currency = "Quote currency" currencyLocked = "Uses your existing Stripe billing currency." rateUnknown = "We'll show the exact price at checkout." [portal.billing.prepaid.consent] label = "I understand that when my prepaid capacity is used up or expires after 12 months, processing automatically continues at the standard metered pay-as-you-go rate (up to my spend limit) unless I cancel, and that I can cancel anytime from the billing portal." [portal.billing.prepaid.deploy] [portal.billing.prepaid.offer] title = "Get 12 months for the price of 10" [portal.billing.prepaid.pay] accountName = "Account holder name" accountNamePlaceholder = "e.g. Jane Smith" companyName = "Company name (optional)" companyNamePlaceholder = "e.g. Acme Inc." downloadInvoice = "Download invoice" payOnline = "Pay online" poNumber = "PO number (optional)" poNumberPlaceholder = "e.g. PO-2026-0142" [portal.billing.prepaid.pipelines] [portal.billing.prepaid.posture] [portal.billing.prepaid.review] download = "Download quote (PDF)" downloading = "Preparing…" [portal.billing.prepaid.size] [portal.billing.processor] activate = "Switch on the Processor" factFree = "{{used}} of {{allowance}} used" factNoCap = "no limit" factPrepaid = "{{remaining}} left" freeRemaining = "Free credits remaining" included = "Included in your license" includedRenewal = "{{summary}} · Renews {{date}}" meteredCapTooltip = "Pauses metered processing at your spend limit." midIncluded = "{{rate}} per credit · {{allowance}} included every month" midIncludedNoRate = "{{allowance}} included every month" midMetered = "{{spend}} metered this cycle" midMeteredUnknown = "Metered this cycle" midPrepaid = "Prepaid credits, drawn before metered billing" midPrepaidExpiry = "{{summary}} · Expires {{date}}" noSpendLimit = "No spend limit" paidUsed = "Paid metered usage" percentUsed = "{{pct}}%" prepaidExhausted = "Used up, metered billing has resumed" prepaidExpires = "Expires {{date}}" prepaidRemaining = "Prepaid credits remaining" prepaidTooltip = "Drawn before metered billing, and outside your spend limit." raiseLimit = "Raise limit" remainingOf = "{{remaining}} of {{total}}" rowName = "Processor" spendAgainstLimit = "{{spend}} of {{cap}} metered this cycle" [portal.billing.seats] awaitingSync = "Waiting for its daily sync; not yet included in the fleet total." breakdown = "Where users are counted" cloud = "ZhmmCloud" deployment = "Linked server" lastReported = "Reported {{date}}" live = "Live user count" notReported = "Not yet reported" ownerExcluded = "The required cloud team owner does not use a seat." thisServer = "This server" [portal.billing.section] cycle = "This cycle" invoices = "Invoices" payment = "Payment" plan = "Your plan" [portal.billing.serverPlan] active = "Active self-hosted license" connectBody = "Connect to add cloud processing credits. Your server license stays active." enterprise = "Enterprise" enterpriseConnectBody = "Your Enterprise license includes processing on this server. Connecting an account is optional." included = "Included with your license" seats = "{{seats}} licensed seats" server = "Server" unlimited = "Unlimited users" [portal.billing.simple] afterYear = "After the year" afterYearNote = "No automatic renewal. Further processing needs an active metered plan and stays within its spend limit." billingNote = "No standing fee. Credits bill monthly as used. Cancel any time in Usage & Billing." creditEstimate = "≈ {{credits}} credits" credits = "Credits" limit = "Spend limit · processing pauses here" limitIntro = "Cap what the Processor can bill each month." monthlyAmount = "{{amount}}/mo" prepayDiscount = "Prepay discount · 12 for 10" prepayIntro = "A year of processing at a discount." rate = "{{rate}} each · billed as used" ratePending = "Rate shown at checkout" setLimit = "Set a spend limit" yearSize = "Year size" yearValue = "A year of processing" [portal.billing.spendLimit] adjustLimit = "Adjust limit" buyCredits = "Buy credits" cancel = "Cancel" capControlNote = "Changes apply immediately — raise or lower the ceiling any time." capSuffix = "/ month" displaySub = "You're only billed for what you process automatically — never past the ceiling." editTitle = "Set your monthly ceiling" eyebrow = "Spend limit" noCap = "no cap" pauseNote = "Metered processing pauses at your limit. PDF editing remains available." pctUsed = "{{pct}}% used" remaining = "{{amount}} remaining" save = "Save limit" saveError = "Couldn't save limit" thisPeriodUncapped = "{{amount}} this period · uncapped" usedThisMonth = "{{amount}} used this month" useSuggested = "Use suggested · {{amount}} / month" [portal.billing.spendLimit.projection] body_one = "At {{rate}}/day you reach the cap in ~{{count}} day (~{{monthEnd}} month-end). Suggested limit ~{{suggested}}." body_other = "At {{rate}}/day you reach the cap in ~{{count}} days (~{{monthEnd}} month-end). Suggested limit ~{{suggested}}." label = "Projected to exceed." [portal.billing.spendLimitModal] [portal.billing.subscribedPlan.capWarn] approachingBody = "Raise it now so automated processing never pauses." approachingTitle = "You're at {{pct}}% of your monthly spend limit" raiseLimit = "Raise limit" reachedBody = "Metered processing is paused until you raise the limit or the cycle resets. Unlimited PDF editing keeps working." reachedTitle = "Monthly spend limit reached" [portal.billing.subscribedPlan.portalError] title = "Couldn't open Stripe portal" [portal.billing.team] addCapacity = "Add capacity" fact = "{{users}} of {{licensed}} users" factNoLimit = "{{users}} users" midFree = "The Team plan covers 100 users" midFreeSelfHosted = "The free tier covers your first users" midIncluded = "Included with your Team base" midLocalCapacity = "Capacity available to this server" midPrice = "$99/mo per 100 users" rowName = "Users" [portal.components.billingUnit] approval = "approval" check = "check" event = "event" render = "render" review = "review" session = "session" signature = "signature" [portal.components.maturity] beta = "Beta" ga = "GA" [portal.connections] createTitle = "New connection" createTitleFor = "Connect {{name}}" delete = "Delete" edit = "Edit" editTitle = "Edit connection" unsupportedType = "This connection type cannot be edited here." [portal.connections.categories.advanced] description = "For a service we do not support yet." label = "Advanced" [portal.connections.categories.audit] description = "Record what happened to a document, where your auditors already look." label = "Audit & compliance logging" [portal.connections.categories.notify] description = "Tell another system that something happened." label = "Notify & workflow" [portal.connections.categories.security] description = "Scan or label a document before it moves on." label = "Security & classification" [portal.connections.categories.signing] description = "Send a document out to be signed or notarized." label = "E-signature & notarization" [portal.connections.categories.storage] description = "Where processed documents end up - a bucket, a drive, a ticket or a page." label = "File & attach" [portal.connections.commonFields.accessToken] helperText = "ZhmmCloud stores this encrypted and never shows it again." label = "Access token" [portal.connections.commonFields.apiKey] label = "API key" [portal.connections.commonFields.apiToken] label = "API token" [portal.connections.commonFields.baseUrl] helperText = "Steps using this connection can only call paths under this URL, never another host." label = "Server URL" [portal.connections.commonFields.email] label = "Email" [portal.connections.commonFields.host] label = "Host" [portal.connections.commonFields.password] label = "Password" [portal.connections.commonFields.port] label = "Port" [portal.connections.commonFields.username] label = "Username" [portal.connections.commonFields.webhookUrl] helperText = "Paste the URL the service gave you. Only paths under it can be called." label = "Webhook URL" [portal.connections.fields] name = "Connection name" namePlaceholder = "e.g. Production" [portal.connections.picker] cancel = "Cancel" createNew = "New connection..." placeholder = "Select a connection" save = "Save connection" [portal.connections.picker2] back = "Change integration" heading = "What do you want to connect?" noResultsBody = "We do not support it yet - tell us about it and we will look at adding it." noResultsTitle = "Nothing matches \"{{query}}\"" searchPlaceholder = "Search integrations - try \"sign\", \"ocr\" or a product name" [portal.connections.types.api] description = "Call any HTTP API from a policy. You choose the URL, authentication and payload." label = "Custom API" [portal.connections.types.api.fields.authType] label = "Authentication" [portal.connections.types.api.fields.authType.options.basic] label = "Username and password" [portal.connections.types.api.fields.authType.options.bearer] label = "Bearer token" [portal.connections.types.api.fields.authType.options.header] label = "Token in a custom header" [portal.connections.types.api.fields.authType.options.none] label = "None" [portal.connections.types.api.fields.authType.options.tokenLogin] label = "Log in for a token" [portal.connections.types.api.fields.baseUrl] helperText = "Steps using this connection can only call paths under this URL, never another host." label = "Base URL" placeholder = "https://api.example.com/v1" [portal.connections.types.api.fields.headerName] label = "Header name" placeholder = "X-API-Key" [portal.connections.types.api.fields.loginPath] label = "Login path" placeholder = "/auth/login" [portal.connections.types.api.fields.password] label = "Password" [portal.connections.types.api.fields.resultUrlHosts] helperText = "If the API replies with a download link, only these hosts may be fetched. Separate with commas. Leave blank to allow only the base URL's own host." label = "Allowed result hosts" [portal.connections.types.api.fields.token] label = "Token" [portal.connections.types.api.fields.tokenHeaderName] label = "Send the token as this header" [portal.connections.types.api.fields.tokenResponseHeader] helperText = "The response header the login call returns the token in, e.g. X-Auth-Token." label = "Token response header" [portal.connections.types.api.fields.username] label = "Username" [portal.connections.types.clamav] baseUrlPlaceholder = "http://clamav-rest:9000" description = "Scan documents for malware on a server you run - nothing leaves your network." label = "ClamAV (self-hosted)" [portal.connections.types.cloudmersive] description = "Virus and content scanning for documents in a policy." label = "Cloudmersive" [portal.connections.types.cloudmersiveadvanced] description = "Block documents containing macros, executables, scripts or embedded objects - not just known malware." label = "Cloudmersive Advanced Scan" [portal.connections.types.confluence] baseUrlPlaceholder = "https://your-site.atlassian.net/wiki/api/v2" description = "Attach processed documents to a Confluence page." label = "Confluence" [portal.connections.types.consigno] description = "Send documents to ConsignO Cloud (Notarius) for electronic signature and notarization." label = "ConsignO Cloud" [portal.connections.types.consigno.fields.baseUrl] helperText = "Your ConsignO Cloud environment, including /api/v1." label = "Server URL" placeholder = "https://your-org.consignocloud.com/api/v1" [portal.connections.types.consigno.fields.clientId] label = "API key" [portal.connections.types.consigno.fields.clientSecret] label = "API secret" [portal.connections.types.consigno.fields.password] label = "Password" [portal.connections.types.consigno.fields.tenantId] helperText = "Only needed if your organisation uses tenants." label = "Tenant" [portal.connections.types.consigno.fields.username] label = "Username" [portal.connections.types.discord] baseUrlPlaceholder = "https://discord.com/api/webhooks/..." description = "Post a message to Discord when a policy processes a document." label = "Discord" [portal.connections.types.elastic] baseUrlPlaceholder = "https://your-cluster:9200" description = "Index an audit event in Elasticsearch each time a policy handles a document." label = "Elasticsearch" [portal.connections.types.ftp] description = "Poll an FTP or FTPS server for new documents." hostPlaceholder = "ftp.example.com" label = "FTP / FTPS" [portal.connections.types.ftp.fields.passive] label = "Connection mode" [portal.connections.types.ftp.fields.passive.options] active = "Active" passive = "Passive (recommended)" [portal.connections.types.ftp.fields.security] helperText = "Plain FTP sends credentials and files unencrypted; choose FTPS if the server supports it." label = "Encryption" [portal.connections.types.ftp.fields.security.options] explicit = "FTPS (explicit / AUTH TLS)" implicit = "FTPS (implicit)" none = "None (plain FTP)" [portal.connections.types.googlechat] baseUrlPlaceholder = "https://chat.googleapis.com/v1/spaces/..." description = "Post a message to a Google Chat space when a policy runs." label = "Google Chat" [portal.connections.types.jira] baseUrlPlaceholder = "https://your-site.atlassian.net" description = "Attach processed documents to a Jira issue." label = "Jira" [portal.connections.types.mailgun] description = "Email a document or a notification when a policy runs." label = "Mailgun" [portal.connections.types.n8n] baseUrlPlaceholder = "https://your-n8n/webhook/9f2c-..." description = "Hand documents to an n8n workflow, and take back whatever it produces." label = "n8n" [portal.connections.types.n8n.fields.authType] helperText = "Match the Authentication set on the n8n Webhook node." label = "Webhook authentication" [portal.connections.types.n8n.fields.authType.options.basic] label = "Basic auth" [portal.connections.types.n8n.fields.authType.options.header] label = "Header auth" [portal.connections.types.n8n.fields.authType.options.none] label = "None" [portal.connections.types.n8n.fields.headerName] helperText = "The header name from the n8n credential, not its value." label = "Header name" placeholder = "X-N8N-Key" [portal.connections.types.n8n.fields.token] label = "Header value" [portal.connections.types.nextcloud] baseUrlPlaceholder = "https://your-server/remote.php/dav" description = "File processed documents into Nextcloud." label = "Nextcloud" [portal.connections.types.nextcloud.fields.appPassword] label = "App password" [portal.connections.types.presidio] baseUrlPlaceholder = "http://presidio-analyzer:3000" description = "Detect personal data in document text using a Presidio server you run." label = "Presidio (self-hosted)" [portal.connections.types.purview] description = "Read and apply Microsoft Purview sensitivity labels on PDFs." label = "Microsoft Purview" [portal.connections.types.purview.fields.clientId] helperText = "Optional. Only needed to pick labels by name; labelling works without it." label = "Application (client) ID" [portal.connections.types.purview.fields.clientSecret] label = "Client secret" [portal.connections.types.purview.fields.tenantId] helperText = "Stamped onto every label as its SiteId, so Purview-aware tools know which organisation applied it." label = "Directory (tenant) ID" placeholder = "cb46c030-1825-4e81-a295-151c039dbf02" [portal.connections.types.s3] description = "An S3 bucket that sources can read from and pipeline outputs can write to." label = "S3 storage" [portal.connections.types.s3.fields.accessKeyId] label = "Access key ID" [portal.connections.types.s3.fields.bucket] label = "Bucket" [portal.connections.types.s3.fields.endpoint] helperText = "Leave blank for AWS. Set this for MinIO or another S3-compatible store." label = "Endpoint" [portal.connections.types.s3.fields.region] label = "Region" [portal.connections.types.s3.fields.secretAccessKey] label = "Secret access key" [portal.connections.types.sendgrid] description = "Email a document or a notification when a policy runs." label = "SendGrid" [portal.connections.types.sftp] description = "Poll an SFTP (SSH) server for new documents." hostPlaceholder = "sftp.example.com" label = "SFTP" [portal.connections.types.sftp.fields.hostKeyFingerprint] helperText = "Optional. The server's SHA-256 host key fingerprint (from `ssh-keyscan host | ssh-keygen -lf -`). When set, only a server presenting this key is accepted; when blank, the key seen on first connect is pinned and later changes are refused." label = "Host key fingerprint" placeholder = "SHA256:..." [portal.connections.types.sftp.fields.passphrase] label = "Key passphrase" [portal.connections.types.sftp.fields.password] helperText = "Leave blank if you authenticate with a private key instead." [portal.connections.types.sftp.fields.privateKey] helperText = "Optional. Paste an OpenSSH private key to authenticate with a key instead of a password." label = "Private key" [portal.connections.types.slack] description = "Post a message to Slack when a policy processes a document." label = "Slack" [portal.connections.types.smb] description = "Watch an SMB / CIFS network share (Windows or Samba)." hostPlaceholder = "fileserver.example.com" label = "SMB / Network share" [portal.connections.types.smb.fields.domain] helperText = "Optional. The Windows domain or workgroup, if your server uses one." label = "Domain" [portal.connections.types.smb.fields.share] label = "Share" placeholder = "documents" [portal.connections.types.splunk] baseUrlPlaceholder = "https://your-splunk:8088" description = "Send an audit event to Splunk each time a policy handles a document." label = "Splunk" [portal.connections.types.sumologic] baseUrlPlaceholder = "https://endpoint.collection.sumologic.com/receiver/v1/http/..." description = "Send an audit event to a Sumo Logic HTTP collector." label = "Sumo Logic" [portal.connections.types.teams] baseUrlPlaceholder = "https://your-org.webhook.office.com/webhookb2/..." description = "Post a message to a Teams channel when a policy runs." label = "Microsoft Teams" [portal.connections.types.vectordb] baseUrlPlaceholder = "https://your-database-host" description = "Index document chunks using Weaviate or Pinecone server-side embedding. Use the Weaviate server URL or Pinecone index host. Private endpoints require the operator to enable policies.allowPrivateApiEndpoints." label = "Vector database" pinecone = "Pinecone" vendor = "Database" weaviate = "Weaviate" [portal.connections.types.webhook] baseUrlPlaceholder = "https://example.com/hooks/documents" description = "Post each document, or just the details, to a URL you choose." label = "Webhook" [portal.connections.types.zapier] baseUrlPlaceholder = "https://hooks.zapier.com/hooks/catch/..." description = "Trigger a Zap or Make scenario from a policy." label = "Zapier & Make" [portal.docs] browse = "Browse docs" viewSource = "View source on GitHub" [portal.docs.authentication] codeCaption = "every request" eyebrow = "GETTING STARTED" lead = "All requests authenticate with a bearer token. Keys are scoped per environment and never expire unless rotated." liveKey = "Production keys — billed, rate-limited per your plan." testKey = "Sandbox keys — free, return synthetic fixtures." title = "Authentication" [portal.docs.components] codeCaption = "embed the viewer" eyebrow = "COMPONENTS" lead = "Embeddable UI for review queues and document inspection. Bring your own styles or use the shipped theme." title = "Drop-in viewers" [portal.docs.endpoints] eyebrow = "API REFERENCE" fieldCount_one = "{{count}} field" fieldCount_other = "{{count}} fields" filterAll = "All" filterAriaLabel = "Filter endpoints by vertical" lead = "Every document type is a typed endpoint. POST a file, receive schema-validated JSON. Filter by vertical below." title = "Endpoints" [portal.docs.errors] codeCaption = "422 Unprocessable Entity" eyebrow = "API REFERENCE" lead = "Errors return a stable machine-readable code plus a human message. The 4xx body always includes a request_id for support." title = "Errors" [portal.docs.nav] ariaLabel = "Documentation" [portal.docs.nav.empty] description = "The documentation index could not be loaded." title = "Docs unavailable" [portal.docs.quickstart] eyebrow = "GETTING STARTED" lead = "Send your first document to a typed endpoint and get structured JSON back in three steps. No model training, no prompt engineering." title = "Quickstart" [portal.docs.quickstart.callout] bodyAfterLink = "for copy-paste recipes." bodyBeforeLink = "wire the same call into a pipeline to chain validation, redaction, and delivery — or expose it to an agent over MCP. See" label = "Next:" link = "Playbooks" [portal.docs.quickstart.step1] body = "Create a scoped key from the Infrastructure tab. Keys carry rate limits and an optional IP allowlist. Export it into your shell:" title = "Issue an API key" [portal.docs.quickstart.step2] body = "POST a file to any typed endpoint. The endpoint determines the schema you get back — here, the invoice extractor." snippetCaption = "extract an invoice" title = "Send a document" [portal.docs.quickstart.step3] body = "Every response is validated against the endpoint schema, with a confidence score and per-field provenance." codeCaption = "200 OK" title = "Read the structured result" [portal.docs.rateLimits] burst = "Burst" codeCaption = "429 Too Many Requests" concurrency = "Concurrency" eyebrow = "GETTING STARTED" lead = "Limits scale with your plan. A 429 response includes a Retry-After header; the SDKs back off automatically." requestsPerMinute = "Requests / minute" title = "Rate limits & quotas" [portal.docs.recipes] cloneButton = "Clone recipe" eyebrow = "PLAYBOOKS" lead = "End-to-end patterns that chain sources, operations, and destinations. Each maps to a pipeline you can clone." title = "Recipes" [portal.docs.sdks] eyebrow = "SDKS" lead = "First-party clients with typed responses, automatic retries, and streaming uploads. All track the same endpoint catalogue." title = "Official SDKs" [portal.docs.sdks.status] beta = "Beta" deprecated = "Deprecated" [portal.docs.skills] eyebrow = "SKILLS" lead = "Bundled, named capabilities your agent invokes as a single tool. Each skill is a deterministic op chain with evals attached." title = "Agent skills" [portal.docs.toc] title = "On this page" [portal.docs.webhooks] codeCaption = "document.processed" eyebrow = "API REFERENCE" lead = "Subscribe to document.processed, pipeline.completed, and quota.threshold events. Payloads are signed with HMAC-SHA256." title = "Webhooks" [portal.docs.webhooks.callout] afterHelper = "helper." beforeHelper = "header against your signing secret before trusting a payload. SDKs ship a" beforeSignature = "Verify the" [portal.documents] exportCsv = "Export CSV" search = "Search by filename, ID..." subtitle = "Every document your org has processed, with its full processing record. Content access is request-gated." title = "Documents" [portal.documents.audit] approved = "Approved" archived = "Archived" elevation = "Elevation" empty = "No events recorded yet." extracted = "Processed" flagged = "Needs Review" ingested = "Ingested" reviewed = "In Review" [portal.documents.drawer] sectionsAriaLabel = "Document detail sections" [portal.documents.drawer.tabs] audit = "Audit" extractions = "Extractions" overview = "Overview" [portal.documents.elevation] requestAccess = "Request access" [portal.documents.elevation.active] description = "Temporary grant — access is logged and time-boxed." descriptionFourEyes = "Temporary grant — a peer reviewer was notified (four-eyes)." title = "Access expires in {{time}}" [portal.documents.elevation.gated] description = "Content is gated by zero-standing-access. Requesting starts a time-boxed grant." descriptionFourEyes = "Content is gated by zero-standing-access. Requesting starts a time-boxed grant and notifies a peer reviewer (four-eyes)." title = "Sensitive document" [portal.documents.extractions] empty = "No fields were extracted from this document." masked = "Extracted fields are hidden. Request timed access to view this document's content." [portal.documents.extractions.columns] confidence = "Confidence" field = "Field" value = "Value" [portal.documents.filters] all = "All" ariaLabel = "Filter documents by status" flagged = "Flagged" inReview = "In review" processed = "Processed" [portal.documents.overview] action = "Pipeline / Action" product = "Product" received = "Time" status = "Status" type = "Type" user = "User" [portal.documents.queue.empty] connectSource = "Connect a source" createPipeline = "Create a pipeline" description = "As sources feed documents into your pipelines they'll appear here for review." title = "No documents in the queue" [portal.documents.status] error = "Error" flagged = "Needs Review" inReview = "In Review" processed = "Processed" [portal.documents.table] auto = "Auto" editorAction = "Editor" empty = "No documents match this filter." rowActions = "Row actions" sensitiveLabel = "Sensitive" [portal.documents.table.columns] action = "Pipeline / Action" document = "Document" labels = "Labels" product = "Product" status = "Status" time = "Time" user = "User" [portal.errorBoundary] description = "This view hit an unexpected error. Try again, or pick another section from the sidebar." retry = "Try again" title = "Something went wrong on this page" [portal.failures] closedBySystem = "ZhmmCloud" noMatches = "Nothing matches the current filters" occurrences = "{{count}} occurrences" searchPlaceholder = "Search issues, users and errors" [portal.failures.action] acknowledge = "Acknowledge" decrypt = "Unlock" dismiss = "Dismiss" openInTool = "Retry" repair = "Repair" viewFile = "View file" viewInProcessor = "View in processor" [portal.failures.columns] closedBy = "Closed by" date = "Date" failure = "Issue" origin = "Raised in" outcome = "Outcome" source = "Source" user = "User" [portal.failures.disabled] closed = "This failure is already closed." noDocument = "This failure was not recorded against a specific document, so there is nothing here to open." unattended = "This file was fed by a folder, bucket or webhook, so nobody's browser is holding it to open." unavailable = "Not available for this failure." [portal.failures.empty] description = "Anything from a policy run or an editor tool that needs a look will appear here." title = "Nothing needs your attention" [portal.failures.emptyClosed] description = "Items you dismiss or resolve are kept here with their outcome." title = "Nothing closed yet" [portal.failures.filters] origin = "Raised in" source = "Source" type = "Type" user = "User" [portal.failures.kind.complianceNotMet] description = "The compliance check refused this document because it does not meet the standard the policy validates against. The violation is shown below." title = "Compliance standard not met" [portal.failures.kind.inputCorrupted] description = "Your file is damaged, so the run could not read it." title = "Damaged document" [portal.failures.kind.inputEmpty] description = "Your file has no content in it, so there was nothing for the run to work on." title = "Empty file" [portal.failures.kind.inputPasswordProtected] description = "Your file is password protected, so the run could not read it." title = "Password-protected document" [portal.failures.kind.inputUnavailable] description = "The file behind this run could not be reached, so it was never processed." title = "File unavailable" [portal.failures.kind.inputUnreadable] description = "Your file could not be opened, so the run could not read it." title = "Unreadable file" [portal.failures.kind.inputUnrepairable] description = "Your file is damaged beyond what the repair tools can fix." title = "File could not be repaired" [portal.failures.kind.inputWrongType] description = "Your file is not a format this step can open, so the run could not read it." title = "Wrong file type" [portal.failures.kind.sourceUnreadable] description = "Your smart folder could not be read, so nothing in it was processed." title = "Folder could not be read" [portal.failures.kind.stepCannotRenderPage] description = "A page in your file could not be drawn, so the run could not finish." title = "Page could not be rendered" [portal.failures.kind.stepInterrupted] description = "This step was stopped before it finished, so your file was not processed. Running it again usually works." title = "Step was interrupted" [portal.failures.kind.stepMisconfigured] description = "This step's settings are not valid, so it could not run on any file. Edit the step to fix them." title = "Step settings are invalid" [portal.failures.kind.stepPageTooLarge] description = "A page in your file could not be rendered at the requested resolution. Lower the DPI in the step, or split the file." title = "Page too large to render" [portal.failures.kind.stepToolFailed] description = "A tool this step relies on could not process your file." title = "Tool could not process the file" [portal.failures.kind.toolNotInstalled] description = "This server is missing software the step needs, so the run could not start it." title = "Software not installed" [portal.failures.kind.unknown] description = "Something went wrong that ZhmmCloud does not recognise yet." title = "Unrecognised issue" [portal.failures.log] copy = "Copy error" view = "View error" [portal.failures.origin] pipeline = "Pipeline" policy = "Policy run" tool = "Editor tool" [portal.failures.outcome] dismissed = "Dismissed" fileRemoved = "File deleted" open = "Open" resolved = "Resolved" [portal.failures.scope] ariaLabel = "Review state" closed = "Closed" open = "Open" [portal.failures.source] editor = "Editor" [portal.failures.unavailable] description = "This queue is visible to team leaders on workspaces that run policies." title = "Nothing to review" [portal.home.download] back = "Back" body = "Download the desktop app or self-host the server." done = "Done" guide = "Open the {{name}} guide" openInBrowser = "Open in browser instead" sectionDesktop = "Desktop app" sectionSelfHosted = "Self-hosted" title = "Install the ZhmmCloud PDF Editor" [portal.home.download.docker] detailBody = "Run the official image on your server." note = "Opens at :8080. Default login: admin / admin." tagline = "Run the server in a container" title = "Docker" variantFat = "Fat" variantLite = "Ultra-Lite" variantStandard = "Standard" [portal.home.download.kubernetes] detailBody = "Install the official Helm chart." note = "Add a PVC for /configs to persist settings." tagline = "Deploy to a cluster with Helm" title = "Kubernetes" [portal.home.download.linux] detailBody = "Native builds for your distribution." downloadAppImage = "AppImage" downloadDeb = "Download .deb (Debian, Ubuntu)" downloadRpm = ".rpm (Fedora, RHEL)" note = "64-bit x86 builds. AppImage runs on most other distros." tagline = "Native desktop app for your distro" title = "Linux" [portal.home.download.mac] altLabel = "Or via Homebrew" detailBody = "Run the installer, or use Homebrew." downloadBtn = "Download for macOS" tagline = "Native app for Apple silicon and Intel" title = "macOS" [portal.home.download.manual] detailBody = "Run the .jar on a bare metal server." downloadBtn = "Download the .jar" note = "Requires Java 21+. Opens at :8080; default login admin / admin." runLabel = "Then run it" tagline = "Run the .jar on a bare metal server" title = "Manual server setup" [portal.home.download.windows] altLabel = "Or via winget" detailBody = "Run the installer, or use a package manager." downloadBtn = "Download installer" tagline = "Native app for Microsoft Windows" title = "Windows" [portal.home.editor] activeOfDeployed = "{{active}} of {{total}} active in the last 30 days" name = "PDF Editor" open = "Open in browser" updated = "updated {{time}}" [portal.home.editor.deploy] finish = "Finish deployment" options = "View deployment options" start = "Deploy the Editor" [portal.home.editor.target] cloud = "Managed Cloud" docker = "Self-hosted · Docker" kubernetes = "Self-hosted · Kubernetes" [portal.home.greeting] afternoon = "Good afternoon" evening = "Good evening" morning = "Good morning" [portal.infrastructure.apiKeys] createKey = "Create key" heading = "API keys" subheading = "Personal credentials, each with its own usage tracking." [portal.infrastructure.apiKeys.card] created = "Created" lastUsed = "Last used" revoke = "Revoke key" usageMonth = "Usage this month" usageToday = "Usage today" [portal.infrastructure.apiKeys.empty] description = "Create a key to start calling the ZhmmCloud API." title = "No API keys yet" [portal.infrastructure.apiKeys.error] load = "Couldn't load your API keys. Please try again." [portal.infrastructure.apiKeys.revoke] body = "Revoke \"{{name}}\"? Any integration still using this key will immediately start receiving 401 errors. This can't be undone." cancel = "Cancel" confirm = "Revoke key" title = "Revoke API key" [portal.infrastructure.audit] filterAriaLabel = "Filter audit events by category" heading = "Audit logs" latencyValue = "{{value}} ms" noEventsInCategory = "No events in this category." subheading = "Every authentication, configuration, and processing event across your workspace." [portal.infrastructure.audit.columns] actor = "Actor" event = "Event" latency = "Latency" status = "Status" target = "Resource" timestamp = "Timestamp" [portal.infrastructure.audit.empty] description = "Workspace activity will appear here as it happens." title = "No audit events" [portal.infrastructure.audit.export] cancel = "Cancel" error = "Export failed. Please try again." exportButton = "Export" exporting = "Exporting…" fieldsLegend = "Columns" format = "Format" open = "Export" subtitle = "Download audit events as CSV or JSON. Choose which columns to include." title = "Export audit log" [portal.infrastructure.audit.export.fields] date = "Date" documentName = "Document name" ipAddress = "IP address" outcome = "Outcome" tool = "Tool" username = "Username" [portal.infrastructure.audit.filters] all = "All" auth = "Auth" config = "Config" elevation = "Elevation" policy = "Policy" processing = "Processing" security = "Security" [portal.infrastructure.audit.forbidden] description = "The audit log is available to team leads and admins. Ask your team lead or an admin for access." title = "You don't have access" [portal.infrastructure.audit.metrics] config = "Config" policy = "Policy" processing = "Processing" totalEvents = "Total events · 24h" [portal.infrastructure.auditCatLabel] auth = "Auth" config = "Config" elevation = "Elevation" policy = "Policy" processing = "Processing" security = "Security" [portal.infrastructure.auditStatusLabel] danger = "Error" info = "Info" success = "Success" warning = "Warning" [portal.infrastructure.createKey] cancel = "Cancel" createKey = "Create key" done = "Done" keyNameLabel = "Key name" keyNamePlaceholder = "e.g. Production ingest" secretKeyCaption = "Secret key" secretWarning = "Store this in a secrets manager. ZhmmCloud only ever stores a hash, so there is no way to recover it later." subtitle = "Give the key a name so you can recognise it later. You can revoke it at any time." subtitleCreated = "Copy this secret now — it won't be shown again." title = "Create API key" titleCreated = "Key created" [portal.infrastructure.encryption] heading = "Encryption at rest" hintLabel = "More about this section" subheading = "Stored files are encrypted before they reach disk, the database or object storage." unknown = "Unknown" [portal.infrastructure.encryption.auditNotice] description = "Encryption is active on this licence, but encrypt, decrypt, revocation and export events are not written to the audit trail. Encryption itself is unaffected." title = "Audit events need an Enterprise licence" [portal.infrastructure.encryption.coverage] decryptOnlyNote = "New uploads are stored as plaintext. Files encrypted earlier are still readable." encrypted = "Encrypted files" heading = "Coverage" percentEncrypted = "{{percent}}% encrypted" plaintext = "Plaintext files" progressLabel = "{{percent}}% of stored files encrypted" subheading = "Covers files in My Files and signing workflows. Files a pipeline reads in place, including network sources, are not stored here and are not encrypted." [portal.infrastructure.encryption.error] action = "That key change could not be applied. Please try again." keyMissing = "That key no longer exists. Refresh to see the current list." migrationStart = "The migration could not be started. Please try again." rotate = "The re-wrap could not be completed. Please try again." [portal.infrastructure.encryption.generatedKey] backupGuide = "How to back it up" description = "No encryption key was configured, so one was created on this server. Back it up now: if it is lost, encrypted files cannot be recovered." title = "This key was generated for you" [portal.infrastructure.encryption.keys] changedAt = "Changed {{when}}" changedBy = "By {{actor}}" changedByAt = "By {{actor}} on {{when}}" heading = "Scope keys" keyVersion = "Version {{version}}" neverChanged = "Never changed" restore = "Restore access" retiredNote = "A retired key still decrypts the files stored under it, but a newer key wraps new uploads." revoke = "Revoke" subheading = "One key per scope. Revoking a key blocks reads of everything stored under it." [portal.infrastructure.encryption.keys.columns] actions = "Actions" lastChange = "Last change" scope = "Scope" status = "Status" [portal.infrastructure.encryption.keys.empty] description = "A key is created the first time someone uploads a file, not at startup." title = "No keys yet" [portal.infrastructure.encryption.masterKey] backend = "Storage backend" compareNote = "Compare this against the fingerprint in your key backup and in the startup log." copied = "Copied" copy = "Copy" copyFailed = "This browser would not allow copying. The fingerprint is selected, so copy it manually." fingerprint = "Fingerprint" fingerprintHelp = "What is this fingerprint for?" heading = "Master key" notMaterialised = "The key machinery has not started on this node yet." s3StreamingNote = "While anything is encrypted, object-store downloads are streamed through this server rather than redirected, so they use its bandwidth." subheading = "Wraps every scope key. Never shown or accepted over the API." version = "Version" [portal.infrastructure.encryption.migration] backlog_one = "{{formatted}} file is stored as plaintext and can be encrypted now." backlog_other = "{{formatted}} files are stored as plaintext and can be encrypted now." encrypted = "Encrypted" failedCount = "Failed" heading = "Encrypt existing files" hint = "Encrypts the plaintext backlog left from before encryption was switched on. Progress is held in memory, so a backend restart resets it to not started. Running again skips files that are already encrypted." noBacklog = "Every stored file is already encrypted." progressLabel = "{{processed}} of {{total}} files encrypted" requiresEncryptionOn = "Switch encryption on before running this: the backlog is encrypted using the same write path as new uploads." runAgain = "Run again" skipped = "Skipped" skippedHelp = "What does skipped mean?" skippedNote = "Skipped files were replaced by a user while the run was in progress, so their copy was left alone." start = "Start" startedAt = "Started {{when}}" [portal.infrastructure.encryption.migration.confirm] cancel = "Cancel" confirm = "Start encrypting" noCancel = "There is no stop control. Once started, the run continues until it finishes or encryption is switched off." rewrites_one = "Rewrites {{formatted}} stored file, replacing the plaintext copy with an encrypted one." rewrites_other = "Rewrites {{formatted}} stored files, replacing the plaintext copies with encrypted ones." throttled = "The job is throttled and safe to re-run. Files already encrypted are skipped." title = "Encrypt the existing backlog?" [portal.infrastructure.encryption.migration.failed] description = "Encryption was switched off while the migration was running, so the remaining files were left untouched. Switch it back on and run again." title = "The run stopped early" [portal.infrastructure.encryption.migration.state] COMPLETED = "Completed" FAILED = "Failed" IDLE = "Not started" RUNNING = "Running" [portal.infrastructure.encryption.revoke] cancel = "Cancel" clusterDelay = "On a cluster, other nodes apply this within 60 seconds." confirm = "Revoke access" readsFail = "Files already stored under this key stop opening, for everyone." reversible = "This is reversible. No key material is deleted." title = "Revoke access to this key?" uploadsContinue = "New uploads keep working. They get a fresh key, so they stay readable." [portal.infrastructure.encryption.rotation] currentVersion = "Current version" heading = "Master key rotation" hint = "Re-wraps scope keys under a new master key; file contents are never rewritten. The new key is set in configuration and applied on restart, so this button only performs the re-wrap." pendingRows = "Rows on an older version" rewrap = "Re-wrap keys" rewrapped_one = "{{count}} key row re-wrapped." rewrapped_other = "{{count}} key rows re-wrapped." runbook = "Rotation runbook" [portal.infrastructure.encryption.rotation.confirm] cancel = "Cancel" confirm = "Re-wrap keys" noFiles = "File contents are not touched. Only the key table is rewritten." rerunnable = "Safe to run again if it does not finish." rewraps_one = "Re-wraps {{count}} key row under the current master key." rewraps_other = "Re-wraps {{count}} key rows under the current master key." title = "Re-wrap the key table?" [portal.infrastructure.encryption.rotation.pending] description = "Do not remove the previous key from configuration yet. Files under those keys would stop opening." title_one = "{{count}} key row is still on the previous master key" title_other = "{{count}} key rows are still on the previous master key" [portal.infrastructure.encryption.scope] global = "All users" source = "Source {{id}}" team = "Team {{id}}" [portal.infrastructure.encryption.status] ACTIVE = "Active" DISABLED = "Revoked" RETIRED = "Retired" [portal.infrastructure.encryption.unavailable.forbidden] description = "Your account does not have permission to view encryption settings." title = "Not available for your account" [portal.infrastructure.encryption.unavailable.registry-unavailable] description = "The encryption key registry could not be read. Check the database connection and the application logs." title = "Key registry unavailable" [portal.infrastructure.encryption.unavailable.storage-disabled] description = "File storage is switched off on this server, so there is nothing to encrypt." title = "Storage is disabled" [portal.infrastructure.encryption.unavailable.unknown] description = "Encryption status could not be loaded. Please try again." title = "Status unavailable" [portal.infrastructure.encryption.writeState] decryptOnly = "Decrypt only" encrypting = "Encrypting new uploads" off = "Off" [portal.infrastructure.keyLabel] active = "Active" revoked = "Revoked" [portal.integrations] availableHeading = "Available" comingSoonHeading = "Coming soon" connect = "Connect" connectionCount_one = "{{count}} connection" connectionCount_other = "{{count}} connections" customApi = "Custom API" searchPlaceholder = "Search integrations" subtitle = "Everything ZhmmCloud can talk to. Credentials are created once here, then referenced by sources, policies and pipelines." title = "Integrations" typedName = "{{tool}} name" [portal.integrations.filters] all = "All" audit = "Audit" connected = "Connected" notify = "Notify" security = "Security" signing = "Signing" storage = "Storage" [portal.integrations.noResults] description = "No integrations match your filters. Try a different category or search." title = "No matches" [portal.integrations.status] connected = "Connected" [portal.integrations.table] integration = "Integration" worksWith = "Works with" [portal.integrations.worksWith] pipelines = "Pipelines" policies = "Policies" sources = "Sources" [portal.legal] draft = "{{label}} · draft" loadError = "Could not load this document. Please try again." loading = "Loading…" title = "Legal document" [portal.nav] agent-builder = "Agent Builder" components = "Components" docs = "Documentation" documents = "Documents" editor = "Editor" home = "Home" infrastructure = "Infrastructure" integrations = "Integrations" pipelines = "Pipelines" policies = "Policies" procurement = "Procurement" review = "Review" sources = "Sources" usage = "Usage & Billing" users = "Users" [portal.nav.section] platform = "PDF Platform" processor = "PDF Processor" [portal.pipelines] permissionsRetry = "Retry" permissionsUnavailable = "Couldn't check whether you can manage policies, so policy actions are unavailable for now." subtitle = "Automate your document workflows. Start from a template for a simple, guided setup, or build a custom pipeline from scratch. Enforce any pipeline as a policy to run it on every document." title = "Pipelines" [portal.pipelines.actions] newCustomPipeline = "New custom pipeline" [portal.pipelines.all] title = "All pipelines" [portal.pipelines.builder] activate = "Activate" back = "Back to pipelines" cannotFollow = "Can't take {{produced}}" chooseAccount = "Choose an account" chooseDestination = "Choose a destination" chooseOperation = "Choose what this step does" chooseSource = "Choose a source" discard = "Discard changes" editorDestination = "Editor" editorDestinationDetail = "Replaces the file you ran it on" inputs = "Input" inputSource = "Input source" inputTrigger = "Trigger" keepEditing = "Keep editing" moreActions = "More actions" needsConfiguring = "Needs setting up" needsDestination = "No destination chosen" needsSource = "No source chosen" noToolMatches = "No tools match your search." pause = "Pause" rename = "Rename pipeline" runOn = "Runs on" runOnExport = "Every export" runOnTooltip = "Choose when this pipeline runs on your files: when you add them, or when you export them." runOnUpload = "Every upload" searchTools = "Search tools" sendToSystem = "Send to another system" stepsIncompatible = "These steps can't run on what their prior step produces: {{tools}}." stepsNeedSetup = "These steps still need setting up before saving: {{tools}}." supportingFiles = "Supporting files" testRun = "Test with a file" unknownStep = "Unrecognized operation, kept as-is." unsavedBody = "You have unsaved changes. Save them before leaving, or discard them?" unsavedTitle = "Unsaved changes" usesDefaults = "Runs with default settings" viewDefinition = "View definition" [portal.pipelines.builder.blocker] aiClassification = "Enable AI classification in Settings, or remove the Classify step" destination = "Choose a destination" heading = "To create this pipeline:" incompatible = "Fix steps that can't run in order: {{tools}}" managerOnly = "Only an admin or team leader can modify a policy" name = "Give the pipeline a name" routing = "Give every route document types and a destination" routingNeedsClassify = "Add a Classify step, or turn off routing by document type" saveHeading = "To save your changes:" schedule = "Set how often it runs" setup = "Finish setting up: {{tools}}" source = "Choose an input source" [portal.pipelines.builder.diagnostic] fan-in = "Combines every incoming file" fan-out = "Runs once per incoming file" format-mismatch = "Sends {{produced}}, needs {{accepts}}" output-uncertain = "May not run: output depends on setup" source-mismatch = "Input is {{produced}}, needs {{accepts}}" undeclared-operation = "Can't check what this step accepts" [portal.pipelines.builder.icon] label = "Change icon" [portal.pipelines.builder.ingest] chunkSize = "Chunk size" chunkSizeHint = "Characters per chunk. Smaller chunks retrieve more precisely; larger ones keep more context together." destinationNeedsChunks = "This vector database destination needs a final AI ingestion step that exports chunks only." editorPdfOnly = "Only PDFs can return to the editor. To export chunks or Markdown, choose Keep originals and send to a destination under Output." exportChunks = "Export chunks as JSONL" exportChunksHint = "One chunk per line with its page span, ready to load into another system." exportMarkdown = "Export markdown" exportMarkdownHint = "The document's text as one Markdown file." includeOriginal = "Include the input PDF" includeOriginalHint = "Deliver the PDF alongside exported text. This does not change whether the source keeps its original." index = "Index into the knowledge base" indexHint = "Embeds the document so it can be searched and asked about. Needs the AI engine." nothingToDo = "Turn on at least one of indexing or an export, or this step has nothing to do and the run will fail." overlap = "Overlap" overlapHint = "Characters repeated between neighbouring chunks, so a sentence split across two is still findable." overlapTooBig = "Overlap must be smaller than the chunk size ({{chunkSize}})." prepareDestination = "Prepare chunks for this destination" unavailable = "AI ingestion needs the AI engine and DocParse turned on, including when the destination database generates embeddings." [portal.pipelines.builder.routing] addRule = "Add a route" aiDisabled = "AI classification is not enabled. Enable it in Settings, or route on a document property instead." aiToolDisabled = "Unavailable until AI classification is enabled in Settings" aiUnavailable = "Document-type routing is disabled because AI classification is unavailable. Route on a document property instead." extensionPlaceholder = "pdf, docx, png" fallback = "Everything else goes to" heading = "Routes" matchAuthor = "PDF author" matchBy = "Match by" matchDocumentType = "Document type (AI classification)" matchDocumentTypeDisabled = "Document type (AI unavailable)" matchExtension = "File extension" matchFilename = "Exact filename" matchTitle = "PDF title" matchValues = "Values to match" needsClassify = "Add a Classify step to use document-type routing, or match on a document property instead." nodeSummary_one = "1 route, then a fallback" nodeSummary_other = "{{count}} routes, then a fallback" toggle = "Send document types to different places" toggleOff = "Every document goes to the destination below." toggleOn = "Documents are routed by the first document condition they match." valuePlaceholder = "Enter exact values, separated by commas" [portal.pipelines.composer] addTool = "Add a tool" create = "Create pipeline" createPaused = "Create paused" editingUnsupported = "Displaying these tool params for editing is not supported yet." editSource = "Edit source" name = "Name" namePlaceholder = "Pipeline name" noToolSettings = "This tool has no configurable settings." output = "Destination" save = "Save changes" scheduleEvery = "Run every" trigger = "Trigger" triggerManual = "Manual only" [portal.pipelines.composer.runsEvery] days_one = "Runs every day" days_other = "Runs every {{count}} days" hours_one = "Runs every hour" hours_other = "Runs every {{count}} hours" minutes_one = "Runs every minute" minutes_other = "Runs every {{count}} minutes" [portal.pipelines.composer.unit] days = "days" hours = "hours" minutes = "minutes" [portal.pipelines.definition] subtitle = "The pipeline as it would be saved." title = "Definition" [portal.pipelines.delete] body = "Delete \"{{name}}\"? This can't be undone." cancel = "Cancel" confirm = "Delete" title = "Delete pipeline?" [portal.pipelines.detail] clearHistory = "Process ignored files in source" delete = "Delete pipeline" run = "Run now" [portal.pipelines.empty] action = "Create a pipeline" connectSource = "Connect a source" description = "Create your first pipeline: pick the sources it runs over, chain the operations, and choose where output goes." title = "No pipelines yet" [portal.pipelines.enforce] desc = "A policy blocks a file that fails it; an ordinary pipeline reports the error but lets the file through." info = "What enforcing as a policy means" label = "Enforce as policy" managerOnly = "Only an admin or team leader can enforce a pipeline as a policy" [portal.pipelines.graph] addFirstTool = "Add a tool" dragHint = "Drop on a line to move it" insertHere = "Add a tool here" removeNode = "Remove {{name}}" showError = "Show why {{name}} failed" [portal.pipelines.graph.add] input = "Add a source" output = "Add a destination" [portal.pipelines.graph.run] done = "Done" failed = "Failed" running = "Running" [portal.pipelines.inspector] multipleBody = "Drag any of them onto a line to move them together, or press Delete to remove them." multipleSelected_one = "{{count}} step selected" multipleSelected_other = "{{count}} steps selected" noSelectionBody = "Pick a node in the graph to change what it does." noSelectionTitle = "Nothing selected" [portal.pipelines.inspector.status] completed_one = "Finished the only step" completed_other = "Finished all {{count}} steps" failed_one = "Failed on the only step" failed_other = "Failed after {{done}} of {{count}} steps" running_one = "Running the only step" running_other = "Running step {{done}} of {{count}}" [portal.pipelines.run] allProcessed_one = "Nothing to run: the source's {{count}} document has already been processed." allProcessed_other = "Nothing to run: all {{count}} documents in the sources have already been processed." completed_one = "Run completed." completed_other = "All {{count}} runs completed." empty = "Nothing to run: the sources had no documents to process." failed = "Run failed: {{error}}" inFlight = "Nothing new to run: documents are still being processed from an earlier run." parked_one = "Nothing to run: {{count}} document failed previously and is parked. Fix the cause, then reprocess the source to retry it." parked_other = "Nothing to run: {{count}} documents failed previously and are parked. Fix the cause, then reprocess the source to retry them." running = "Run started; still in progress." timeout = "Run is taking longer than expected; it may still finish in the background." [portal.pipelines.status] active = "Active" paused = "Paused" [portal.pipelines.table] name = "Pipeline" sources = "Sources" status = "Status" steps = "Steps" trigger = "Trigger" type = "Type" [portal.pipelines.templates] setUp = "Set up" title = "Templates" [portal.pipelines.trigger] editor-export = "Every export" editor-upload = "Every upload" folder-watch = "Folder watch" manual = "Manual" schedule = "Scheduled" storage-folder-watch = "New files in storage folder" [portal.pipelines.type] pipeline = "Pipeline" policy = "Policy" [portal.policies] defaultName = "{{category}} Pipeline" [portal.policies.card] comingSoon = "Upgrade to Enterprise" requiresAiEngine = "Requires AI engine" [portal.policies.categories.classification] desc = "Identify each document's type on upload and tag its metadata for filing and search." label = "Classification" [portal.policies.categories.compliance] desc = "Strip hidden data, convert to PDF/A for archiving, and validate every document against the standard before it is delivered." label = "Compliance" [portal.policies.categories.ingestion] description = "Read documents, prepare searchable chunks, and deliver them to a knowledge base or export destination." label = "Ingestion" [portal.policies.categories.retention] desc = "Set how long documents are kept, when to archive, and when to delete." label = "Retention" [portal.policies.categories.routing] desc = "Auto-route documents to the right team, folder, or system." label = "Routing" [portal.policies.categories.security] desc = "Detect PII, redact, strip active content, and watermark documents." label = "Security" [portal.policies.config] scopeAll = "All documents" [portal.policies.config.classification] summary = "Classifies every uploaded document against your team's labels and tags its metadata." [portal.policies.config.classification.rules] 0 = "Classify" 1 = "Tag metadata" [portal.policies.config.compliance] summary = "Strips hidden data, converts to the PDF/A archival format, and validates the result against the standard." [portal.policies.config.compliance.rules] 0 = "Strip hidden data" 1 = "Convert to PDF/A" 2 = "Validate compliance" [portal.policies.config.ingestion] description = "Choose the documents to process, make their text searchable, and send chunks to a database or export them." [portal.policies.config.ingestion.rules] 0 = "Read text" 1 = "Chunk" 2 = "Index" 3 = "Keep the original" [portal.policies.config.pdfa.fields.outputFormat] help = "PDF/A-2b suits most archives. PDF/A-1b is the strictest and most widely accepted; PDF/A-3b additionally allows attachments." label = "Archival profile" [portal.policies.config.purview] label = "Apply a Microsoft Purview sensitivity label" [portal.policies.config.purview.fields] connection = "Purview tenant" labelId = "Label ID" labelIdHelp = "The label's GUID, from the Purview portal. Applying a label writes its metadata onto the PDF; it cannot encrypt, which needs the Microsoft client." labelName = "Label name (optional)" labelNameHelp = "Recorded alongside the ID so people and tools can recognise the label." labelNamePlaceholder = "Confidential" [portal.policies.config.purview.fields.method] help = "Purview distinguishes a label a policy applied from one a person chose." label = "How the label is recorded" privileged = "As chosen by a person" standard = "As applied automatically" [portal.policies.config.purviewRead] label = "Read a Microsoft Purview label" [portal.policies.config.purviewRead.fields] connection = "Purview tenant" connectionHelp = "Reads the label the document already carries, so later steps can act on it." [portal.policies.config.retention] summary = "Enforces how long documents are kept, when to archive, and when to delete." [portal.policies.config.retention.fields] archiveAfter = "Archive after" immutableHold = "Immutable hold" keepFor = "Keep for" [portal.policies.config.retention.rules] 0 = "Retention hold" 1 = "Auto-archive" 2 = "Deletion block" [portal.policies.config.routing] summary = "Routes documents to the right destination based on type and classification." [portal.policies.config.routing.rules] 0 = "Auto-classify" 1 = "Route to folder" 2 = "Webhook notify" [portal.policies.config.security] summary = "Detects and redacts PII, strips active content (JavaScript), and watermarks documents." [portal.policies.config.security.rules] 0 = "Redact PII" 1 = "Remove JavaScript" 2 = "Watermark" [portal.policies.endpoints] addWatermark = "Watermark" autoRedact = "Redact PII" classifyAndLabel = "Classify" compressPdf = "Compress" flatten = "Flatten" ingest = "Prepare for knowledge search" ocrPdf = "OCR" pdfa = "Convert to PDF/A" sanitizePdf = "Remove JavaScript" validateCompliance = "Validate compliance" [portal.policies.operations] change = "Change what this step does" noResults = "No step matches that. Try a product name, or \"scan\", \"notify\", \"attach\"." searchPlaceholder = "Search steps - try \"scan\", \"attach\" or a product name" [portal.policies.operations.bodyMode] binary = "Raw file bytes" json = "Inside a JSON payload" multipart = "As a file upload (multipart)" [portal.policies.operations.clamavScan] description = "Your own ClamAV server checks the document; nothing leaves your network." label = "Scan for viruses (self-hosted)" [portal.policies.operations.cloudmersiveAdvancedScan] description = "Rejects documents carrying macros, executables, scripts or embedded objects." label = "Block active content" [portal.policies.operations.cloudmersiveScan] description = "Cloudmersive checks the document and the run stops if it is not clean." label = "Scan for viruses" [portal.policies.operations.confluenceAttach] description = "Files the processed document onto a page." label = "Attach to a Confluence page" [portal.policies.operations.consignoSubmit] description = "Submits the document to ConsignO Cloud for signing." label = "Send for signature (ConsignO)" note = "Submits the document. Retrieving the signed copy is not yet supported, because a step cannot pass a result to a later step." [portal.policies.operations.customApiCall] description = "Author the call yourself: path, method, body and response handling." label = "Call a custom API" [portal.policies.operations.discordNotify] description = "Tells a channel that the policy handled a document." label = "Post a message to Discord" [portal.policies.operations.elasticIndex] description = "Records what the policy did as a searchable document." label = "Index an audit event in Elasticsearch" [portal.policies.operations.fields.bodyMode] helperText = "Multipart suits upload APIs; JSON suits APIs that want the file inside a payload; binary sends the raw bytes." label = "How to send the document" [portal.policies.operations.fields.bodyTemplate] helperText = "A JSON body sent as-is. {{document.base64}} carries the file; {{document.*}} and {{run.*}} are filled in per document." label = "JSON body" [portal.policies.operations.fields.connection] label = "Account" [portal.policies.operations.fields.domain] label = "Mailgun domain" placeholder = "mg.acme.com" [portal.policies.operations.fields.fileFieldName] helperText = "The form field the API expects the document under." label = "File field name" placeholder = "file" [portal.policies.operations.fields.from] label = "From" placeholder = "processor@acme.com" [portal.policies.operations.fields.headers] helperText = "A JSON object of header name/value pairs. The connection's credential is added for you." label = "Headers" [portal.policies.operations.fields.index] label = "Index" placeholder = "zhmmcloud-audit" [portal.policies.operations.fields.issueKey] label = "Issue key" placeholder = "OPS-42" [portal.policies.operations.fields.message] helperText = "Sent as the message body. {{document.*}} and {{run.*}} are filled in per document." label = "Message" [portal.policies.operations.fields.method] label = "Method" [portal.policies.operations.fields.pageId] label = "Page ID" placeholder = "66186" [portal.policies.operations.fields.path] helperText = "Appended to the connection's base URL. It can never reach another host." label = "Path" placeholder = "/v1/scan" [portal.policies.operations.fields.remotePath] helperText = "Where in the drive to write it. {{document.filename}} is filled in per document." label = "Destination path" placeholder = "Processed/{{document.filename}}" [portal.policies.operations.fields.responseMode] helperText = "Report leaves the document untouched. Replace swaps it for whatever comes back." label = "What to do with the reply" [portal.policies.operations.fields.signerEmail] label = "Signer's email" placeholder = "signer@acme.com" [portal.policies.operations.fields.subject] label = "Subject" placeholder = "Processed: {{document.filename}}" [portal.policies.operations.fields.text] helperText = "Presidio analyses this text. Use {{document.title}} or paste the text you want checked." label = "Text to check" [portal.policies.operations.fields.to] label = "To" placeholder = "records@acme.com" [portal.policies.operations.fields.username] label = "Nextcloud username" placeholder = "svc-zhmmcloud" [portal.policies.operations.googlechatNotify] description = "Tells a space that the policy handled a document." label = "Post a message to Google Chat" [portal.policies.operations.jiraAttach] description = "Files the processed document onto an issue." label = "Attach to a Jira issue" [portal.policies.operations.mailgunEmail] description = "Sends the processed document as an attachment." label = "Email the document (Mailgun)" [portal.policies.operations.n8nGate] description = "Your workflow decides whether the run carries on." label = "Ask an n8n workflow to approve" note = "The workflow must reply with {\"approved\": true}. Anything else — including a timeout — stops the run and parks the document." [portal.policies.operations.n8nNotify] description = "Sends the run's details, not the document." label = "Tell an n8n workflow" [portal.policies.operations.n8nSend] description = "Sends the document and the run's details to your workflow." label = "Send the document to n8n" [portal.policies.operations.n8nTransform] description = "Your workflow processes the document and the file it returns replaces it." label = "Process the document in n8n" note = "Set the Webhook node to respond \"Using Respond to Webhook Node\", and return a file. On the default \"Immediately\" setting n8n replies with an acknowledgement, and that would replace the document." [portal.policies.operations.nextcloudUpload] description = "Writes the processed document into a folder." label = "Upload to Nextcloud" [portal.policies.operations.presidioAnalyze] description = "Your own Presidio server reports the personal data it finds." label = "Detect personal data" note = "Presidio reads text, not files. Give it the text you want checked — the document itself is not uploaded." [portal.policies.operations.responseMode] replace = "Replace the document with the reply" report = "Keep the document, record the reply" [portal.policies.operations.sendgridEmail] description = "Sends the processed document as an attachment." label = "Email the document (SendGrid)" [portal.policies.operations.slackNotify] description = "Tells a channel that the policy handled a document." label = "Post a message to Slack" [portal.policies.operations.splunkEvent] description = "Records what the policy did, where your auditors already look." label = "Send an audit event to Splunk" [portal.policies.operations.sumologicEvent] description = "Records what the policy did to an HTTP collector." label = "Send an audit event to Sumo Logic" [portal.policies.operations.teamsNotify] description = "Tells a channel that the policy handled a document." label = "Post a message to Teams" [portal.policies.operations.webhookPost] description = "Sends the document itself to a URL you choose." label = "Post the document to a webhook" [portal.policies.operations.zapierNotify] description = "Hands the run's details to your automation." label = "Trigger a Zap or Make scenario" [portal.policies.wizard.actions] cancel = "Cancel" customise = "Customise" customiseUnavailable = "The full builder lives on Processor" enablePolicy = "Create pipeline" saveChanges = "Save changes" [portal.policies.wizard.capability.classify] desc = "Identifies the document's type from your team's labels and tags it, so it files and searches by category." label = "Classify the document" [portal.policies.wizard.capability.complianceCheck] desc = "Validates the finished document against PDF/A and stops the run if it does not hold up." label = "Check the document meets the standard" [portal.policies.wizard.capability.compress] desc = "Compresses the document to a smaller file size." label = "Reduce file size" [portal.policies.wizard.capability.flatten] desc = "Merges form fields and annotations into the page so they can't be edited." label = "Flatten the document" [portal.policies.wizard.capability.ingest] desc = "Prepare searchable chunks for the built-in knowledge base, a connected vector database, or a corpus export." label = "Prepare for knowledge search" [portal.policies.wizard.capability.ocr] desc = "Runs OCR so scanned pages become selectable, searchable text." label = "Make text searchable" [portal.policies.wizard.capability.pdfa] desc = "Rewrites the document in the ISO archival format, embedding its fonts and colour profiles so it still renders the same years from now. Invalidates digital signatures." label = "Convert to PDF/A for archiving" [portal.policies.wizard.capability.redact] desc = "Finds and blacks out sensitive details — like Social Security and card numbers — so they can't be read." label = "Redact sensitive information" [portal.policies.wizard.capability.sanitize] desc = "Removes hidden JavaScript so nothing can run automatically when the document is opened." label = "Strip active content" [portal.policies.wizard.capability.timestampPdf] desc = "Proves the document existed in this exact form at a point in time, using an independent timestamp authority. Only a hash is sent - the document never leaves your server." label = "Add a trusted timestamp" [portal.policies.wizard.capability.watermark] desc = "Stamps a visible mark (e.g. “Confidential”) across every page." label = "Apply a watermark" [portal.policies.wizard.classification] description = "Every uploaded document is classified against the built-in labels and tagged with the types that fit. The label set is shared across your whole team." labelsHeading = "Classification labels" [portal.policies.wizard.errors] noTools = "Enable at least one action." saveFailed = "Couldn't save the pipeline. Please try again." [portal.policies.wizard.locations] aiSettings = "Open AI settings" builtin = "ZhmmCloud knowledge base" builtinHelp = "Indexes searchable chunks in ZhmmCloud and returns the processed PDF to the destination below. An embedding provider must be configured in AI settings." checking = "Checking ingestion availability..." chooseOutput = "Choose an enabled output destination before saving." chooseSource = "Choose where documents come from" chunkSettings = "Chunk settings" connectInput = "Connect input source" consumed = "Check this source's processing mode: consume deletes originals after a successful run. Choose Track in Edit input source to keep them." delivery = "Delivery" desktopExternal = "Manage this database connection in the web app’s Processor, or change the output type to return results to this folder." destination = "Destination" editInput = "Edit input source" editor = "Files opened in the editor" editorDestination = "Editor workspace" editorOutput = "Processed PDFs return to the editor workspace." engineUnavailable = "The AI engine is disabled or unreachable. Enable it to prepare chunks, or turn off knowledge search to run OCR only." export = "Export chunks without a database" exportHelp = "Saves the processed PDF and chunks (JSONL) to the destination below. The AI engine prepares the chunks; no database or embedding provider is needed." external = "Connected vector database" externalHelp = "Sends chunks to the selected database, which generates embeddings. The run returns an indexing receipt." folder = "Input: {{name}}. Originals are retained when delivering to a vector database." folderOutput = "Processed files are saved in this folder. Corpus exports keep the original PDF." indexingUnavailable = "The built-in knowledge base needs an embedding provider. Configure one in AI settings, connect a vector database, or export chunks without a database." input = "Documents to process" invalidChunks = "Choose a chunk size from 64 to 32768 and an overlap from 0 to 4096 smaller than the chunk size." keepOriginal = "Keep originals and send to a destination" keepOriginalHelp = "A copy runs in the background. Your editor files stay unchanged; results are saved to the destination below." noDatabase = "No vector database destination is set up. Connect a source below, then choose or create its database connection and collection." output = "Output" outputType = "Output type" recheck = "Check again" retained = "This source does not delete inputs after processing. Choose a separate destination to keep the original files unchanged." returnToEditor = "Return results to editor" returnToFolder = "Return results to this folder" savedDatabase = "Saved vector database" source = "Input source" [portal.policies.wizard.routing] chooseDestination = "Choose a destination" chooseSource = "Choose what to watch" description = "Each document is classified first, then delivered to the first rule it matches. Anything matching none goes to the destination below." destinationAria = "Destination" labelAria = "Document types" labelPlaceholder = "Choose document types" needsDestination = "Add a destination below first - a rule needs somewhere to send documents to." needsSource = "Connect a folder, bucket or webhook for this policy to watch." remove = "Remove rule" sourceDescription = "Documents arriving here are classified, then sent on by the rules below." sourceHeading = "Watch" [portal.policies.wizard.sources] connect = "Connect a source" [portal.policies.wizard.title] edit = "Edit {{category}} pipeline" setUp = "Set up {{category}} pipeline" [portal.policies.wizard.workflow] description = "Choose what this pipeline does to every document it processes." [portal.processorFlow] footnote = "Counts are over the last 24 hours. Flow speed is illustrative." liveBadge = "Live" stats = "{{connected}} connected · {{processed}} PDFs processed" title = "PDF Processor" [portal.processorFlow.lens] ariaLabel = "View mode" flow = "Flow" sankey = "Sankey" [portal.processorFlow.outcomes] count = "{{n}} · 24h" failed = "Failed" heading = "Outcomes" success = "Delivered" [portal.processorFlow.policies] activeCount = "{{n}} active" count = "{{n}} · 24h" heading = "Policies" setUp = "Set up" soon = "Soon" [portal.processorFlow.sankey] waist = "Policies · {{n}} active" [portal.processorFlow.sankey.empty] description = "Connect a source and switch on a policy to watch documents flow through the processor." title = "No flow yet" [portal.processorFlow.sources] comingSoonTag = "Connect" editor = "ZhmmCloud PDF Editor" heading = "Sources" perDay = "{{n}} / 24h" [portal.processorFlow.sources.comingSoon] apiMcp = "API · MCP" cloud = "Drive · Box · S3" email = "Email intake" [portal.procurement] subtitle = "Get your team evaluated, contracted, and onboarded. Every document in one place." title = "Procurement" [portal.procurement.agreement] agreeCta = "Sign agreement" confidential = "Confidential" confirm = "I have read and agree to this Agreement, and I represent that I am authorized to sign it on behalf of the organization named above." docName = "ZhmmCloud Enterprise Agreement" docSub = "MSA, Order Form, EULA and DPA, combined into one signature." download = "Download" downloadDraftError = "Could not generate the agreement PDF - the document renderer is unavailable. Please try again shortly or contact support." downloadError = "Could not download the signed agreement. Please try again." legalName = "Legal entity name" legalNamePlaceholder = "The legal entity that will sign" loadError = "Could not load the agreement. Please try again." loading = "Loading the agreement..." ref = "Ref {{ref}} · {{version}}" requestChanges = "Request changes" scrollHint = "Scroll to review" signatory = "Signatory name" signatoryPlaceholder = "Full name" signatoryTitle = "Signatory title" signatoryTitlePlaceholder = "e.g. General Counsel" signError = "Could not record your signature. Please try again." [portal.procurement.builder] addons = "Add-ons" addressLine1 = "Address line 1" addressLine1Placeholder = "500 Howard St" addressLine2 = "Address line 2" addressLine2Placeholder = "Suite, floor, building" back = "Back" businessName = "Business name" businessNamePlaceholder = "Your company" city = "City" cityPlaceholder = "San Francisco" completeRequired = "Please complete the required fields (marked *) with a valid email before generating the quote." contactEmail = "Contact email" contactEmailPlaceholder = "jane@acme.com" contactName = "Contact name" contactNamePlaceholder = "Jane Doe" continue = "Continue" done = "Done" eula = "I have read and agree to the ZhmmCloud Enterprise EULA. It governs the agreement generated from this quote." generate = "Generate quote" indemnification = "Enhanced IP Protection" indemnificationSub = "Extends our IP defense to patent claims. Baseline copyright, trademark and trade-secret indemnification is included free." paperEyebrow = "Enterprise quote" paperFor = "Prepared for" pdfSize = "PDF size" poNumber = "PO number" poNumberPlaceholder = "Optional" postalCode = "Postal code" postalCodePlaceholder = "94105" posture = "Governance" posture_count = "~{{count}} policies" posture_essentials = "Essentials" posture_essentialsSub = "Classification + Sharing — the defaults" posture_governed = "Governed" posture_governedSub = "Adds Security and Routing" posture_regulated = "Regulated" posture_regulatedSub = "Every category — Compliance, Retention, Ingestion" qbr = "Quarterly business reviews" qbrSub = "Your SE reviews usage and roadmap each quarter" region = "State / region" regionPlaceholder = "California" running = "{{annual}} / yr · {{years}}-yr {{tcv}}" s1Sub = "Your team, and the PDFs you expect to run each year." s1Title = "How much will you process?" s2Sub = "Longer terms discount the rate; your service level sets support." s2Title = "Commitment and service" s3Sub = "For the quote and the agreement it generates." s3Title = "Your details" serviceLevel = "Service level" size_compact = "Compact" size_compactSub = "Mostly text, under 1 MB" size_heavy = "Heavy" size_heavySub = "Scanned or image-heavy, 5 MB+" size_standard = "Standard" size_standardSub = "Mixed text and images, 1 to 5 MB" slDedicated = "Dedicated" slDedicatedSub = "4 business hours · dedicated SE / CSM · +$30,000/yr" slPriority = "Priority" slPrioritySub = "Same business day · named CSM · included" slStandard = "Standard" slStandardSub = "Next business day · shared CSM · included" stepOf = "Step {{n}} of {{total}}" taxId = "VAT / Tax ID" taxIdPlaceholder = "Optional" term = "Term" termDiscount = "{{pct}}% multi-year commitment discount applied" title = "Build your quote" training = "Onboarding & training" trainingSub = "Live sessions to get your team running" users = "Total users" usersPlaceholder = "e.g. 250" viewEula = "Read it" volEstimated = "Estimated from {{count}} users (~2,000 PDFs each, including automation). Edit if you know better." volManual = "Using your figure. Re-estimate from your team size any time." volNoUsers = "Not sure? Enter your team size and we'll estimate it." volume = "Annual PDF volume" volumePlaceholder = "e.g. 1,000,000" years_one = "{{count}} year" years_other = "{{count}} years" [portal.procurement.documents] agreement = "Enterprise Agreement" agreementSub = "MSA, Order Form and DPA in one signature." download = "Download" eula = "EULA & Commercial Terms" eulaSub = "The software and self-serve commercial terms." invoice = "Invoice" invoiceSub = "Your first subscription invoice." laterInvoice = "Available after you accept" laterQuote = "Available once your quote is issued" quote = "Quote" quoteSub = "Your itemised enterprise quote." sla = "SLA Exhibit" slaSub = "Support tiers and response targets." subprocessors = "Subprocessors" subprocessorsSub = "Third parties that process data on your behalf." subtitle = "Your deal paperwork, available any time." title = "Documents" view = "View" [portal.procurement.error] title = "Something went wrong" [portal.procurement.hero] barAria = "Stage {{current}} of {{total}}" ctaAgreement = "Review & sign agreement" ctaExploring = "Set up your trial" ctaQuote = "Review your quote" ctaReviewQuote = "Review quote" ctaTrial = "Build your quote" documents = "Documents" eyebrow = "Enterprise" eyebrowCompany = "{{company}} Enterprise" inviteTeammates = "Invite teammates" licenseKey = "Licence key" liveSub = "Your organization is provisioned and your licence is active." liveTitle = "You are live on ZhmmCloud Enterprise" next = "Next: {{stage}}" open = "Open procurement" scheduleCall = "Schedule a call" sentenceAgreement = "review and sign the agreement" sentenceLive = "provisioning and rollout" sentencePayment = "purchase order and payment" sentenceQuote = "review and accept your quote" sentenceTrial = "set up your trial workspace" [portal.procurement.journey] daysLeft_one = "{{count}} day left" daysLeft_other = "{{count}} days left" expired = "Trial expired" [portal.procurement.journeySteps.agreement] blurb = "One signature covers MSA, order form, EULA and DPA." gatingAction = "Review and sign your agreement" label = "Agreement" [portal.procurement.journeySteps.implementation] blurb = "Provision your workspace and run the go-live playbook." gatingAction = "Provisioning your workspace" label = "Implementation" [portal.procurement.journeySteps.payment] blurb = "Pay by card, bank transfer, or against a purchase order." gatingAction = "Confirm payment" label = "Payment" [portal.procurement.journeySteps.quote] blurb = "Review committed-volume pricing and contract term." gatingAction = "Accept your quote" label = "Quote" [portal.procurement.journeySteps.trial] blurb = "Evaluate ZhmmCloud against your documents and workflows." gatingAction = "Build your quote" label = "Trial" [portal.procurement.license] copied = "Copied" copy = "Copy key" downloadError = "Could not generate the offline licence file just yet — please try again in a moment." downloadOffline = "Download offline licence (.lic)" hint = "Paste this key into a self-hosted instance to activate it, or keep it for your records. Keep it safe." label = "Your licence key" subtitle = "Activate a self-hosted instance with this key, or keep it for your records." title = "Your licence key" trialFileHint = "This is your trial licence file. Once your agreement is in place, come back and download it again — unlike the online licence key, the .lic file won't update on its own." [portal.procurement.link] cta = "Link account" description = "Procurement runs on your linked ZhmmCloud account: it's how we provision the trial, price your quote, and start billing. Link an account to start." eyebrow = "Enterprise" title = "Link your account to begin" [portal.procurement.live] description = "Your subscription is active and your licence is issued. Your team is provisioned and billing has started." eyebrow = "Live" title = "You're live on ZhmmCloud Enterprise" [portal.procurement.milestone] downloadError = "Could not download the quote PDF just yet — please try again in a moment." [portal.procurement.payment] description = "Your quote is accepted and your licence is already active — your team can start right away. Pay the first invoice when you're ready; you can pay or download it here, no email needed." downloadAgreement = "Download signed agreement" downloadInvoice = "Download invoice" eyebrow = "Payment" title = "Subscription created" viewInvoice = "View & pay invoice" [portal.procurement.review] acceptCta = "Accept quote" annual = "Annual fee (year 1)" downloadCta = "Download quote" poNumber = "Purchase order: {{po}}" renewal = "Renews at {{amount}}/year after the term (+{{pct}}% CPI)" tcv = "{{years}}-year term, paid in full up front: {{tcv}}" validUntil = "Valid until {{date}}" [portal.procurement.schedule] fallback = "Couldn't load the scheduler." fallbackLink = "Open scheduling in a new tab" loading = "Loading scheduler..." subtitle = "Your solutions engineer will walk your team through the rollout. Pick a time that suits you." title = "Schedule a call" [portal.procurement.setup] airgap = "Air-gapped" airgapSub = "Sealed, no outbound" back = "Back" businessName = "Business name" businessNamePlaceholder = "Acme Corp" cloud = "ZhmmCloud" cloudSub = "Managed, fastest start" continue = "Continue" deployment = "Where should it deploy?" eula = "I agree to the ZhmmCloud EULA & Commercial Terms." fullName = "Full name" fullNamePlaceholder = "Your name" invites = "Invite teammates · optional" invitesPlaceholder = "sam@acme.com, lee@acme.com" scheduleCall = "Schedule a call" seats = "People testing" seatsPlaceholder = "e.g. 15" selfhost = "Self-hosted" selfhostSub = "Docker or Kubernetes" start = "Start trial" stepOf = "Step {{n}} of {{total}}" subtitle = "Free for 14 days, no card required." subtitleDetails = "A few details for your quote and agreement." talkFirst = "Prefer to talk first?" title = "Set up your trial" viewEula = "Read it" workEmail = "Work email" workEmailPlaceholder = "you@company.com" [portal.procurement.trial] body = "Extending adds 7 days and notifies your solutions engineer." bodyMaxed = "You have used all your extensions — talk to your solutions engineer if you need more time." cancel = "Cancel trial" extend = "Extend 7 days" maxed = "Maxed out" subtitle = "Your free trial runs through {{date}}. No card required." title = "Enterprise trial" [portal.review] subtitle = "Anything from your policy runs and your team's editors that needs your attention." title = "Review" [portal.settings.sections] account-link = "Account connection" [portal.shell.sidebar] appEditor = "Editor" appProcessor = "Processor" linkAccount = "Link ZhmmCloud account" primaryNav = "Primary navigation" [portal.shell.topbar] closeNav = "Close navigation" openNav = "Open navigation" search = "Search" [portal.sources] processingModeHelp = "Track keeps originals and processes each version once. Snapshot keeps originals and processes them on every run. Consume deletes originals after successful delivery." subtitle = "Reusable input connections that feed documents into ZhmmCloud. Configure a source once, then reference it from any number of pipelines." title = "Sources" [portal.sources.actions] connectSource = "Connect source" [portal.sources.builder] advanced = "Advanced" back = "Back to sources" backToSource = "Back to source setup" backToTypes = "All source types" cancel = "Cancel" chooseHint = "Choose where documents come from. Greyed-out connectors are on the way." chooseOutputHint = "Choose where processed documents go. Greyed-out connectors are on the way." comingSoon = "Coming soon" comingSoonHeading = "Coming soon" create = "Create source" createTitle = "Connect a source" delete = "Delete" editTitle = "Edit source" save = "Save changes" [portal.sources.builder.folderAccess] description = "Folder automations can only use folders an administrator has allowed. Add it under Folder Access settings, then try again." openSettings = "Folder Access settings" title = "This folder isn't allowed" [portal.sources.delete] body = "Delete \"{{name}}\"? This can't be undone. Policies that reference it would need to be updated." cancel = "Cancel" confirm = "Delete" title = "Delete source?" [portal.sources.networkFields.connection] helperText = "The saved connection with the server address and credentials. Shared by every source that uses it." label = "Connection" [portal.sources.networkFields.directory] helperText = "The folder on the server to watch, relative to the login home or share root." label = "Folder" placeholder = "Login home or share root" [portal.sources.networkFields.mode] label = "After processing" [portal.sources.networkFields.mode.options] consume = "Delete the file" snapshot = "Leave it in place" track = "Keep originals; process changes once" [portal.sources.networkFields.recursive] helperText = "Include subfolders if your files are organised into nested folders, or watch only the top level." label = "Folder depth" [portal.sources.networkFields.recursive.options] all = "Include subfolders" top = "Top level only" [portal.sources.status] active = "Active" disabled = "Disabled" unused = "Unused" [portal.sources.table] documents = "Documents" source = "Source" status = "Status" type = "Type" usedBy = "Policies" [portal.sources.types.box] description = "Pull documents from Box folders your team already shares." label = "Box" [portal.sources.types.dropbox] description = "Pull documents from a shared Dropbox folder." label = "Dropbox" [portal.sources.types.editor] description = "Documents your team has processed in the editor, across policy and AI runs." label = "Editor" noPolicies = "No policies run from the editor yet." [portal.sources.types.email] description = "Turn attachments sent to a dedicated mailbox into documents." label = "Email inbox" [portal.sources.types.folder] description = "Watch a directory on the server for new documents." label = "Folder" [portal.sources.types.folder.fields.directory] helperText = "The absolute path to the folder to watch for new files." label = "Folder" placeholder = "/data/incoming" [portal.sources.types.folder.fields.identity] helperText = "Using the file contents for change detection is slower but more accurate." label = "Change detection" [portal.sources.types.folder.fields.identity.options] hash = "File Metadata & Content" stat = "File Metadata" [portal.sources.types.folder.fields.mode] helperText = "What happens to the original file once it has been processed. \"Keep it\" remembers what it has already handled, so a file is only processed again when it actually changes." label = "After processing" [portal.sources.types.folder.fields.mode.options] consume = "Delete the file" snapshot = "Keep it, and process it again every scan" track = "Keep it, and only process it again if it changes" [portal.sources.types.folder.fields.recursive] helperText = "Include subfolders if your files are organised into nested folders, or watch only the top level." label = "Folder depth" [portal.sources.types.folder.fields.recursive.options] all = "Include subfolders" top = "Top level only" [portal.sources.types.ftp] description = "Poll an FTP or FTPS server folder for new documents." label = "FTP" [portal.sources.types.googledrive] description = "Pull documents from shared Google Drive folders." label = "Google Drive" [portal.sources.types.network] description = "Watch an SMB network share for new documents." label = "Network drive" [portal.sources.types.onedrive] description = "Watch OneDrive folders for new documents." label = "OneDrive" [portal.sources.types.s3] description = "Pull documents from an Amazon S3 or S3-compatible bucket." label = "Amazon S3" [portal.sources.types.s3.fields.connection] helperText = "The saved connection with the bucket and credentials. Shared by every source and pipeline output that uses it." label = "Connection" [portal.sources.types.s3.fields.mode] label = "After processing" [portal.sources.types.s3.fields.mode.options] consume = "Delete the object" snapshot = "Leave it in place" track = "Keep originals; process changes once" [portal.sources.types.s3.fields.prefix] helperText = "The folder (key prefix) within the bucket to watch." label = "Folder" placeholder = "Whole bucket" [portal.sources.types.sftp] description = "Poll an SFTP drop folder for new documents." label = "SFTP" [portal.sources.types.sharepoint] description = "Pull documents from SharePoint document libraries." label = "SharePoint" [portal.sources.types.unknown] label = "Source" [portal.sources.types.vectordb] collection = "Collection / index name" collectionHint = "Use an existing collection or index configured for server-side embedding." connection = "Database connection" description = "An output destination for prepared document chunks. The database generates embeddings; originals stay in your input source when track mode is selected." label = "Vector database" namespace = "Namespace / tenant" namespaceHint = "Optional Pinecone namespace or Weaviate tenant. Leave empty for the default namespace or a single-tenant collection." textField = "Text field" textFieldHint = "The field the database embeds, matching the collection schema or Pinecone field map." [portal.sources.types.webhook] createNote = "A delivery URL and signing secret are generated when you create this webhook. Senders POST documents to that URL and the referencing policies run on arrival." description = "Receive documents by signed HTTP POST from any external system." label = "Webhook" [portal.sources.types.webhook.detail] deliveryUrl = "Delivery URL" secretNote = "The signing secret is shown once, when the webhook is created. Recreate the source to roll it." [portal.sources.types.webhook.reveal] copy = "Copy" done = "Done" secret = "Signing secret" secretHelp = "Sign each delivery's raw body with this key (HMAC-SHA256) and send it as the X-ZhmmCloud-Signature header." secretWarning = "Copy the signing secret now. For your security it is shown only once and cannot be retrieved later." title = "Webhook created" url = "Delivery URL" usage = "POST each document as the raw request body to the delivery URL with a binary content type (application/pdf or application/octet-stream). Referencing policies run automatically on arrival." [portal.sources.wizard] name = "Name" namePlaceholder = "e.g. Claims intake" type = "Type" [portal.stepModal] close = "Close" [portal.usage] subtitle = "Your plan, your usage, and every invoice." title = "Usage & Billing" [portal.usage.error] loadWallet = "Couldn't load wallet" openStripePortal = "Couldn't open Stripe portal" walletUnavailable = "Wallet unavailable: {{status}} {{statusText}}" [portal.usage.freeTier] adminOnly = "This server's monthly credits are shared by everyone on it, so only an administrator can see the figures. Everything you can run stays available." barAria = "Free credits remaining" capSuffix_one = "of {{allowance}} free credit left this month" capSuffix_other = "of {{allowance}} free credits left this month" connect = "Connect a ZhmmCloud account" connectBody = "Connecting adds a second monthly allowance, raises the users this server can have, and turns on the Processor." connectTitle = "This server has no ZhmmCloud account" loadError = "Couldn't read this server's credit usage. Try again in a moment." loadErrorTitle = "Couldn't load credit usage" resets = "Resets {{date}}" [portal.usage.sessionExpired] body = "Your ZhmmCloud account session has expired. Sign in again to view billing — your instance stays linked." [portal.users] title = "Users" [portal.users.roles.admin] label = "Admin (Org owner)" summary = "Full governance over the workspace, settings and members." [portal.users.roles.admin.permissions] 0 = "Manage users, teams and roles" 1 = "Manage all integrations incl. S3 connections" 2 = "Grant or revoke portal access" 3 = "Everything Team Owner can do" [portal.users.roles.guest] label = "Guest" summary = "Limited or web-only access; cannot hold personal configs." [portal.users.roles.guest.permissions] 0 = "Web-only / demo usage" 1 = "No API keys or integrations" 2 = "No portal access" 3 = "Read-only where shared" [portal.users.roles.member] label = "Member" summary = "Regular user — works with shared resources and their own configs." [portal.users.roles.member.permissions] 0 = "Use the editor and shared integrations" 1 = "Create personal API & MCP configs" 2 = "See team configs shared with them" 3 = "No S3 or workspace management" [portal.users.roles.team_owner] label = "Team owner" summary = "Owns a team — manages its members' resources and shared configs." [portal.users.roles.team_owner.permissions] 0 = "Create & manage the team's S3 connections" 1 = "Manage team-owned integration configs" 2 = "Portal access via the default policy" 3 = "Everything Member can do" [portal.users.seats] limited = "{{used}} / {{limit}} seats" unlimited = "{{used}} seats · Unlimited" [printFile] title = "Print File" [processingFolders.setup] addFolder = "Add folder" advancedSteps = "This folder uses a processing setup this wizard cannot edit. Its saved steps have not been changed." change = "Change" changeLocation = "Change folder location" chooseFolder = "Which folder should we process?" chooseParent = "Choose where to create the folder" chooseProcessing = "Choose processing" computer = "On this computer" computerDescription = "Click to choose a folder from your computer." computerHeading = "Process your own folder" createIn = "Create in" downloadsAction = "Try processing your downloads folder" dropDescription = "or click to choose one from your computer." dropError = "Drop a single folder here, or click to choose one." dropHeading = "Drop a folder here" editFolder = "Edit {{name}}" editTitle = "Edit folder processing" enable = "Enable processing" existingTitle = "Set up folder processing" folder = "Folder" folderChoice = "Use an existing folder or create one" folderName = "Folder name" fromComputer = "From computer..." invalidName = "Enter a folder name without path separators." location = "Folder location" namePlaceholder = "e.g. Invoices" newFolder = "New folder" noFolders = "No folders here." noMatchingFolders = "No matching folders." openFolder = "Open {{name}}" portalOnlyPreset = "Configure this preset in the portal." presetInfo = "About {{name}}" presetsLabel = "Processing presets" processing = "Processing" progress = "Setup progress" replaceWarning = "\"{{name}}\" already has processing. Saving will replace its current processing settings." retry = "Try again" review = "Review" saveChanges = "Save changes" saveFolder = "Save folder" searchFolders = "Search folders..." searchLocations = "Search locations..." selectFolder = "Select a folder" server = "Server storage" serverAction = "Or add a new folder to your server" settings = "Adjust settings" signInRequired = "Sign in to set up folder processing" title = "Process a folder" useExisting = "Use existing folder" viewLabels = "View classification labels" [processingFolders.wall] done = "Done" failed = "Failed" title = "Processing this folder" waiting = "Queued ..." [provider.googledrive] name = "Google Drive" scope = "File Import" [provider.googledrive.apiKey] description = "Google API Key for Google Picker API from Google Cloud Console" label = "API Key" [provider.googledrive.appId] description = "Google Drive App ID from Google Cloud Console" label = "App ID" [provider.googledrive.clientId] description = "Google OAuth 2.0 Client ID from Google Cloud Console" label = "Client ID" [provider.googledrive.enabled] description = "Allow users to import files directly from Google Drive" label = "Enable Google Drive File Picker" [provider.googledrive.errors] notConfigured = "Google Drive is not configured" pickerFailed = "Failed to open Google Drive picker" [provider.oauth2.generic] name = "Generic OAuth2" scope = "SSO" [provider.oauth2.generic.autoCreateUser] description = "Automatically create user accounts on first OAuth2 login" label = "Auto Create Users" [provider.oauth2.generic.blockRegistration] description = "Prevent new user registration via OAuth2" label = "Block Registration" [provider.oauth2.generic.clientId] description = "The OAuth2 client ID from your provider" label = "Client ID" [provider.oauth2.generic.clientSecret] description = "The OAuth2 client secret from your provider" label = "Client Secret" [provider.oauth2.generic.enabled] description = "Enable authentication using a custom OAuth2 provider" label = "Enable Generic OAuth2" [provider.oauth2.generic.issuer] description = "Provider that supports OpenID Connect Discovery (/.well-known/openid-configuration)" label = "Issuer URL" [provider.oauth2.generic.provider] description = "The name of your OAuth2 provider (e.g., Azure AD, Okta)" label = "Provider Name" [provider.oauth2.generic.scopes] description = "Comma-separated OAuth2 scopes" label = "Scopes" [provider.oauth2.generic.useAsUsername] description = "Field to use as username" label = "Use as Username" [provider.oauth2.github] scope = "Sign-in authentication" [provider.oauth2.github.clientId] description = "The OAuth2 client ID from GitHub Developer Settings" label = "Client ID" [provider.oauth2.github.clientSecret] description = "The OAuth2 client secret from GitHub Developer Settings" label = "Client Secret" [provider.oauth2.github.scopes] description = "Comma-separated OAuth2 scopes" label = "Scopes" [provider.oauth2.github.useAsUsername] description = "Field to use as username (email, login, name)" label = "Use as Username" [provider.oauth2.google] scope = "Sign-in authentication" [provider.oauth2.google.clientId] description = "The OAuth2 client ID from Google Cloud Console" label = "Client ID" [provider.oauth2.google.clientSecret] description = "The OAuth2 client secret from Google Cloud Console" label = "Client Secret" [provider.oauth2.google.scopes] description = "Comma-separated OAuth2 scopes" label = "Scopes" [provider.oauth2.google.useAsUsername] description = "Field to use as username (email, name, given_name, family_name)" label = "Use as Username" [provider.oauth2.keycloak] scope = "SSO" [provider.oauth2.keycloak.clientId] description = "The OAuth2 client ID from Keycloak" label = "Client ID" [provider.oauth2.keycloak.clientSecret] description = "The OAuth2 client secret from Keycloak" label = "Client Secret" [provider.oauth2.keycloak.issuer] description = "URL of the Keycloak realm's OpenID Connect Discovery endpoint" label = "Issuer URL" [provider.oauth2.keycloak.scopes] description = "Comma-separated OAuth2 scopes" label = "Scopes" [provider.oauth2.keycloak.useAsUsername] description = "Field to use as username (email, name, given_name, family_name, preferred_username)" label = "Use as Username" [provider.saml2] name = "SAML2" scope = "SSO (SAML)" [provider.saml2.autoCreateUser] description = "Automatically create user accounts on first SAML2 login" label = "Auto Create Users" [provider.saml2.blockRegistration] description = "Prevent new user registration via SAML2" label = "Block Registration" [provider.saml2.enabled] description = "Enable SAML2 authentication (Enterprise only)" label = "Enable SAML2" [provider.saml2.idpCert] description = "The certificate path (e.g., classpath:okta.cert)" label = "IDP Certificate" [provider.saml2.idpIssuer] description = "The ID of your provider" label = "IDP Issuer" [provider.saml2.idpMetadataUri] description = "The URI for your provider's metadata" label = "IDP Metadata URI" [provider.saml2.idpSingleLoginUrl] description = "The URL for initiating SSO" label = "IDP Single Login URL" [provider.saml2.idpSingleLogoutUrl] description = "The URL for initiating SLO" label = "IDP Single Logout URL" [provider.saml2.privateKey] description = "Your private key path" label = "Private Key" [provider.saml2.provider] description = "The name of your SAML2 provider" label = "Provider Name" [provider.saml2.registrationId] description = "The name of your Service Provider (SP) app name" label = "Registration ID" [provider.saml2.spCert] description = "Your signing certificate path" label = "SP Certificate" [provider.smtp] name = "SMTP Mail" scope = "Email Notifications" [provider.smtp.enabled] description = "Enable email notifications and SMTP functionality" label = "Enable Mail" [provider.smtp.from] description = "The email address to use as the sender" label = "From Address" [provider.smtp.host] description = "The hostname or IP address of your SMTP server" label = "SMTP Host" [provider.smtp.password] description = "Password for SMTP authentication" label = "SMTP Password" [provider.smtp.port] description = "The port number for SMTP connection (typically 25, 465, or 587)" label = "SMTP Port" [provider.smtp.username] description = "Username for SMTP authentication" label = "SMTP Username" [quickAccess] allTools = "Tools" automate = "Automate" config = "Config" files = "Files" [quickNav] account = "Account" docs = "Documentation" editor = "Editor" home = "ZhmmCloud" invite = "Invite" landmark = "Quick navigation" noProcessorAccess = "Ask an admin for processor access" notifications = "Notifications" processor = "Processor" reader = "Reader" signInToUse = "Sign in to use this" [read] tags = "view,open,display,read,viewer,PDF viewer,PDF reader,open PDF,view PDF,display PDF,preview,browse" [reader.rail] addDocument = "Add file" bookmarks = "Bookmarks" close = "Close document" comment = "Comments" label = "Reading tools" readAloud = "Read aloud" rotateLeft = "Rotate left" rotateRight = "Rotate right" search = "Find in document" switchDocument = "Switch document" thumbnails = "Pages" [redact] submit = "Redact" tags = "Redact,Hide,black out,black,marker,hidden,auto redact,manual redact" title = "Redact" [redact.auto] caseSensitiveLabel = "Case Sensitive Matching" colorLabel = "Box Color" convertPDFToImageLabel = "Convert PDF to PDF-Image" customPaddingLabel = "Custom Extra Padding" useRegexLabel = "Use Regex" wholeWordSearchLabel = "Whole Word Search" [redact.auto.settings] advancedTitle = "Advanced" title = "Redaction Settings" [redact.auto.wordsToRedact] add = "Add" examples = "Examples: Confidential, Top-Secret" placeholder = "Enter a word" title = "Words to Redact" [redact.error] failed = "An error occurred while redacting the PDF." [redact.manual] apply = "Apply" applyWarning = "⚠️ Permanent application, cannot be undone and the data underneath will be deleted" colorLabel = "Redaction Color" controlsTitle = "Manual Redaction Controls" instructions = "Select text or draw areas on the PDF to mark content for redaction." notImplemented = "Manual redaction interface will be available here when implemented." title = "Redaction Tools" [redact.modeSelector] automatic = "Automatic" automaticDisabledTooltip = "Select files in the file manager to redact multiple files at once" manual = "Manual" mode = "Mode" title = "Redaction Method" [redact.tooltip.advanced.caseSensitive] text = "Only match text in the same case. 'Secret' won't match 'SECRET' when enabled, and [A-Z] in a regex only matches capitals." title = "Case Sensitive Matching" [redact.tooltip.advanced.color] text = "Customize the appearance of redaction boxes. Black is standard, but you can choose any color. Padding adds extra space around the found text." title = "Box Color & Padding" [redact.tooltip.advanced.convert] text = "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." title = "Convert to PDF-Image" [redact.tooltip.advanced.header] title = "Advanced Redaction Settings" [redact.tooltip.advanced.regex] bullet1 = "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format" bullet2 = "Use with caution - test thoroughly" text = "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns." title = "Use Regex" [redact.tooltip.advanced.wholeWord] text = "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." title = "Whole Word Search" [redact.tooltip.manual.apply] bullet1 = "Mark as many areas as needed before applying" bullet2 = "All pending redactions are applied at once" bullet3 = "Redactions cannot be undone after applying" text = "After marking content, click 'Apply' to permanently redact all marked areas. The pending count shows how many redactions are ready to be applied." title = "Apply Redactions" [redact.tooltip.manual.header] title = "Manual Redaction Controls" [redact.tooltip.manual.markArea] text = "Draw rectangular areas on the PDF to mark regions for redaction. Useful for redacting images, signatures, or irregular shapes." title = "Mark Area Tool" [redact.tooltip.manual.markText] text = "Select text directly on the PDF to mark it for redaction. Click and drag to highlight specific text that you want to redact." title = "Mark Text Tool" [redact.tooltip.mode.automatic] text = "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." title = "Automatic Redaction" [redact.tooltip.mode.header] title = "Redaction Method" [redact.tooltip.mode.manual] text = "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" title = "Manual Redaction" [redact.tooltip.words] bullet1 = "Add one word at a time" bullet2 = "Press Enter or click 'Add Another' to add" bullet3 = "Click × to remove words" [redact.tooltip.words.description] text = "Enter words or phrases to find and redact in your document. Each word will be searched for separately." title = "Text Matching" [redact.tooltip.words.examples] text = "Typical words to redact include: bank details, email addresses, or specific names." title = "Common Examples" [redact.tooltip.words.header] title = "Words to Redact" [releases] title = "Release Notes" [removeAnnotations] submit = "Remove" tags = "comments,highlight,notes,markup,remove" title = "Remove Annotations" [removeAnnotations.error] failed = "An error occurred while removing annotations from the PDF." [removeAnnotations.info] description = "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." [removeAnnotations.settings] title = "Settings" [removeAnnotations.tooltip.description] title = "What it does" [removeAnnotations.tooltip.header] title = "About Remove Annotations" [removeBlanks] submit = "Remove blank pages" tags = "delete,clean,empty,remove blank,delete blank pages,empty pages,white pages,remove empty,clean up,cleanup blank" title = "Remove Blanks" [removeBlanks.error] failed = "Failed to remove blank pages" [removeBlanks.includeBlankPages] label = "Include detected blank pages" [removeBlanks.results] title = "Removed Blank Pages" [removeBlanks.settings] title = "Settings" [removeBlanks.threshold] label = "Pixel Whiteness Threshold" [removeBlanks.tooltip.header] title = "Remove Blank Pages Settings" [removeBlanks.tooltip.includeBlankPages] bullet1 = "Useful for reviewing what was removed" bullet2 = "Helps verify the detection accuracy" bullet3 = "Can be disabled to reduce output file size" text = "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document." title = "Include Detected Blank Pages" [removeBlanks.tooltip.threshold] bullet1 = "0 = Pure black (most restrictive)" bullet2 = "128 = Medium gray" bullet3 = "255 = Pure white (least restrictive)" text = "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page." title = "Pixel Whiteness Threshold" [removeBlanks.tooltip.whitePercent] 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" text = "Sets the minimum percentage of white pixels required for a page to be considered blank and removed." title = "White Percentage Threshold" [removeBlanks.whitePercent] label = "White Percentage Threshold" [removeCertSign] description = "This tool will remove digital certificate signatures from your PDF document." submit = "Remove Signature" tags = "authenticate,PEM,P12,official,decrypt" title = "Remove Certificate Signature" [removeCertSign.error] failed = "An error occurred while removing certificate signatures." [removeCertSign.results] title = "Certificate Removal Results" [removeImage] submit = "Remove image" tags = "remove,delete,clean,remove image,delete image,strip images,remove pictures,delete photos,clean images,reduce size,remove graphics" title = "Remove image" [removeImage.error] failed = "Failed to remove images from the PDF." [removeImage.results] title = "Remove Images Results" [removeImagePdf] tags = "Remove Image,Page operations,Back end,server side" [removePages] submit = "Remove Pages" tags = "Remove pages,delete pages" title = "Remove Pages" [removePages.error] failed = "An error occurred while removing pages." [removePages.pageNumbers] error = "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" label = "Pages to Remove" placeholder = "e.g., 1,3,5-8,10" [removePages.results] title = "Page Removal Results" [removePages.settings] title = "Settings" [removePages.tooltip.examples] 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" text = "Here are some common page selection patterns:" title = "Common Examples" [removePages.tooltip.header] title = "Remove Pages Settings" [removePages.tooltip.pageNumbers] 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)" text = "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions." title = "Page Selection" [removePassword] appliesTo = "Set on {{count}} of {{total}} PDFs" keepBlank = "Leave a field blank to keep that password." notSet = "Not set" openWithReaderFirst = "Reopen this PDF using its opening password before removing only the permissions password." selectiveHelp = "Enter the current password for each protection you want to remove. A blank field keeps that password. Removing the permissions password also removes action restrictions." selectPasswords = "Passwords to remove" submit = "Remove Password" tags = "secure,Decrypt,security,unpassword,delete password" title = "Remove Password" [removePassword.error] failed = "An error occurred while removing the password from the PDF." [removePassword.password] label = "Current Password" placeholder = "Enter current password" [removePassword.results] title = "Updated PDFs" [reorganizePages] submit = "Reorganize Pages" tags = "rearrange,reorder,organize,reorganize,move pages,page order,sort pages,arrange pages,shuffle,resequence" [reorganizePages.error] failed = "Failed to reorganize pages" [reorganizePages.results] title = "Pages Reorganized" [reorganizePages.settings] title = "Settings" [repair] description = "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required." submit = "Repair" tags = "fix,restore,correction,recover" title = "Repair" [repair.error] failed = "An error occurred while repairing the PDF." [repair.results] title = "Repair Results" [replace-color] submit = "Replace" title = "Replace-Invert-Color" [replace-color.selectText] 1 = "Replace or invert color options" 10 = "Choose text Color" 11 = "Choose background Color" 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" [replaceColor] tags = "Replace Color,Page operations,Back end,server side" [replaceColor.error] failed = "An error occurred while processing the color replacement." [replaceColor.labels] colourOperation = "Color operation" settings = "Settings" [replaceColor.options] cmyk = "Convert to CMYK" custom = "Custom" highContrast = "High contrast" invertAll = "Invert all colors" [replaceColor.tooltip.cmyk] text = "Convert the PDF from RGB color space to CMYK color space, optimized for professional printing. This process converts colors to the Cyan, Magenta, Yellow, Black model used by printers." title = "Convert to CMYK" [replaceColor.tooltip.custom] bullet1 = "Text color - Choose the color for text elements" bullet2 = "Background color - Set the background color for the document" text = "Define your own text and background colors using the color pickers. Perfect for creating branded documents or specific accessibility requirements." title = "Custom Colors" [replaceColor.tooltip.description] text = "Transform PDF colors to improve readability and accessibility. Choose from high contrast presets, invert all colors, or create custom color schemes." title = "Description" [replaceColor.tooltip.header] title = "Replace & Invert Color Settings Overview" [replaceColor.tooltip.highContrast] 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" text = "Apply predefined high contrast color combinations designed for better readability and accessibility compliance." title = "High Contrast" [replaceColor.tooltip.invertAll] text = "Completely invert all colors in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." title = "Invert All Colors" [rotate] rotateLeft = "Rotate Counterclockwise" rotateRight = "Rotate Clockwise" selectRotation = "Select Rotation Angle (Clockwise)" submit = "Apply Rotation" tags = "turn,flip,orient,rotate,orientation,landscape,portrait,90 degrees,180 degrees,clockwise,counterclockwise,counter-clockwise,fix orientation" title = "Rotate PDF" [rotate.error] failed = "An error occurred while rotating the PDF." [rotate.preview] title = "Rotation Preview" [rotate.settings] title = "Settings" [rotate.tooltip.controls] text = "Use the rotation buttons to adjust orientation. Left button rotates counterclockwise, right button rotates clockwise. Each click rotates by 90 degrees." title = "Controls" [rotate.tooltip.description] text = "Rotate your PDF pages clockwise or counterclockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." [rotate.tooltip.header] title = "Rotate Settings Overview" [ruler] clearAll = "Clear all" hideAllLabels = "Hide all labels" hideSmallLabels = "Hide small labels" physicalValues = "Physical" scaled = "Scaled" showAllLabels = "Show all labels" [ruler.units] cm = "Centimeters (cm)" ft = "Feet (ft)" in = "Inches (in)" km = "Kilometers (km)" m = "Meters (m)" mi = "Miles (mi)" mm = "Millimeters (mm)" yd = "Yards (yd)" [runLocation] back = "Back" continue = "Continue" subtitle = "Choose where it runs." title = "Where do you want to run ZhmmCloud?" [runLocation.choice.browser] description = "The web app." title = "In your browser" [runLocation.choice.computer] description = "The desktop app." title = "On your computer" [runLocation.choice.server] description = "Self-hosted, for a team." title = "On your server" [runLocation.desktop] computerLabel = "Your computer" download = "Download for {{platform}}" downloadAgain = "Download again" guide = "Open the {{platform}} install guide" startedSubtitle = "Check your Downloads folder, then open the installer." startedTitle = "Your download has started" subtitle = "Download it and open it." title = "Get the desktop app" [runLocation.desktop.platform] linux = "Linux" mac = "Mac" windows = "Windows" [runLocation.desktop.target] linuxAppImage = "Linux · AppImage" linuxArm64 = "Linux · Arm (install guide)" linuxDeb = "Linux · .deb" linuxRpm = "Linux · .rpm" mac = "Mac" windowsArm64 = "Windows · Arm" windowsX64 = "Windows · x64" [runLocation.server] copied = "Copied" copy = "Copy command" copyCompose = "Copy compose file" guide = "{{method}} install guide" methodLabel = "Run it with" note = "Then open to finish setup." subtitle = "Run this on your server, then open it in a browser." title = "Set up your server" [runLocation.server.method] compose = "Docker Compose" docker = "Docker" kubernetes = "Kubernetes" manual = "Java (JAR)" [sanitize] desc = "Remove potentially harmful elements from PDF files." sanitizationResults = "Sanitization Results" submit = "Sanitize PDF" tags = "clean,purge,remove,sanitize,remove scripts,remove javascript,remove metadata,strip metadata,security,clean document,remove hidden data,privacy" title = "Sanitize" [sanitize.error] failed = "An error occurred while sanitizing the PDF." [sanitize.options] note = "Select the elements you want to remove from the PDF. At least one option must be selected." title = "Sanitization Options" [sanitize.options.removeEmbeddedFiles] desc = "Remove any files embedded within the PDF" label = "Remove Embedded Files" [sanitize.options.removeFonts] desc = "Remove embedded fonts from the PDF" label = "Remove Fonts" [sanitize.options.removeJavaScript] desc = "Remove JavaScript actions and scripts from the PDF" label = "Remove JavaScript" [sanitize.options.removeLinks] desc = "Remove external links and launch actions from the PDF" label = "Remove Links" [sanitize.options.removeMetadata] desc = "Remove document information metadata (title, author, etc.)" label = "Remove Document Metadata" [sanitize.options.removeXMPMetadata] desc = "Remove XMP metadata from the PDF" label = "Remove XMP Metadata" [sanitize.steps] settings = "Settings" [sanitizePDF] title = "Sanitize PDF" [sanitizePdf] tags = "clean,secure,safe,remove-threats" [scalePages] tags = "resize,adjust,scale,page size,resize page,scale page,change size,adjust size,enlarge,shrink page,fit to page,A4,letter size" title = "Adjust page-scale" [scaleSettings] activeScale = "Active Scale" apply = "Apply Scale" applyCalibration = "Apply Calibration" calculatedScale = "Calculated scale" calibrate = "Calibrate" calibrating = "Calibrating" calibrationDistanceRequired = "Enter a real-world distance greater than zero" calibrationInvalid = "Unable to calculate scale from this measurement" calibrationPaperDistance = "Measured page distance: {{distance}}" calibrationTitle = "Calibrate Scale" calibrationTooltip = "Measure a known distance to calculate the scale automatically" customScale = "Custom Scale" customUnit = "{{unit}} (custom)" noneSet = "No custom scale set" presets = "Preset Scales" ratio = "Scale Ratio" ratioHelp = "Ratio: 1 page unit = X real-world units" ratioPlaceholder = "e.g., 100" ratioPositive = "Ratio must be greater than zero" ratioRequired = "Ratio is required" realDistance = "Real-world distance" realDistancePlaceholder = "e.g., 5" reset = "Reset to Defaults" unit = "Unit" unitInvalid = "Invalid unit: {{scaleUnit}}" [scannerEffect] tags = "scan,simulate,create,fake scan,look scanned,scanner effect,make look scanned,photocopy effect,simulate scanner,realistic scan" [scannerImageSplit] submit = "Extract Image Scans" tags = "separate,auto-detect,scans,multi-photo,organize" title = "Extracted Images" [scannerImageSplit.error] failed = "An error occurred while extracting image scans." [scannerImageSplit.settings] title = "Settings" [scannerImageSplit.tooltip] headsUp = "Heads-up" headsUpDesc = "Overlapping photos or backgrounds very close in color to the photos can reduce accuracy-try a lighter or darker background and leave more space." 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" quickFixes = "Quick fixes" 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" title = "Photo Splitter" 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" 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" [ScannerImageSplit.selectText] 1 = "Angle Threshold:" 10 = "Extra padding (in pixels) around each saved photo so edges aren't cut." 2 = "Tilt (in degrees) needed before we auto-straighten a photo." 3 = "Tolerance:" 4 = "How closely a color must match the page background to count as background. Higher = looser, lower = stricter." 5 = "Minimum Area:" 6 = "Smallest photo size (in pixels²) we'll keep to avoid tiny fragments." 7 = "Minimum Contour Area:" 8 = "Smallest edge/shape we consider when finding photos (filters dust and specks)." 9 = "Border Size:" [search] noResults = "No results found" placeholder = "Enter search term..." searching = "Searching..." title = "Search PDF" [selfHosted.offline] hideTools = "Hide unavailable tools ▴" messageNoFallback = "Tools are unavailable until your server comes back online." messageWithFallback = "Some tools require a server connection." showTools = "View unavailable tools ▾" title = "Your ZhmmCloud PDF server is unreachable" toolNotAvailableLocally = "Your ZhmmCloud PDF server is offline and \"{{endpoint}}\" is not available on the local backend." [session] expired = "Your session has expired. Please refresh the page and try again." [settings] backToSections = "All settings" title = "Settings" [settings.about] description = "Tours, legal documents and the licences of everything bundled with this build." title = "About" [settings.ai] documents = "Documents & RAG" general = "AI Engine" limits = "Limits & Performance" models = "Models & Providers" title = "AI" [settings.billing] title = "Billing" [settings.configuration] advanced = "Advanced" connections = "Single sign-on" database = "Database" endpoints = "Endpoints" features = "Features" folderAccess = "Folder Access" integrations = "Integrations" legal = "Legal documents" mcp = "MCP Server" privacy = "Privacy" storageSharing = "File Storage & Sharing" systemSettings = "System Settings" [settings.connectedInstances] confirmBody = "This revokes the instance’s access to your team in ZhmmCloud. It does not delete local files or remove usage already recorded. To connect again, follow the original connection steps on the instance." confirmTitle = "Remove {{name}}?" connectedAt = "Connected: {{date}}" connectedDate = "Connected" connectHelp = "To connect a server, open Settings → Account connection on your self-hosted instance and follow the connection steps." copied = "ID copied" copyError = "Couldn’t copy the ID. Select it to copy manually." copyId = "Copy ID" details = "Details" displayName = "Display name (optional)" editName = "Edit name" empty = "No connected instances" id = "Instance ID" justConnected = "Connected just now" lastSeen = "Last seen: {{date}}" loadError = "Couldn’t load connected instances" loadErrorBody = "Your connections could not be checked. Try again." loading = "Loading connected instances" ownerOnly = "Only the team owner can manage connected instances." remove = "Remove connection" removedSuccess = "{{name}} has been disconnected from your team." removeError = "Couldn’t remove the connection. Try again." renameError = "Couldn’t save the name. Try again." retry = "Try again" saveName = "Save name" seatsReported = "{{count}} Team seats · reported {{date}}. Offline deployments keep their seats until unlinked." seatsUnknown = "Waiting for this deployment to report its user count in the daily sync." subtitle = "Manage the self-hosted servers connected to your team." teamNote = "These instances share your team’s processing allowance." title = "Connected instances" unknown = "Not available" yourTeam = "Your team" [settings.connection] description = "Work locally on this machine or connect the app to a ZhmmCloud server." localDescription = "You are using the local backend without an account. Some tools requiring cloud processing or a self-hosted server are unavailable." logout = "Log Out" server = "Server" signIn = "Sign In" title = "Connection Mode" user = "Logged in as" [settings.connection.mode] local = "Local Only" saas = "ZhmmCloud" selfhosted = "Self-Hosted" [settings.developer] apiKeys = "API Keys" apiKeysDescription = "Personal keys for calling the ZhmmCloud API from scripts and integrations." title = "Developer" [settings.general] autoUnzip = "Auto-unzip API responses" autoUnzipFileLimit = "Auto-unzip file limit" autoUnzipFileLimitTooltip = "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs." autoUnzipTooltip = "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows." defaultPdfEditor = "Default PDF editor" defaultPdfEditorActive = "ZhmmCloud PDF is your default PDF editor" defaultPdfEditorChecking = "Checking..." defaultPdfEditorInactive = "Another application is set as default" defaultPdfEditorSet = "Already Default" defaultStartupView = "Default view on launch" defaultStartupViewDescription = "Choose which view is active when the app starts" defaultToolPickerMode = "Default tool picker mode" defaultToolPickerModeDescription = "Choose whether the tool picker opens in fullscreen or sidebar by default" defaultViewerZoom = "Default reader zoom" defaultViewerZoomDescription = "Set the default zoom level when opening PDFs in the reader" description = "Configure general application preferences." hideUnavailableConversions = "Hide unavailable conversions" hideUnavailableConversionsDescription = "Remove disabled conversion options in the Convert tool instead of showing them grayed out." hideUnavailableTools = "Hide unavailable tools" hideUnavailableToolsDescription = "Remove tools that have been disabled by your server instead of showing them grayed out." language = "Language" languageDescription = "Choose the display language" logout = "Log out" setAsDefault = "Set as Default" theme = "Theme" themeAccent = "Accent colour" themeAccentCustom = "Custom colour" themeAccentCustomHint = "Custom (defaults recommended)" themeAccentDark = "Dark mode accent colour" themeAccentDefault = "Default" themeAccentDefaultHint = "Default theme (recommended)" themeAccentDescription = "Buttons, links and highlights follow it, and it subtly tints the app. Light and dark each have their own. System uses whichever is active." themeAccentLight = "Light mode accent colour" themeDark = "Dark" themeDescription = "Choose light, dark, or follow your system so it switches automatically." themeLight = "Light" themeReset = "Restore theme to default" themeSystem = "System" title = "General" user = "User" [settings.general.enableFeatures] action = "Configure" and = "and" benefit = "Enables user roles, team collaboration, admin controls, and enterprise features." dismiss = "Dismiss" intro = "Enable user authentication, team management, and workspace features for your organization." learnMore = "Learn more in documentation" title = "For System Administrators" [settings.general.mode] fullscreen = "Fullscreen" sidebar = "Sidebar" [settings.general.startupView] automate = "Automate" read = "Reader" tools = "Tools" [settings.general.updates] checkForUpdates = "Check for Updates" currentBackendVersion = "Current Backend Version" currentFrontendVersion = "Current Frontend Version" description = "Check for updates and view version information" latestVersion = "Latest Version" managedByAdmin = "Managed by administrator" modeAuto = "Install updates automatically" modeDisabled = "Don't check for updates" modePrompt = "Ask me before installing updates" serverNeedsUpdate = "Server needs to be updated by administrator" title = "Software Updates" updateBehavior = "Update behavior" updateBehaviorDescription = "Choose whether to prompt before installing updates, install them automatically, or skip update checks entirely." updateBehaviorError = "Could not change update behavior" updateBehaviorErrorLocked = "This setting is locked by your administrator." updateBehaviorLockedDescription = "Your administrator has configured how ZhmmCloud PDF handles updates on this machine. Contact them to change this." updateBehaviorSaved = "Update behavior saved." versionMismatch = "Your desktop application and server are running different versions. Update both to the same version to avoid compatibility issues." viewDetails = "View Details" [settings.general.versionInfo] description = "Desktop and server version details" desktop = "Desktop Version" server = "Server Version" title = "Version Information" [settings.general.zoomLevel] auto = "Auto" fitPage = "Fit page" fitWidth = "Fit width" [settings.help] description = "Guided walkthroughs of the editor and the admin area." label = "Tours" title = "Help" [settings.help.adminTour] description = "Explore team management, system settings, and enterprise features." start = "Start" title = "Admin Tour" [settings.help.toolsTour] description = "Walk through uploading files, picking a tool, and reviewing results." start = "Start" title = "Tools Tour" [settings.hotkeys] capturing = "Press keys… (Esc to cancel)" change = "Change shortcut" customBadge = "Custom" defaultLabel = "Default: {{shortcut}}" description = "Customize keyboard shortcuts for quick tool access. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel." errorConflict = "Shortcut already used by {{tool}}." none = "Not assigned" noShortcut = "No shortcut set" reset = "Reset" searchPlaceholder = "Search tools..." shortcut = "Shortcut" title = "Keyboard Shortcuts" [settings.hotkeys.errorModifier] mac = "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut." windows = "Include Ctrl, Alt, or another modifier in your shortcut." [settings.legal] description = "Terms, privacy policy and your cookie preferences." label = "Legal" title = "Legal" [settings.legal.cookiePreferences] description = "Review or change your cookie consent choices." manage = "Manage" [settings.legal.documents] description = "Policies and legal information for this service." title = "Legal Documents" [settings.licenses] backendDescription = "Licenses for backend dependencies bundled with this server." backendLabel = "Backend Licenses" backendTitle = "Backend 3rd Party Licenses" empty = "No dependencies found." frontendDescription = "Licenses for frontend dependencies bundled into the release build." frontendLabel = "Frontend Licenses" frontendTitle = "Frontend 3rd Party Licenses" license = "License" listDescription = "The list is shown directly in the UI from the release bundle or backend endpoint." listTitle = "Bundled dependencies" loadError = "Failed to load third-party licenses" module = "Module" version = "Version" [settings.licensingAnalytics] audit = "Audit log" auditDescription = "Who did what on this server, and how long that record is kept." plan = "Plan" planDescription = "Your licence, seats and what the current plan unlocks." usage = "Usage Analytics" usageAnalytics = "Usage Analytics" usageDescription = "How the server is being used: operations, volume and trends over time." [settings.monitoring] title = "Monitoring" [settings.planBilling] currentPlan = "Current Plan" loading = "Loading billing information..." notAvailable = "Plan & Billing is only available when connected to ZhmmCloud (SaaS mode)." title = "Plan & Billing" [settings.planBilling.billing] manageBilling = "Manage Billing" nextBillingDate = "Next billing date" overageCost = "Current overage cost: {{amount}} ({{credits}} credits)" [settings.planBilling.credits] estimatedCost = "Estimated cost: {{amount}}" freeTierInfo = "Free plan includes {{freeCredits}} credits per month. Upgrade to Team for {{teamCredits}} credits/month and pay-as-you-go overage billing." included = "{{count}} credits/month (included)" noOverage = "No overage charges this month. You're using your included {{count}} credits." overage = "+ {{count}} overage" overageInfo = "Overage credits are billed at {{price}} per credit. You'll only pay for what you use beyond your monthly allowance." title = "Credit Usage" [settings.planBilling.errors] fetchFailed = "Unable to fetch billing data" retry = "Retry" [settings.planBilling.status] active = "Active" canceled = "Canceled" pastDue = "Past Due" trial = "Trial" [settings.planBilling.team] managedByTeam = "Managed by team" memberCount_one = "{{count}} team member" memberCount_other = "{{count}} team members" memberCount_zero = "no team members" [settings.planBilling.trial] daysRemaining = "{{days}} days remaining" daysRemainingFull = "Your trial ends in {{days}} days" endDate = "Expires: {{date}}" endsOn = "Trial ends" title = "Free Trial Active" [settings.planBilling.upgrade] cta = "Upgrade to Team" featureApi = "API access for automation" featureCredits = "{{teamCredits}} credits per month (vs {{freeCredits}} on Free)" featureMembers = "Unlimited team members" featureSupport = "Priority support" featureThroughput = "Faster processing throughput" opensInBrowser = "Opens in browser to complete upgrade" subtitle = "Upgrade to Team for:" title = "Upgrade Your Plan" [settings.policiesPrivacy] legal = "Legal documents" privacy = "Privacy" title = "Legal & privacy" [settings.preferences] appearance = "Appearance" description = "How the editor looks and behaves for you, and your account." downloads = "Downloads" editorDefaults = "Editor defaults" title = "Preferences" [settings.security] description = "Update your password to keep your account secure." title = "Security" [settings.security.password] confirm = "Confirm new password" confirmPlaceholder = "Re-enter your new password" current = "Current password" currentPlaceholder = "Enter your current password" error = "Unable to update password. Please verify your current password and try again." mismatch = "New passwords do not match." new = "New password" newPlaceholder = "Enter a new password" required = "All fields are required." ssoDisabled = "Password changes are managed by your identity provider." subtitle = "Change your password. You will be logged out after updating." success = "Password updated successfully. Please sign in again." update = "Update password" [settings.securityAuth] connections = "Single sign-on" security = "Sign-in & security" telegram = "Telegram" title = "Security & sign-in" [settings.server] system = "System" title = "Server" [settings.signOut] confirm = "Are you sure you want to sign out?" submit = "Sign out" title = "Sign out" [settings.team] title = "Team" [settings.tooltips] enableLoginFirst = "Enable login mode first" requiresEnterprise = "Requires Enterprise license" [settings.workspace] people = "People" teams = "Teams" title = "Workspace" [setup.error] loginIncomplete = "Failed to complete login" noSaasServer = "No SaaS server configured" noServer = "No server configured" policyUnavailable = "Unable to load your organisation's sign-in settings." saasLoginFailed = "SaaS login failed" saasLoginIncomplete = "Failed to complete SaaS login" selfHostedLoginFailed = "Self-hosted login failed" signupIncomplete = "Failed to complete signup" [setup.login] connectingTo = "Connecting to:" oauthPending = "Opening browser for authentication..." orContinueWith = "Or continue with email" skipSignIn = "Continue without signing in" sso = "Single Sign-On" submit = "Login" [setup.login.error] emptyEmail = "Please enter your email" emptyPassword = "Please enter your password" emptyUsername = "Please enter your username" oauthFailed = "OAuth login failed. Please try again." [setup.saas] title = "Sign in to ZhmmCloud" [setup.selfhosted] changeServerLocked = "Your organization has restricted this app to a specific server" link = "or connect to a self-hosted account" subtitle = "Enter your server credentials" switchToLocal = "Use local tools instead" title = "Sign in to Server" [setup.selfhosted.unreachable] changeServer = "Connect to a different server" continueOffline = "Use local tools instead" message = "Could not reach {{url}}. Check that the server is running and accessible." retry = "Retry" title = "Cannot connect to server" [setup.server] subtitle = "Enter your self-hosted server URL" testing = "Testing connection..." title = "Connect to Server" useLast = "Last used server: {{serverUrl}}" [setup.server.error] configFetch = "Failed to fetch server configuration (status {{status}})" configFetchError = "Failed to fetch server configuration: {{error}}" dnsFailed = "Cannot resolve hostname: {{hostname}}" emptyUrl = "Please enter a server URL" httpOnly = "Server is only accessible via HTTP (not HTTPS)." httpsOnly = "Server is only accessible via HTTPS, not HTTP." invalidUrl = "Invalid URL format. Please enter a valid URL like https://your-server.com" methodMismatch = "Server responds to HEAD requests but not GET requests." networkBlocked = "No internet connectivity detected. All network requests are failing." serverUnreachable = "Cannot connect to server. Internet works but this specific server is unreachable." testFailed = "Connection test failed" unknown = "Unknown error" unreachable = "Could not connect to server" userAgentBlocked = "Server blocks Tauri/desktop app User-Agent but allows browser User-Agent." [setup.server.error.securityDisabled] body = "This server does not have login enabled. To connect to this server, you must enable authentication:" step1 = "Set DOCKER_ENABLE_SECURITY=true in your environment" step2 = "Or set security.enableLogin=true in settings.yml" step3 = "Restart the server" title = "Login Not Enabled" [setup.server.url] description = "Enter the full URL of your self-hosted ZhmmCloud PDF server" label = "Server URL" [sharedSign] disabledBody = "Collaborative signing isn't enabled on this server." filterDeclined = "Declined" filterOverdue = "Overdue" filterSigned = "Signed" signInRequiredBody = "Sign in to request signatures and see requests sent to you." signInRequiredTitle = "Sign in required" [sharedSign.tab] active = "Active" [showJS] done = "JavaScript extracted" processing = "Extracting JavaScript..." results = "Result" submit = "Show" tags = "JS" title = "Show Javascript" [showJS.view] title = "Extracted JavaScript" [sign] activate = "Activate Signature Placement" add = "Add" addToAll = "Add to all pages" applySignatures = "Apply Signatures" clear = "Clear" deactivate = "Stop Placing Signatures" delete = "Delete" first = "First page" header = "Sign PDFs" last = "Last page" maintainRatio = "Toggle maintain aspect ratio" next = "Next page" noSavedSigs = "No saved signatures found" penSizePlaceholder = "Type or select pen size (1-200)" personalSigs = "Personal Signatures" previous = "Previous page" redo = "Redo" save = "Save Signature" sharedSigningOpen = "Open shared signing" sharedSigningRequest = "Request signatures" sharedSigningStepDesc = "Send this document to others to sign instead of signing it yourself." sharedSigs = "Shared Signatures" submit = "Sign Document" tags = "signature,autograph,e-sign,electronic signature,digital signature,sign document,approval,signoff,authorize,endorse,ink signature,handwriting" title = "Sign" undo = "Undo" updateAndPlace = "Update and Place" upload = "Upload Image" [sign.canvas] clear = "Clear canvas" clickToOpen = "Click to open the drawing canvas" colorLabel = "Color" colorPickerTitle = "Choose stroke color" heading = "Draw your signature" modalTitle = "Draw your signature" penSizeLabel = "Pen size" penSizePlaceholder = "Size" [sign.draw] clear = "Clear" title = "Draw your signature" [sign.error] failed = "An error occurred while signing the PDF." [sign.image] backgroundRemovalFailedMessage = "Could not remove the background from the image. Using original image instead." backgroundRemovalFailedTitle = "Background removal failed" hint = "Upload a PNG or JPG image of your signature" label = "Upload signature image" placeholder = "Select image file" previewAlt = "Current image signature" processing = "Processing image..." removeBackground = "Remove white background (make transparent)" [sign.instructions] 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." noSignature = "Create a signature above to enable placement tools." paused = "Placement paused" placeAnnotation = "Click anywhere on the PDF to place your annotation." resumeHint = "Resume placement to click and add your signature." saved = "Select a saved signature above, then click anywhere on the PDF to place it." text = "After entering your name above, click anywhere on the PDF to place your signature." title = "How to add signature" [sign.mobile] createFromPhone = "Mobile upload" description = "Scan this QR code with your phone or tablet, draw your signature, and it will appear here automatically." error = "Connection Error" expiryWarning = "QR Code Expiring Soon" expiryWarningMessage = "This QR code will expire in {{seconds}} seconds. A new code will be generated automatically." instructions = "Open the camera app on your phone and scan this code. Keep this window open while you draw." pollingError = "Error checking for the signature" sessionCreateError = "Failed to create session" title = "Draw on your phone" [sign.mode] move = "Move Signature" pause = "Pause placement" place = "Place Signature" resume = "Resume placement" [sign.results] title = "Signature Results" [sign.saved] carouselPosition = "{{current}} of {{total}}" defaultCanvasLabel = "Drawing signature" defaultImageLabel = "Uploaded signature" defaultLabel = "Signature" defaultTextLabel = "Typed signature" delete = "Remove" description = "Reuse saved signatures at any time." emptyDescription = "Draw, upload, or type a signature above, then use \"Save to library\" to keep up to {{max}} favorites ready to use." emptyTitle = "No saved signatures yet" heading = "Saved signatures" label = "Label" limitDescription = "Remove a saved signature before adding new ones (max {{max}})." limitTitle = "Limit reached" next = "Next" noChanges = "Current signature is already saved." personalDescription = "Only you can see these signatures." personalHeading = "Personal Signatures" prev = "Previous" saveButton = "Save signature" savePersonal = "Save Personal" saveShared = "Save Shared" saveUnavailable = "Create a signature first to save it." sharedDescription = "All users can see and use these signatures." sharedHeading = "Shared Signatures" tempStorageDescription = "Signatures are stored in your browser only. They will be lost if you clear browser data or switch browsers." tempStorageTitle = "Temporary browser storage" use = "Use signature" [sign.saved.status] saved = "Saved" [sign.saved.type] canvas = "Drawing" image = "Upload" text = "Text" [sign.step] createDesc = "Choose how you want to create the signature" place = "Place & save" placeDesc = "Position the signature on your PDF" [sign.steps] configure = "Configure Signature" [sign.text] colorLabel = "Text color" fontLabel = "Font" fontSizeLabel = "Font size" fontSizePlaceholder = "Type or select font size (8-200)" name = "Text" placeholder = "Enter text" [sign.type] canvas = "Canvas" draw = "Draw" image = "Image" saved = "Saved" text = "Text" title = "Signature Type" [sign.wallet] apply_one = "Apply {{count}} signature" apply_other = "Apply {{count}} signatures" applyEmpty = "Apply signatures" count = "{{count}} of {{max}}" default = "Default" loading = "Loading your signatures..." new = "New signature" shared = "Shared" sharedHint = "Everyone can use these" unsaved = "Unsaved" yours = "Your signatures" [sign.wallet.create] cancel = "Cancel" full = "Your library is full ({{max}} signatures). Delete one to save more." makeDefault = "Make default" method = "How to create it" name = "Name" save = "Save to my signatures" saveBrowserHint = "Kept in this browser, ready for next time." saveHint = "Ready to reuse next time you sign." subtitle = "Create it once, reuse it on any document." title = "New signature" use = "Use signature" who = "Who can use it" whoEveryone = "Everyone" whoMe = "Only me" [sign.wallet.defaultName] draw = "My signature" initials = "Initials" phone = "Phone signature" type = "Typed signature" upload = "Uploaded signature" [sign.wallet.delete] body = "\"{{name}}\" is removed from your signatures. Documents you already signed keep it." confirm = "Delete" title = "Delete this signature?" [sign.wallet.draw] bold = "Bold pen" clear = "Clear" fine = "Fine pen" hint = "Sign above the line" medium = "Medium pen" pad = "Signature pad" pen = "Pen" tip = "Use a mouse, trackpad, pen or finger" undo = "Undo" [sign.wallet.ink] black = "Black ink" blue = "Blue ink" label = "Ink" navy = "Navy ink" [sign.wallet.intro] body = "Create it once. It is saved here, ready for every document you sign." privacy = "Saved signatures are private to you unless you choose to share them." privacyBrowser = "Saved signatures stay in this browser." title = "Add your signature" [sign.wallet.menu] delete = "Delete" discard = "Discard" makeDefault = "Make default" options = "Options for {{name}}" place = "Place on page" removeDefault = "Remove as default" rename = "Rename" save = "Save to my signatures" share = "Share with everyone" stop = "Stop placing" [sign.wallet.phone] expires = "Expires in {{time}}" qr = "QR code to sign on your phone" received = "Received from your phone" receiveFailed = "Could not read that signature. Scan the new code to try again." step1 = "Scan the code with your phone camera" step1Hint = "It opens in the phone browser, no app needed." step2 = "Draw, type or photograph your signature" step2Hint = "A big canvas made for a finger." step3 = "It appears here automatically" step3Hint = "Keep this window open while you sign." waiting = "Waiting for your phone..." [sign.wallet.placed] empty = "Signatures you place on the page are listed here." fallbackName = "Signature" page = "Page {{page}}" remove = "Remove {{name}}" show = "Show {{name}} on the page" title = "On this document ({{count}})" [sign.wallet.rename] save = "Save" title = "Rename signature" [sign.wallet.status] idle = "Pick a signature to place it" placing = "Click the page to place {{name}}." stop = "Stop" [sign.wallet.tabs] draw = "Draw" phone = "Phone" type = "Type" upload = "Upload" [sign.wallet.toast] applyFailed = "Could not apply signatures" applyFailedBody = "Your signatures are still on the document. Try again." deleteFailed = "Could not delete the signature" draftExists = "Save or discard your unsaved signature first" initialsFailed = "Could not save your initials" initialsPartial = "Your signature was saved, but your initials were not. Try saving your initials separately." renameFailed = "Could not rename the signature" saved = "Saved to your signatures" saveFailed = "Could not save the signature" saveFailedBody = "It is still ready to place on this document." shared = "Shared with everyone" shareFailed = "Could not share the signature" [sign.wallet.type] initials = "Initials" initialsLimit = "Saving initials needs two free signature slots." name = "Your name" namePlaceholder = "Type your name" previewName = "Your name" saveInitials = "Also save my initials" style = "Style" styleOption = "Style {{index}}" [sign.wallet.upload] browse = "or browse files" drop = "Drop an image here" failed = "Could not read that image." hint = "PNG, JPG or WebP up to {{size}} MB. White backgrounds are removed automatically." ink = "Ink color" inkBlack = "Black" inkBlue = "Blue" inkOriginal = "Original" preview = "Uploaded signature preview" processing = "Cleaning up the image..." rejected = "Choose a PNG, JPG or WebP image up to {{size}} MB." removeBackground = "Remove background" removeBackgroundHint = "White paper becomes transparent" replace = "Replace" rotate = "Rotate" rotateLeft = "Rotate left" rotateRight = "Rotate right" trim = "Trim to signature" trimHint = "Crops the empty space around it" [signatureSettings.tooltip] header = "Signature Appearance Settings" [signatureSettings.tooltip.location] bullet1 = "Examples: \"New York, USA\", \"London Office\", \"Remote\"" bullet2 = "Not the same as page position" bullet3 = "May be required for certain legal jurisdictions" description = "Optional geographic location where the signature was applied. Stored in certificate metadata." title = "Signature Location" [signatureSettings.tooltip.logo] bullet1 = "Displayed alongside signature and text" bullet2 = "Supports PNG, JPG formats" bullet3 = "Enhances professional appearance" description = "Add a company logo to visible signatures for branding and authenticity." title = "Company Logo" [signatureSettings.tooltip.reason] bullet1 = "Examples: \"Approval\", \"Contract Agreement\", \"Review Complete\"" bullet2 = "Visible in PDF signature properties" bullet3 = "Useful for audit trails and compliance" description = "Optional text explaining why the document is being signed. Stored in certificate metadata." title = "Signature Reason" [signatureSettings.tooltip.visibility] bullet1 = "Visible: Signature appears on PDF with custom appearance" bullet2 = "Invisible: Certificate embedded without visual mark" bullet3 = "Invisible signatures still provide cryptographic validation" description = "Controls whether the signature is visible on the document or embedded invisibly." title = "Signature Visibility" [signingDetail] allSigned = "Everyone has signed. Review the document, then finalize." awaitingOwner = "The owner will finalize the document once they are ready." certificateNext = "Choose your certificate in the next step." earlyHint = "You can finalize now with the signatures received, or wait for the remaining participants." finalDocument = "Signed document" finalizeTitle = "Finalize document" finalReady = "Your signed PDF is ready to open in the workbench." inProgressPreview = "In-progress preview with submitted signatures. The owner has not finalized this document yet." manageSession = "Manage signing session" moveHint = "Select a signature on the document to move, resize or remove it." notified = "Notified" optional = "Optional" ownerNext = "Return to your session to review everyone's signatures and finalize the document when you are ready." placeHint = "Click on the document to place your signature." progress = "Signature progress" readyToSign = "Ready to sign?" refreshPreview = "Refresh preview" removePerson = "Remove {{name}}" requestClosed = "This request is closed" requestTitle = "Signature request" signatureSubmitted = "Your signature is submitted" signedCount = "{{signed}} / {{total}} signed" signMyRequest = "Sign this document" viewOnly = "You can still review the document here." visibleSignature = "Visible signature" visibleSignatureHelp = "About visible signatures" [signMenu] anyOrder = "Participants can sign in any order. The owner finalizes the document after reviewing the collected signatures." certificateHint = "Use a certificate" certificateTitle = "Digital signature" closedStatus = "Closed" completedTab = "Completed" dueDate = "Due date (optional)" newActivity = "New activity since you last viewed this session" noActive = "No active sessions" noCompleted = "No completed sessions" noMatches = "No matching sessions" noUnread = "You're all caught up" optionalMarks = "Visible marks are optional. Complete & Sign also works with a certificate alone." ownerProgress = "Your request · {{signed}} / {{total}} signed" personalHint = "Draw, type or upload" personalTitle = "Personal signature" request = "Request signatures" search = "Find a document or person" send = "Send signing request" sessionFilter = "Session views" sessions = "Signing sessions" settings = "Appearance and summary page (optional)" signFailed = "Signing failed. Check your certificate and try again; your placed marks are preserved." submitted = "Submitted · awaiting finalization" title = "Sign" triggerUnreadCount_one = "Sign · {{count}} unread session" triggerUnreadCount_other = "Sign · {{count}} unread sessions" unreadTab = "Unread" [signRequest] accessExpired = "Your access to this signing request has expired. Ask the sender for a new request." declined = "Sign request declined" expired = "Access expired" fetchFailed = "Failed to load sign request" [signSession] created = "Signing request sent" createFailed = "Failed to create signing request" [signup] accountCreatedSuccessfully = "Account created successfully! You can now sign in." alreadyHaveAccount = "I already have an account" checkEmailConfirmation = "Check your email for a confirmation link to complete your registration." confirmPassword = "Confirm password" confirmPasswordPlaceholder = "Confirm password" confirmPasswordRequired = "Please confirm your password" creatingAccount = "Creating Account..." email = "Email" emailRequired = "Email is required" enterEmail = "Enter your email" enterName = "Enter your name" enterPassword = "Enter your password" invalidEmail = "Please enter a valid email address" name = "Name" nameRequired = "Name is required" or = "or" password = "Password" passwordRequired = "Password is required" passwordsDoNotMatch = "Passwords do not match" passwordTooShort = "Password must be at least 6 characters long" pleaseFillAllFields = "Please fill in all fields" signUp = "Sign Up" signUpWith = "Sign up with" skip = "Skip" subtitle = "Join ZhmmCloud PDF to get started" title = "Create an account" unableToAccessTool = "Unable to access tool: {{error}}" unexpectedError = "Unexpected error: {{message}}" unknownError = "Unknown error" [signWorkspace] changeDocument = "Change PDF" chooseDocument = "Choose an open PDF" chooseFromLibrary = "Choose from library" chooseParticipants = "Choose participants" choosePdf = "Choose a PDF" choosePdfHeading = "Start with your document" clearDate = "Clear date" created = "Created" createdByMe = "Created by me" datesAndOptions = "Dates & options" document = "Document" dueDate = "Due date" dueDateHelp = "This is a target date. Participants can still sign after it." dueDateHelpLabel = "About due dates" empty = "No sessions here yet." expand = "Expand signing sessions" inviteLoadError = "Could not load invitation options. Close this dialog and try again." invitePerson = "Add teammate: {{name}}" inviteTeammate = "Add a teammate" inviteUnavailable = "Adding teammates is not available for your account or server configuration." navigation = "Signing navigation" needsYou = "Needs your signature" nextMonth = "Next month" nextStep = "Next" noDueDate = "No due date" noMatches = "No sessions match your search or filter." noOpenPdfs = "Choose a PDF from your library or add one from your computer." noPeopleMatch = "No people match your search." noPreview = "Document preview unavailable" owner = "Owner" participants = "Participants" participantsSelected = "{{count}} selected" personalHeading = "Sign a document" previousMonth = "Previous month" refresh = "Refresh sessions" requestSteps = "Signing request steps" search = "Search documents or people" searchParticipants = "Search people or teams" selectOnePdf = "Choose one PDF for this signing request." signingOrderHelp = "About signing order" status = "Status" unavailable = "This session is no longer available. Refresh the list to see your current sessions." upcoming = "Upcoming" uploadFailed = "Could not open this PDF. Please try again." [sizes] large = "Large" medium = "Medium" small = "Small" x-large = "X-Large" [split] resultsTitle = "Split Results" selectMethod = "Select a split method" splitPages = "Enter pages to split on:" submit = "Split" tags = "divide,separate,break,split,extract pages,separate pages,divide document,break apart,separate files,unbind,split by page,divide by chapter" title = "Split PDF" [split.error] failed = "An error occurred while splitting the PDF." [split.methods.byChapters] name = "Chapters" tooltip = "Uses PDF bookmarks to determine split points" [split.methods.byDocCount] name = "Document Count" tooltip = "Enter how many files you want to create" [split.methods.byPageCount] name = "Page Count" tooltip = "Enter the number of pages for each split file" [split.methods.byPageDivider] name = "Page Divider" tooltip = "Use QR code divider sheets between documents when scanning" [split.methods.byPages] name = "Page Numbers" tooltip = "Enter page numbers separated by commas or ranges with hyphens" [split.methods.byPoster] name = "Printable Chunks" tooltip = "Divide oversized pages into smaller chunks suitable for printing on standard paper (A4, Letter, etc.)" [split.methods.bySections] name = "Sections" tooltip = "Split each page into horizontal and vertical sections" [split.methods.bySize] name = "File Size" tooltip = "Specify maximum file size (e.g. 10MB, 500KB)" [split.methods.prefix] splitAt = "Split at" splitBy = "Split by" splitInto = "Split into" [split.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" title = "Choose Your Split Method" [split.methodSelection.tooltip.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" [split.poster] rightToLeft = "Split right-to-left" [split.poster.pageSize] description = "Size of output pages for printing" label = "Target Page Size" [split.poster.pageSize.options] a3 = "A3 (297 × 420 mm)" a4 = "A4 (210 × 297 mm)" a5 = "A5 (148 × 210 mm)" legal = "Legal (8.5 × 14 in)" letter = "Letter (8.5 × 11 in)" tabloid = "Tabloid (11 × 17 in)" [split.poster.xFactor] description = "Number of columns to split each page into" label = "Horizontal Divisions" [split.poster.yFactor] description = "Number of rows to split each page into" label = "Vertical Divisions" [split.settings] selectMethodFirst = "Please select a split method first" [split.steps] chooseMethod = "Choose Method" settings = "Settings" [split.tooltip.byChapters] bullet1 = "Bookmark Level: Which level to split on (1=top level)" bullet2 = "Include Metadata: Preserve document properties" bullet3 = "Allow Duplicates: Handle repeated bookmark names" text = "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure." title = "Split by Chapters" [split.tooltip.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" [split.tooltip.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" [split.tooltip.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" [split.tooltip.byPages] 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)" 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." title = "Split at Page Numbers" [split.tooltip.byPoster] bullet1 = "Target Page Size: Choose output paper size (A4, Letter, etc.)" bullet2 = "Horizontal/Vertical Divisions: Grid size for splitting" bullet3 = "Right-to-Left: Reverse column order for RTL layouts" bullet4 = "Print and assemble the pieces to create your poster" text = "Split large PDF pages into smaller printable chunks suitable for standard paper sizes. Perfect for creating poster prints from oversized pages." title = "Split for Poster Print" [split.tooltip.bySections] bullet1 = "Horizontal: Number of rows to create" bullet2 = "Vertical: Number of columns to create" bullet3 = "Merge: Combine all sections into one PDF" text = "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas." title = "Split by Grid Sections" [split.tooltip.bySize] 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" text = "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments." title = "Split by File Size" [split.value.docCount] label = "Number of Files" placeholder = "e.g. 3, 5" [split.value.fileSize] label = "File Size" placeholder = "e.g. 10MB, 500KB" [split.value.pageCount] label = "Pages per File" placeholder = "e.g. 5, 10" [split-by-sections] merge = "Merge Into One PDF" tags = "Section Split, Divide, Customize" title = "Split PDF by Sections" [split-by-sections.customPages] label = "Custom Page Numbers" placeholder = "e.g. 2,4,6" [split-by-sections.horizontal] label = "Horizontal Divisions" placeholder = "Enter number of horizontal divisions" [split-by-sections.splitMode] custom = "Custom pages" description = "Choose how to split the pages" label = "Split Mode" splitAll = "Split all pages" splitAllExceptFirst = "Split all except first" splitAllExceptFirstAndLast = "Split all except first and last" splitAllExceptLast = "Split all except last" [split-by-sections.vertical] label = "Vertical Divisions" placeholder = "Enter number of vertical divisions" [split-by-size-or-count] title = "Split PDF by Size or Count" [split-by-size-or-count.value] label = "Enter Value" placeholder = "Enter size (e.g., 2MB or 3KB) or count (e.g., 5)" [splitByChapters] allowDuplicates = "Allow Duplicates" bookmarkLevel = "Bookmark Level" includeMetadata = "Include Metadata" title = "Split PDF by Chapters" [splitPdfByChapters] tags = "split,chapters,bookmarks,organize" [storageShare] accessDenied = "You do not have access to this shared file. Ask the owner to share it with you." accessDeniedBody = "You do not have access to this file. Ask the owner to share it with you." accessDeniedTitle = "No access" accessed = "Accessed" accessFailed = "Unable to load activity." accessLimitedCommenter = "Comment access is coming soon. Ask the owner for editor access if you need to download." accessLimitedTitle = "Limited access" accessLimitedViewer = "This link is view-only. Ask the owner for editor access if you need to download." addUser = "Add" bulkDescription = "Create one link to share all checked files with signed-in users." bulkTitle = "Share checked files" commenterHint = "Commenting is coming soon." copied = "Link copied to clipboard" copy = "Copy" copyFailed = "Copy failed" createdAt = "Created" description = "Create a share link for this file. Signed-in users with the link can access it." download = "Download" downloaded = "Downloaded" downloadFailed = "Unable to download this file." downloadsCount = "Downloads: {{count}}" emailWarningBody = "This looks like an email address. If this person is not already a ZhmmCloud PDF user, they will not be able to access the file." emailWarningConfirm = "Share anyway" emailWarningTitle = "Email address" errorTitle = "Share failed" expiredBody = "This share link is invalid or has expired." expiredTitle = "Link expired" failure = "Unable to generate a share link. Please try again." fileCount_one = "{{count}} file" fileCount_other = "{{count}} files" fileLabel = "File" generate = "Generate Link" generated = "Share link generated" goToLogin = "Go to login" hideActivity = "Hide activity" invalidUsername = "Enter a valid username or email address." lastAccessed = "Last accessed" linkAccessTitle = "Share link access" linkLabel = "Share link" linksDisabled = "Share links are disabled." linksDisabledBody = "Share links are disabled by your server settings." loadFailed = "Unable to open shared file." loading = "Loading share link..." loginPrompt = "Sign in to access this shared file." loginRequired = "Login required" manage = "Manage sharing" manageDescription = "Create and manage links to share this file." manageLoadFailed = "Unable to load share links." manageTitle = "Manage Sharing" noActivity = "No activity yet." noLinks = "No active share links yet." noSharedUsers = "No users have access yet." openInApp = "Open in ZhmmCloud PDF" ownerLabel = "Owner" ownerUnknown = "Unknown" removeLink = "Remove link" removeUser = "Remove" requiresLogin = "This shared file requires login." revoked = "Share link removed" revokeFailed = "Unable to remove the share link." roleCommenter = "Commenter" roleEditor = "Editor" roleLabel = "Role" roleViewer = "Viewer" saveAndShare = "Save to server & share" saveFailed = "Failed to save the file to the server. Please try again." saveFailedTitle = "Couldn't save to server" saveFirstBody = "Sharing works on files saved to the server. We'll save it to your files, then continue to sharing." saveFirstHeading = "Save this file to the server to share it" saveFirstTitle = "Share file" sharedUsersTitle = "Shared users" shareHeading = "Shared file" sharingDisabled = "Sharing is disabled." sharingDisabledBody = "Sharing has been disabled by your server settings." title = "Share File" titleDefault = "Shared file" tryAgain = "Please try again later." unknownUser = "Unknown user" userAdded = "User added to shared list." userAddFailed = "Unable to share with that user." usernameLabel = "Username or email" usernamePlaceholder = "Enter a username or email" userRemoved = "User removed from shared list." userRemoveFailed = "Unable to remove that user." viewActivity = "View activity" viewed = "Viewed" viewsCount = "Views: {{count}}" [storageUpload] bulkDescription = "This uploads the checked files to your server storage." bulkTitle = "Upload checked files" description = "This uploads the current file to server storage for your own access." errorTitle = "Upload failed" failure = "Upload failed. Please check your login and storage settings." featureDisabled = "Saving to the server isn't enabled on this server." fileCount_one = "{{count}} file" fileCount_other = "{{count}} files" fileLabel = "File" hint = "Public links and access modes are controlled by your server settings." more = " +{{count}} more" success = "Uploaded to server" title = "Upload to Server" updateButton = "Update on Server" uploadButton = "Upload to Server" [superSearch] all = "All" ariaLabel = "Super search" filtersAriaLabel = "Search filters" hint = "Type to search" placeholder = "Search ZhmmCloud PDF" placeholderShort = "Search" showLess = "Show less" showMore = "Show {{count}} more" [superSearch.group] docs = "Docs" files = "Files" pages = "Pages" processor = "Processor" settings = "Settings" tools = "Tools" [survey] title = "ZhmmCloud PDF Survey" [swagger] clickHere = "click here" fallback = "If it didn't open automatically," opening = "Opening Swagger UI in a new tab..." tags = "api,documentation,swagger,endpoints,development" title = "API Documentation" [tableExtraxt] tags = "CSV,Table Extraction,extract,convert" [team] cancelInviteError = "Failed to cancel invitation" confirmCancelInvite = "Are you sure you want to cancel this invitation?" confirmLeave = "Are you sure you want to leave this team?" confirmLeaveLeader = "As a team leader, leaving will remove you from the team. Are you sure?" confirmRemove = "Are you sure you want to remove this member?" currentUnavailable = "We couldn't identify your current team. Try again, or contact support if this continues." editName = "Edit team name" inviteCancelled = "Invitation canceled" inviteError = "Failed to send invitation" inviteSent = "Invitation sent successfully" leader = "Leader" leaveButton = "Leave Team" leaveError = "Failed to leave team" leaveSuccess = "Successfully left team" loading = "Loading team information..." makeOwner = "Make owner" memberCount_one = "{{count}} member" memberCount_other = "{{count}} members" memberCount_zero = "no members" memberRemoved = "Member removed successfully" namePlaceholder = "Enter team name" noOwner = "This team has no owner" personal = "Personal" recoverBody = "An existing member can recover ownership to manage the team and its billing settings." recoverOwner = "Become team owner" recoverSuccess = "You are now the team owner." removeError = "Failed to remove member" renameCancel = "Cancel rename" renameError = "Failed to rename team" renameSubmit = "Save team name" renameSuccess = "Team renamed successfully" transferError = "Ownership could not be transferred. Refresh the team and try again." transferSuccess = "Team ownership transferred. Your role is now member." [team.invitationBanner] acceptButton = "Accept" message = "has invited you to join" rejectButton = "Decline" [team.invite] cancelLabel = "Cancel" invalidEmail = "Invalid email address" placeholder = "Enter email address" sendButton = "Send Invitation" title = "Invite Team Member" [team.members] actions = "Member actions" emailColumn = "Email" empty = "No team members yet" nameColumn = "Name" pending = "Pending" remove = "Remove" roleColumn = "Role" title = "Team Members" [textAlign] center = "Center" left = "Left" right = "Right" [textInput] clear = "Clear input" [time.relative] daysAgo = "{{count}}d ago" hoursAgo = "{{count}}h ago" justNow = "just now" minutesAgo = "{{count}}m ago" [timestampPdf] desc = "Add an RFC 3161 document timestamp to your PDF using a trusted Time Stamp Authority (TSA) server." results = "Timestamp Results" submit = "Apply Timestamp" tags = "timestamp,RFC 3161,TSA,time stamp authority,document timestamp,proof of existence,timestamp token,trusted timestamp,sign timestamp,notarize" title = "Timestamp PDF" [timestampPdf.error] failed = "An error occurred while timestamping the PDF." [timestampPdf.options] note = "Only a SHA-256 hash of your document is sent to the TSA server; the PDF file itself is never sent to the TSA server." title = "Timestamp Server (TSA)" [timestampPdf.options.tsaUrl] desc = "Pick a trusted Time Stamp Authority" label = "Select a TSA server" [timestampPdf.steps] settings = "Settings" [toast] dismiss = "Dismiss" toggleDetails = "Toggle details" [tool] endpointUnavailable = "This tool is unavailable on your server." endpointUnavailableClickable = "Not available in this mode. Click to sign in." filesLoading = "Files are still loading, please wait." filesLoadingProgress = "{{loaded}} / {{total}} files loading..." invalidParams = "Fill in the required settings." noFiles = "Add a file to get started." scopeFiles = "files" scopeThisFile = "this file" selectFilesHint = "Select files in Active Files to run this tool" singleFileScope = "Only applying to: {{fileName}}" viewerMode = "Switch to the file editor to add multiple files." [toolFormat] ANY = "any file" CBR = "a comic book archive (CBR)" CBZ = "a comic book archive (CBZ)" CSV = "a CSV file" EBOOK = "an ebook" EMAIL = "an email" EXCEL = "a spreadsheet" HTML = "a web page" IMAGE = "images" JAVASCRIPT = "a JavaScript file" JSON = "a JSON file" MARKDOWN = "a Markdown file" NONE = "no file" PCL = "a PCL print file" PDF = "a PDF" PDF_ENCRYPTED = "a password-protected PDF" POSTSCRIPT = "a PostScript file" PPT = "a presentation" TEXT = "a text file" VIDEO = "a video" WORD = "a Word document" XML = "an XML file" XPS = "an XPS document" ZIP = "a ZIP archive" [toolLoading] generic = "Loading tool..." named = "Loading {{toolName}}..." [toolPanel] alpha = "Alpha" backToAllTools = "Back to all tools" goBack = "Go back" pdfTools = "PDF Tools" placeholder = "Choose a tool to get started" premiumFeature = "Premium feature:" searchTools = "Search tools" toolsHeader = "PDF Tools" viewAllTools = "View all tools" [toolPanel.fullscreen] comingSoon = "Coming soon:" favorite = "Add to favorites" favorites = "Favorites" heading = "All tools (fullscreen view)" noResults = "Try adjusting your search or toggle descriptions to find what you need." recommended = "Recommended" selfHostedOffline = "Requires your ZhmmCloud PDF server (currently offline):" showDetails = "Show Details" unavailable = "Disabled by server administrator:" unavailableDependency = "Unavailable - required tool missing on server:" unfavorite = "Remove from favorites" [toolPanel.modePrompt] chooseFullscreen = "Use fullscreen mode" chooseSidebar = "Use sidebar mode" description = "Preview both layouts and decide how you want to explore ZhmmCloud PDF tools." dismiss = "Maybe later" fullscreenDescription = "Browse every tool in a catalog that covers the workspace until you pick one." fullscreenTitle = "Fullscreen mode - (legacy)" recommended = "Recommended" sidebarDescription = "Keep tools alongside your workspace for quick switching." sidebarTitle = "Sidebar mode" title = "Choose how you browse tools" [toolPicker] allTools = "ALL TOOLS" noToolsFound = "No tools found" quickAccess = "QUICK ACCESS" searchPlaceholder = "Search tools..." [toolPicker.subcategories] advancedFormatting = "Advanced Formatting" ai = "AI" automation = "Automation" developerTools = "Developer Tools" documentReview = "Document Review" documentSecurity = "Document Security" extraction = "Extraction" general = "General" pageFormatting = "Page Formatting" removal = "Removal" signing = "Signing" verification = "Verification" [toolRenderer] notFound = "Tool not found: {{tool}}" [tools] noSearchResults = "No tools found" noTools = "No tools available" [tooltip] close = "Close tooltip" [unlockPDFForms] description = "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable." submit = "Unlock Forms" tags = "remove,delete,form,field,readonly" title = "Remove Read-Only from Form Fields" [unlockPDFForms.error] failed = "An error occurred while unlocking PDF forms." [unlockPDFForms.results] title = "Unlocked Forms Results" [update] allReleases = "All Releases" breaking = "Breaking" breakingChanges = "Breaking Changes" breakingChangesDefault = "This version contains breaking changes." close = "Close" closeModal = "Close update modal" current = "Current Version" defaultRecommendation = "This update contains important fixes and improvements." downloadLatest = "Download Latest" later = "Later" latest = "Latest Version" loadingDetailedInfo = "Loading detailed information..." migrationGuide = "Migration Guide" migrationGuides = "Migration Guides" migrationGuidesDesc = "Review important changes before updating." modalSubtitle = "A new version of ZhmmCloud PDF is ready to install." modalTitle = "Update Available" notes = "Notes" releaseNotes = "Release Notes" showLess = "Show fewer versions" showMore = "Show all {{count}} versions" stable = "STABLE" updateAvailable = "Update Available" urgentUpdateAvailable = "Urgent Update" version = "Version" versionCount_one = "{{count}} version" versionCount_other = "{{count}} versions" versionHistory = "Version History" viewGuide = "View Guide" whatsNewIn = "What's new in" [update.priority] low = "Low" minor = "Minor" normal = "Normal" urgent = "Urgent" [upgradeBanner] attentionBody = "Your admin needs to sign in to see more info. Please contact them immediately." attentionBodyAdmin = "Review the license requirements to keep this server compliant." attentionTitle = "This server needs admin attention" message = "Get the most out of ZhmmCloud PDF with 100 users, PDF text editing, and advanced features" seeInfo = "See info" title = "Upgrade to the Team plan" upgradeButton = "Upgrade Now" [URLToPDF] tags = "web-capture,save-page,web-to-doc,archive" title = "URL To PDF" [usage] aboutUsageAnalytics = "About Usage Analytics" configureSettings = "Configure Analytics Settings" error = "Error loading usage statistics" loadFailed = "Failed to load usage statistics" noData = "No usage yet" noDataMessage = "Endpoint activity appears here once people start running tools." usageAnalyticsExplanation = "Usage analytics track endpoint requests and tool usage patterns. Combined with the Audit Logging dashboard, you get complete visibility into system activity, performance, and security events." viewAuditLogs = "View Audit Logs" [usage.chart] title = "Endpoint Usage Chart" [usage.controls] all = "All" dataTypeLabel = "Data Type:" refresh = "Refresh" top10 = "Top 10" top20 = "Top 20" [usage.controls.dataType] all = "All" api = "API" ui = "UI" [usage.showing] all = "All" top10 = "Top 10" top20 = "Top 20" [usage.stats] selectedVisits = "Selected Visits" showing = "Showing" totalEndpoints = "Total Endpoints" totalVisits = "Total Visits" [usage.table] endpoint = "Endpoint" noData = "No data available" percentage = "Percentage" title = "Detailed Statistics" unknownEndpoint = "Unknown endpoint" visits = "Visits" [users] lastActive = "Last active" locked = "Locked" ownerSetupRequired = "The organization owner has not completed first login. Complete setup or ask the server operator to recover ownership before transferring ownership." roleFor = "Role for {{name}}" rowActions = "Actions for {{name}}" subtitle2 = "Your people, teams, and access levels." suspended = "Suspended" teamActions = "Team actions" title = "Users" you = "(you)" [users.action] cancelInvite = "Cancel invitation" createFromDefault = "Create team from Default" deleteTeam = "Delete team" disableMfa = "Reset MFA" move = "Move to team" reinstate = "Reinstate" remove = "Remove from org" removeTeam = "Remove from team" rename = "Rename team" resetPw = "Reset password" suspend = "Suspend" unlock = "Unlock account" [users.activity] daysAgo = "{{count}}d ago" hoursAgo = "{{count}}h ago" justNow = "Just now" minutesAgo = "{{count}}m ago" monthsAgo_one = "{{count}} month ago" monthsAgo_other = "{{count}} months ago" never = "Never" weeksAgo_one = "{{count}} week ago" weeksAgo_other = "{{count}} weeks ago" yearsAgo_one = "{{count}} year ago" yearsAgo_other = "{{count}} years ago" [users.cap] addProcessor = "+ Processor" approver = "Approves policy" editor = "Editor" processor = "Processor" [users.columns] capabilities = "Capabilities" email = "Email" person = "Person" role = "Role" status = "Status" team = "Team" [users.confirm] cancelInviteBody = "Cancel the invitation to {{email}}? They won't be able to join with the current link." cancelInviteTitle = "Cancel invitation" deleteTeamBody = "Delete the {{name}} team? The team must be empty first - move its members to another team, and it can't still own any integration configs." deleteTeamTitle = "Delete team" disableMfaBody = "Remove {{name}}'s MFA enrolment? They'll set it up again on next login if required." disableMfaTitle = "Reset MFA" removeBody = "Permanently remove {{name}} from the organization? This cannot be undone." removeTeamBody = "Remove {{name}} from the team? They keep their account but lose access to this team's resources." removeTitle = "Remove member" [users.empty] description = "Invite your team to start collaborating." title = "No members yet" [users.filters] noMatches = "No one matches these filters." search = "Search people" [users.group] addToTeam = "Add to team" [users.invite] access = "Access" action = "Invite people" authOauth = "OAuth2 / SSO" authSaml = "SAML 2.0" authType = "Sign-in method" authWeb = "Password" create = "Create account" createSubtitle = "Create a self-hosted account with a password or SSO." createTitle = "Create account" editorDesc = "Edit PDFs in the ZhmmCloud PDF Editor. Everyone gets this." email = "Email address" emailError = "Enter a valid email address" emailPlaceholder2 = "name@company.com" forceChange = "Require a password change on first login" forceMfa = "Require MFA setup on first login" method = "How to add them" methodDirect = "Create account directly" methodEmail = "Invite by email" password = "Password" passwordError = "Password must be at least 6 characters" processorDeferred = "Invite sent, but Processor access couldn't be granted yet - set it from the roster once they've joined." processorDesc = "The governance surface, run pipelines, agents, and the API." role = "Role" send2 = "Send invite" subtitle2 = "They'll get an email to join your ZhmmCloud workspace." team = "Team" title = "Invite people" username = "Username" usernameError = "Enter a valid username (3-50 characters) or email address" usernamePlaceholder = "jsmith" [users.invites] by = "Invited by {{who}}" cancel = "Cancel" expiresInDays_one = "Expires in {{count}} day" expiresInDays_other = "Expires in {{count}} days" expiresToday = "Expires today" title = "Pending invitations" [users.invites.columns] expires = "Expires" invitee = "Invitee" [users.loadError] description = "Something went wrong reaching the backend, or you don't have access. Try again." title = "Couldn't load members" [users.moveTeam] apply = "Move" team = "Team" title = "Move to team" [users.newTeam] action = "+ New team" create = "Create team" name = "Team name" namePlaceholder = "e.g. Finance" nameRequired = "Team name is required" title = "New team" [users.renameTeam] apply = "Rename" defaultApply = "Create and move" defaultDescription = "Default will remain available for new users. Everyone currently in Default will be moved to the new team." defaultTitle = "Create team from Default" name = "Team name" title = "Rename team" [users.resetPw] apply = "Reset password" confirm = "Confirm password" copied = "Copied to clipboard" copyHint = "Copy this now - it won't be shown again." email = "Email the user about the reset" forceChange = "Require a password change on next login" generate = "Generate a secure password" includePw = "Include the new password in the email" mismatch = "Passwords do not match" newPassword = "New password" regen = "Regenerate" title = "Reset password" tooShort = "Password must be at least 8 characters" [users.role] admin = "Admin" guest = "Guest" member = "Member" orgOwner = "Org Owner" teamOwner = "Team Lead" [users.seats] full = "Every licensed seat is in use. Free one up, or raise the seat count, to add anyone else." update = "Update seats" [users.tabs] all = "All" label = "Filter by team" unassigned = "No team" [users.team] grantProcessor = "Grant Processor to team" revokeProcessor = "Revoke Processor from team" [validateSignature] date = "Date" downloadCsv = "Download CSV" downloadJson = "Download JSON" downloadPdf = "Download PDF Report" finalizing = "Preparing downloads..." location = "Location" noResults = "Run the validation to generate a report." noSignatures = "No digital signatures found in this document" noSignaturesShort = "No signatures" processing = "Validating signatures..." reason = "Reason" results = "Validation Results" selectCustomCert = "Custom Certificate File X.509 (Optional)" signatureDate = "Signature Date" signer = "Signer" submit = "Validate Signatures" tags = "signature,verify,validate,pdf,certificate,digital signature,Validate Signature,Validate certificate" title = "Validate PDF Signatures" totalSignatures = "Total Signatures" [validateSignature.cert] algorithm = "Algorithm" bits = "bits" details = "Certificate Details" issuer = "Issuer" keySize = "Key Size" keyUsage = "Key Usage" selfSigned = "Self-Signed" serialNumber = "Serial Number" subject = "Subject" validFrom = "Valid From" validUntil = "Valid Until" version = "Version" [validateSignature.downloadType] csv = "CSV" json = "JSON" pdf = "PDF" [validateSignature.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." [validateSignature.issue] certExpired = "Certificate expired" certRevocationUnknown = "Certificate revocation status unknown" certRevoked = "Certificate revoked" chainInvalid = "Certificate chain invalid" documentModified = "Document modified after signing - content was added outside the signed area" revocationNotChecked = "Revocation was not checked" selfSigned = "Self-signed - signer identity not verified" signatureInvalid = "Signature cryptographic check failed" trustInvalid = "Certificate not trusted" [validateSignature.report] continued = "Continued" downloads = "Downloads" entryLabel = "Signature Summary" filesEvaluated_one = "{{count}} file evaluated" filesEvaluated_other = "{{count}} files evaluated" footer = "Validated via ZhmmCloud PDF" generatedAt = "Generated" noPdf = "PDF report will be available after a successful validation." page = "Page" shortTitle = "Signature Summary" signatureCountLabel_one = "{{count}} signature" signatureCountLabel_other = "{{count}} signatures" signaturesFound_one = "{{count}} signature detected" signaturesFound_other = "{{count}} signatures detected" signaturesInvalid = "{{count}} invalid" signaturesUnverified_one = "{{count}} needs review" signaturesUnverified_other = "{{count}} need review" signaturesValid = "{{count}} fully valid" thumbnailAlt = "{{fileName}} thumbnail" title = "Signature Validation Report" [validateSignature.report.fields] created = "Created" fileSize = "File Size" signatureCount = "Total Signatures" signatureDate = "Signature Date" [validateSignature.settings] certHint = "Upload a trusted X.509 certificate to validate against a custom trust source." title = "Validation Settings" [validateSignature.signature] _value = "Signature" [validateSignature.status] complete = "Validation complete" invalid = "Invalid" untrustedShort = "Unverified" valid = "Valid" validUntrusted = "Valid, signer not verified" [viewer] cannotPreviewFile = "Cannot Preview File" copyRestricted = "Copying is disabled by this PDF's permissions." copyText = "Copy" coverPageView = "Show Cover Page Separately" disableColorFilter = "Disable Color Filter" documentUpdated = "Document updated" dualPageView = "Dual Page View" enableDarkFilter = "Enable Dark Filter" enableSepiaFilter = "Enable Sepia Filter" engineLoadError = "Failed to initialize PDF viewer engine" engineSlowWarning = "PDF engine initialization is taking longer than expected. Please check your browser WebAssembly and Worker settings, or reload the page." firstPage = "First Page" lastPage = "Last Page" loadingEngine = "Loading PDF Engine..." moreOptions = "More" nextPage = "Next Page" noPdfProvided = "No PDF provided" onlyPdfSupported = "This file format is not supported for preview." pageNavigation = "Page navigation" previousPage = "Previous Page" readAloudFromHere = "Read aloud from here" saveChangesErrorBody = "The document could not be saved. Try again." saveChangesErrorTitle = "Could not save changes" singlePageView = "Single Page View" unknownFile = "Unknown file" view = "View" zoom = "Zoom" zoomIn = "Zoom In" zoomOut = "Zoom Out" [viewer.attachments] addAttachment = "Add attachment" close = "Close attachments" closeSidebar = "Close attachments sidebar" download = "Download attachment" empty = "No attachments in this document" loadFailed = "Failed to load attachments" loading = "Loading attachments..." noDocument = "Open a PDF to view its attachments." noMatch = "No attachments match your search" noSupport = "Attachment support is unavailable for this viewer." retry = "Retry" searchPlaceholder = "Search attachments" title = "Attachments" untitled = "Untitled" [viewer.bookmarks] addBookmark = "Add bookmark" bookmarkTitle = "Bookmark title" bookmarkTitleRequired = "Bookmark title is required" closeSidebar = "Close bookmarks sidebar" collapseAll = "Collapse all bookmarks" editorOnly = "This document's bookmarks can only be edited in the editor." empty = "No bookmarks in this document" expandAll = "Expand all bookmarks" loadFailed = "Failed to load bookmarks" loading = "Loading bookmarks..." noDocument = "Open a PDF to view its bookmarks." noSearchResults = "No bookmarks match your search" openEditor = "Need to reorder or nest? Open the Bookmark Editor" pageLabel = "Page" pageNumber = "Page {{page}}" saveFailed = "Failed to save bookmark" searchPlaceholder = "Search bookmarks" title = "Bookmarks" untitled = "Untitled" [viewer.comments] addComment = "Add comment" addCommentPlaceholder = "Add comment..." addLink = "Add link" addReplyPlaceholder = "Add reply..." cancelClearAll = "Cancel" clearAll = "Clear all comments" clearAllDescription = "This removes comments and replies from the sidebar while keeping any attached annotations in the document." clearAllTitle = "Clear all comments?" close = "Close comments" closeSidebar = "Close comments sidebar" deleteAnnotationAndComment = "Delete annotation & comment" deleteDescription = "This annotation has a comment attached. You can remove just the comment from the sidebar while keeping the annotation, or delete everything." deleteTitle = "Remove annotation from comments?" exportCsv = "Export as CSV" goToLink = "Go to link" hint = "Place comments with the Comment, Insert Text, or Replace Text tools. They will appear here by page." locateAnnotation = "Locate in document" moreActions = "More actions" nComments_one = "{{count}} comment" nComments_other = "{{count}} comments" noMatch = "No comments match your search" pageLabel = "Page {{page}}" placingHint = "Click a page to place… (cancel)" removeCommentOnly = "Remove comment only" saveReply = "Save reply" searchPlaceholder = "Search comments" title = "Comments" typeComment = "Comment" typeInsertText = "Insert Text" typeReplaceText = "Replace Text" viewComment = "View comment" [viewer.comments.csv] author = "Author" comment = "Comment" inReplyTo = "In reply to" modifiedUtc = "Last modified (UTC)" page = "Page" thread = "Thread" [viewer.error] loadError = "Failed to load PDF" noFileProvided = "Error: No file provided to viewer" [viewer.formBar] apply = "Apply Changes" dismiss = "Dismiss" download = "Download PDF" hasFieldsDesc = "This PDF contains fillable fields" title = "Form Fields" unsavedBadge = "Unsaved" unsavedDesc = "You have unsaved changes" [viewer.layers] closeSidebar = "Close layers sidebar" empty = "This document has no layers." hideAll = "Hide all layers" loadFailed = "Failed to load layers." loading = "Loading layers..." noDocument = "Open a PDF to view its layers." readFailed = "Failed to read PDF layers" showAll = "Show all layers" title = "Layers" [viewer.link] delete = "Delete link" goTo = "Go to {{label}}" open = "Open Link" openAria = "Open link" page = "Page {{page}}" [viewer.nonPdf] columnDefault = "Column {{index}}" convertToPdf = "Convert to PDF" copied = "Copied" csvStats = "{{rows}} rows · {{columns}} columns · {{size}}" emptyFile = "Empty file" htmlHidePreview = "Hide preview" htmlPreview = "HTML preview" htmlPreviewMobileHidden = "HTML pages are laid out for desktop widths, so the preview is off by default here." htmlPreviewWarning = "HTML preview - external resources may not load · {{size}}" htmlShowPreview = "Show preview anyway" invalidJson = "Invalid JSON - showing raw content" lineNumbers = "Line numbers" loading = "Loading..." noFile = "No file loaded" previewUnavailable = "Preview not available for this file type" renderMarkdown = "Render markdown" sortedBy = "Sorted by: {{column}}" textStats = "{{lines}} lines · {{size}}" [viewer.nonPdf.fileType] file = "File" image = "Image" spreadsheet = "Spreadsheet" text = "Text" [viewer.portfolio] addFile = "Add file" count_one = "{{count}} file in this portfolio" count_other = "{{count}} files in this portfolio" import = "Import into ZhmmCloud" importFailed = "This file could not be added to your workspace." memberUnavailable = "This file could not be read from the portfolio." preview = "Preview" searchPlaceholder = "Search files" title = "Portfolio" [viewer.redaction] applyAll = "Apply Redactions" removeMark = "Remove this mark" [viewer.search] clear = "Clear search" close = "Close search" next = "Next result" previous = "Previous result" resultsOf = "of {{total}}" [viewer.sidebar] close = "Close sidebar" searchPlaceholder = "Search..." [viewer.signature] delete = "Delete signature" previewAlt = "Signature preview" [viewer.signatureField] badge = "Signature" fieldTitle = "Signature field: {{name}}" signed = "Signed" signedWithReason = "Signed: {{reason}}" unsignedFieldTitle = "Unsigned signature field: {{name}}" withTime = "{{label}} ({{time}})" [viewer.thumbnails] closeSidebar = "Close thumbnails sidebar" failed = "Failed" pageNumber = "Page {{page}}" thumbnailAlt = "Page {{page}} thumbnail" title = "Pages" [viewPdf] tags = "view,read,annotate,text,image,highlight,edit" title = "View/Edit PDF" [warning] tooltipTitle = "Warning" [watermark] desc = "Add text or image watermarks to PDF files" submit = "Add Watermark" tags = "stamp,mark,overlay,watermark,branding,logo,confidential,draft,copyright,trademark,text overlay,image overlay,background text" title = "Add Watermark" [watermark.error] failed = "An error occurred while adding watermark to the PDF." [watermark.results] title = "Watermark Results" [watermark.settings] alphabet = "Font/Language" color = "Watermark Color" convertToImage = "Flatten PDF pages to images" opacity = "Opacity (%)" rotation = "Rotation (degrees)" size = "Size" [watermark.settings.image] choose = "Choose Image" [watermark.settings.spacing] height = "Height Spacing" horizontal = "Horizontal Spacing" vertical = "Vertical Spacing" width = "Width Spacing" [watermark.settings.text] placeholder = "Enter watermark text" [watermark.steps] file = "Watermark File" formatting = "Formatting" textStyle = "Style" type = "Watermark Type" wording = "Wording" [watermark.tooltip.appearance] bullet1 = "Rotation: -360° to 360° for angled watermarks" bullet2 = "Opacity: 0-100% for transparency control" bullet3 = "Lower opacity creates subtle watermarks" text = "Control how your watermark looks and blends with the document." title = "Appearance Settings" [watermark.tooltip.file.header] title = "Image Upload" [watermark.tooltip.file.recommendations] 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" text = "Tips for optimal image watermark results." title = "Best Practices" [watermark.tooltip.file.upload] bullet1 = "Supports common formats: PNG, JPG, GIF, BMP" bullet2 = "PNG with transparency works best" bullet3 = "Higher resolution images maintain quality better" text = "Upload an image file to use as your watermark." title = "Image Selection" [watermark.tooltip.formatting.header] title = "Formatting & Layout" [watermark.tooltip.formatting.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" text = "Convert the final PDF to an image-based format for enhanced security." title = "Security Option" [watermark.tooltip.formatting.size] bullet1 = "Larger sizes create more prominent watermarks" text = "Adjust the size of your watermark (text or image)." title = "Size Control" [watermark.tooltip.language] text = "Choose the appropriate language setting to ensure proper font rendering for your text." title = "Language Support" [watermark.tooltip.spacing] bullet1 = "Width spacing: Horizontal distance between watermarks" bullet2 = "Height spacing: Vertical distance between watermarks" bullet3 = "Higher values create more spread out patterns" text = "Adjust the spacing between repeated watermarks across the page." title = "Spacing Control" [watermark.tooltip.textStyle.color] bullet1 = "Light gray (#d3d3d3) for subtle watermarks" bullet2 = "Black or dark colors for high contrast" bullet3 = "Custom colors for branding purposes" text = "Choose a color that provides good contrast with your document content." title = "Color Selection" [watermark.tooltip.textStyle.header] title = "Text Style" [watermark.tooltip.type.description] text = "Select between text or image watermarks based on your needs." title = "Choose Your Watermark" [watermark.tooltip.type.header] title = "Watermark Type Selection" [watermark.tooltip.type.image] bullet1 = "Upload any image format" bullet2 = "Maintains image quality" bullet3 = "Perfect for logos and stamps" text = "Use logos, stamps, or any image as a watermark. Great for branding and visual identification." title = "Image Watermarks" [watermark.tooltip.type.text] bullet1 = "Customizable fonts and languages" bullet2 = "Adjustable colors and transparency" bullet3 = "Ideal for legal or branding text" text = "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colors." title = "Text Watermarks" [watermark.tooltip.wording.header] title = "Text Content" [watermark.tooltip.wording.text] 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" text = "Enter the text that will appear as your watermark across the document." title = "Watermark Text" [watermark.type] 1 = "Text" 2 = "Image" [watermark.watermarkType] image = "Image" text = "Text" [workbench] dropFailedSingle = "Your file couldn't be added" dropFailedSome = "{{failed}} of your files couldn't be added" dropOverlay = "Drop files to add them to the workbench" [workbench.sessionRestore] none = "Your previous files are no longer stored on this device." partial = "Restored {{restored}} of {{total}} files. The rest are no longer stored on this device." [workbenchBar] activeFiles = "Active Files" annotations = "Annotations" applyRedactionsFirst = "Apply redactions first" closeAll = "Close All Files" closePdf = "Close PDF" deselectAll = "Deselect All" downloadAll = "Download All" exitAnnotations = "Exit annotation mode" exitRedaction = "Exit Redaction Mode" formFill = "Form Editor" hideToolbar = "Hide toolbar" moreActions = "More actions" pageEditor = "Page Editor" panMode = "Pan Mode" print = "Print PDF" readAloud = "Read Aloud" readAloudLanguage = "Language" readAloudSpeed = "Speed" redact = "Redact" rotateLeft = "Rotate Left" rotateRight = "Rotate Right" ruler = "Ruler / Measure" rulerSettings = "Scale Settings" save = "Save" saveAll = "Save All" saveAs = "Save As" search = "Search PDF" selectAll = "Select All" selectByNumber = "Select by Page Numbers" selectLanguage = "Select language" share = "Share" showAllTools = "Show all tools" showFewerTools = "Collapse toolbar" showToolbar = "Show toolbar" toggleAnnotations = "Toggle Annotations Visibility" toggleAttachments = "Toggle Attachments" toggleBookmarks = "Bookmarks (Table of Contents)" toggleComments = "Comments" toggleLayers = "Toggle Layers" toggleSidebar = "Toggle Sidebar" viewer = "Viewer" [workflow.participant] accessExpired = "Your access to this document has expired." certificateFile = "Certificate File" certificateFilePlaceholder = "Select certificate file" certificatePassword = "Certificate Password" certificateType = "Certificate Type" certTypeJks = "JKS Keystore" certTypeP12 = "P12/PKCS12 Certificate" certTypeServer = "Server Certificate (if available)" completedDeclined = "You have declined this document." completedSigned = "You have signed this document." decline = "Decline" declineConfirm = "Are you sure you want to decline signing this document?" declineFailed = "Failed to decline: {{error}}" declineSuccess = "You have declined this signing request." defaultReason = "Document Signing" downloadDocument = "Download Document" dueDate = "Due Date: {{date}}" errorTitle = "Error" from = "From: {{name}}" loadingSession = "Loading session..." location = "Location" locationPlaceholder = "e.g., San Francisco, CA" pageNumber = "Page Number (optional)" reason = "Reason" reasonPlaceholder = "e.g., Document approval" selectCertificateFile = "Please select a certificate file" sessionNotFound = "Session not found or access denied." signDocument = "Sign Document" statusDeclined = "Declined" statusNotified = "Notified" statusPending = "Pending" statusSigned = "Signed" statusViewed = "Viewed" submitFailed = "Failed to submit signature: {{error}}" submitSignature = "Submit Signature" submitSuccess = "Signature submitted successfully!" [workspace] title = "Workspace" [workspace.people] description = "Manage workspace members and their permissions" [workspace.people.license] users_one = "user" users_other = "users" [workspace.teams] description = "Manage teams and organize workspace members" [zipWarning] cancel = "Cancel" confirm = "Extract" message_one = "This ZIP contains {{count}} file. Extract anyway?" message_other = "This ZIP contains {{count}} files. Extract anyway?" title = "Large ZIP File"