mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2026-09-02 21:03:34 +03:00
Needs the schema half: Stirling-Tools/Stirling-PDF-SaaS#327 ## Current state The PAYG free allowance is a one-time lifetime pool. `pricing_policy.free_tier_units` is copied into `payg_team_extensions.free_units_remaining` once, at team creation (V14 trigger, updated in V19), and the charge pipeline decrements it until it reaches zero. Nothing ever puts it back. ## Problem The product promises a monthly allowance the billing model does not grant. - The account-link connect dialog advertises "500 free per month". That has **merged to main** (#7415), so the claim is live and unhonoured until this lands. - The wallet meter already read "Process 500 PDFs free, then $X/PDF", which reads as an allowance-then-meter model. - `SignupRequiredBootstrap`'s own doc comment described a "free 500-op/month allowance" while its copy said only "500 free operations". Three separate comments asserted the opposite in code (`billing/types.ts`, `WalletSnapshotResponse`, `TeamBillingContext`), so the two halves of the repo disagreed about what a customer is owed. ## Solution The grant now recurs each billing period, **for every team**. Paying does not cost you the allowance: a subscribed team draws its grant first each period and meters only the excess, which is what the meter's copy always described. That also matches how the grant already worked at charge time, where it reduced metered units regardless of subscription. ### The reset is lazy, with no scheduler `payg_team_extensions` gains `free_units_period_start`: the period `free_units_remaining` was last written for. - A stamp older than the current period start, or absent as on every existing row, means the reset is owed. `TeamBillingService.remainingForPeriod` projects it to a full grant, so the entitlement gate and the wallet both show it the instant the period turns. - `JobChargeService.consumeFreeGrant` persists it on the next charge, under the pessimistic row lock that already makes the per-job free/paid split exact. One rule, both callers, so display and enforcement cannot drift onto separate schedules. A team that runs nothing for a month has nothing to write, and no job is needed to hand out the grant. ### One period definition "Per period" is `TeamBillingContext.periodStart`: the Stripe subscription's current period when subscribed, the calendar month otherwise. It was already the only period notion in the system, so the grant joined it rather than inventing its own: - `InstanceEntitlement.periodCapUnits` is enforced over the same window. - `localUsageService.currentPeriodUnsynced` already buckets a linked instance's local usage by the `periodStart` it reads from the same snapshot, and resets its counters on that boundary. For an un-subscribed team, the only kind the grant gates, that window is the calendar month, which is what the copy promises. The period rule stays in Java by choice, not necessity: SQL could reach the Stripe period through the sync engine, but restating the rule there would give it a second home to drift from. Hence a nullable column and no backfill in the migration — NULL already means "stale", so every existing team reads as owed the current period's grant. ### Refunds A refund landing after the period turned would have stacked last period's units on top of the fresh grant. `JobChargeService.restoreFreeGrant` now clamps the restore to one period's grant, taking the same row lock, and the bulk-increment `restoreFreeUnits` query is gone. Removing it also removed a `@Query` string that no test would have parsed before application startup. ### Copy and comments Every comment and user-facing string that asserted the lifetime model is corrected. The strings that changed (code defaults and `en-US` TOML updated together): | Key | Now reads | | --- | --- | | `portal.billing.walletMeter.title` / `titleWithRate` | "500 free credits every month, then $X per PDF" | | `portal.billing.walletMeter.capSuffix` / `barAria` | "of 500 free credits left this month" / "Free credits remaining" | | `payg.free.hero.capSuffix` | "of 500 free PDFs left this month" | | `plan.freeLimit.message` | "...this month. ... It resets next month, or keep the momentum going now..." | | `payg.signupRequired.body` | "500 free operations a month" | Main rewrote these keys to "500 free credits to start" while this branch was open. The merge keeps main's credits vocabulary and drops "to start", which asserts the one-time grant this branch removes and which main's own connect dialog already contradicts. Also fixed in passing: `testing/compose/payg/saas-seed.sql` still inserted `free_tier_units_per_cycle`, the pre-V19 column name, so that INSERT had been failing since the rename. ## How to test Backend: ```bash STIRLING_FLAVOR=saas ./gradlew :saas:test spotlessCheck ``` Frontend: ```bash task frontend:typecheck && task frontend:lint && task frontend:format:check ``` New coverage, 10 tests: - `TeamBillingServiceMoreTest` — a past-period stamp reads as a fresh grant, a current stamp reads the stored balance, an unstamped row reads as a fresh grant, the grant follows the Stripe window rather than the calendar month, plus the `remainingForPeriod` rule itself including a future stamp and null/negative balances. - `JobChargeServiceTest` — the first charge of a new period resets and re-stamps, an unstamped row resets, a zero-grant policy still advances the stamp, and a refund crossing a period boundary does not exceed the grant. Manually, against a team whose grant is spent: set `free_units_period_start` back a month (or leave it NULL) and the wallet, the sidebar meter and the entitlement gate should all show a full grant before any job runs. The first billable job should then draw from it and write the reset. Three tests fail on a local Windows run and pass in CI, on files this branch does not touch: `workbenchSession.test.ts`, `notificationActions.test.tsx`, and `:proprietary` `FolderIdentitiesTest.identityAgreesAcrossASymlinkedAliasOfTheDirectory`. Nothing to do here — noted so a local run does not look like a regression. ## Merge order The migration is additive, and Hibernate `ddl-auto=update` will add the column in a dev environment, so either order works locally. Beyond that the schema goes first: Stirling-Tools/Stirling-PDF-SaaS#327 targets `v3` (staging), so it needs to reach an environment before this lands there.
12714 lines
444 KiB
TOML
12714 lines
444 KiB
TOML
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)"
|
||
encryptedFilesBlocked_one = "File is password-protected. Unlock it first."
|
||
encryptedFilesBlocked_other = "{{count}} files are password-protected. Unlock them first."
|
||
exportAndContinue = "Export & Continue"
|
||
false = "False"
|
||
fileNotSavedToDisk = "Not saved to disk"
|
||
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"
|
||
loginAgreementProvider = "This notice is provided by your administrator, not Stirling PDF Inc."
|
||
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]
|
||
addMoreFiles = "Add more files..."
|
||
attachments = "Select Attachments"
|
||
info = "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel."
|
||
placeholder = "Choose files..."
|
||
removeFile = "Remove file"
|
||
selectedFiles = "Selected Files"
|
||
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 Add Attachments"
|
||
|
||
[addFileCard]
|
||
upload = "Upload"
|
||
|
||
[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"
|
||
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."
|
||
submit = "Encrypt"
|
||
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.passwords]
|
||
stepTitle = "Passwords & Encryption"
|
||
|
||
[addPassword.passwords.owner]
|
||
label = "Owner Password"
|
||
placeholder = "Enter owner password"
|
||
|
||
[addPassword.passwords.user]
|
||
label = "User Password"
|
||
placeholder = "Enter user password"
|
||
|
||
[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 = "User Password: Required to open the PDF"
|
||
bullet2 = "Owner Password: Controls document permissions (not supported by all PDF viewers)"
|
||
text = "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one."
|
||
title = "Password Types"
|
||
|
||
[addPassword.tooltip.permissions]
|
||
text = "These permissions control what users can do with the PDF. Most effective when combined with an owner password."
|
||
title = "Change Permissions"
|
||
|
||
[addStamp]
|
||
preview = "Preview Stamp"
|
||
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"
|
||
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 = "Submit"
|
||
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.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.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.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/stirling-pdf)"
|
||
label = "Base Temp Directory"
|
||
placeholder = "Default: java.io.tmpdir/stirling-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.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]
|
||
description = "Connect Stirling to the Python AI engine and choose which AI capabilities are exposed. Changes apply on 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.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.note]
|
||
body = "The AI engine runs as a separate service. Its shared secret"
|
||
body2 = "is set via a container environment variable. Provider API keys can be entered on these pages or supplied as engine environment variables; keys entered here are pushed to the engine when saved."
|
||
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://stirling-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]
|
||
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.badge]
|
||
clickToUpgrade = "Click to view plan details"
|
||
|
||
[admin.settings.connections]
|
||
connect = "Connect"
|
||
description = "Configure external authentication providers like OAuth2 and SAML."
|
||
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"
|
||
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 = "Configure custom database connection settings for enterprise deployments."
|
||
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"
|
||
unavailable = "Backup list unavailable for the current database configuration."
|
||
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 = "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality"
|
||
label = "Server Certificate"
|
||
|
||
[admin.settings.features.serverCertificate.enabled]
|
||
description = "Enable server-side certificate for \"Sign with Stirling-PDF\" option"
|
||
label = "Enable Server Certificate"
|
||
|
||
[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. Stirling's own configuration directory is always off-limits."
|
||
title = "Folder Access"
|
||
|
||
[admin.settings.folderAccess.implied]
|
||
description = "These Stirling-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]
|
||
description = "Configure system-wide application settings including branding and default behavior."
|
||
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"
|
||
|
||
[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.logoStyle]
|
||
classic = "Classic"
|
||
classicAlt = "Classic logo"
|
||
description = "Set the default logo style for all users on this server. Users can override this setting in their personal preferences."
|
||
label = "Logo Style"
|
||
modern = "Modern"
|
||
modernAlt = "Modern logo"
|
||
|
||
[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 = "Configure links to legal documents and policies."
|
||
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. Stirling-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"
|
||
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 Stirling API key in the X-API-KEY header (or Authorization: Bearer <key>). The key maps to its owning Stirling user - only provisioned accounts get in, and actions are audited as that user. Manage keys under Account > API Keys."
|
||
description = "Expose Stirling'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.enabled]
|
||
description = "When off (default), no /mcp endpoint, metadata, or MCP beans are loaded."
|
||
label = "Enable MCP Server"
|
||
|
||
[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)."
|
||
step2 = "In your MCP client add a"
|
||
step2b = "server pointing at:"
|
||
step3 = "The client auto-discovers OAuth from:"
|
||
step3ApiKey = "Send the key in an"
|
||
step3ApiKeyb = "header (or Authorization: Bearer <key>). No OAuth or metadata discovery is used."
|
||
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 Stirling user."
|
||
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]
|
||
description = "OAuth needs an external IdP. API key uses a Stirling per-user API key (X-API-KEY) - simplest for self-host."
|
||
label = "Authentication mode"
|
||
|
||
[admin.settings.mcp.requireAccount]
|
||
description = "Only let tokens through if their subject maps to a provisioned, enabled Stirling user."
|
||
label = "Require an existing Stirling 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.usernameClaim]
|
||
description = "JWT claim matched against a Stirling username (e.g. sub, email, preferred_username)."
|
||
label = "Username claim"
|
||
|
||
[admin.settings.plan.noData]
|
||
message = "Plans data is not available at the moment."
|
||
title = "No data available"
|
||
|
||
[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</0> (ENTERPRISE) - Security"
|
||
customMetadata = "<0>Custom Metadata</0> (PRO) - General"
|
||
databaseConfiguration = "<0>Database Configuration</0> (ENTERPRISE) - Database"
|
||
message = "Premium and Enterprise features are now organized in their respective sections:"
|
||
title = "Premium Features Distributed"
|
||
|
||
[admin.settings.privacy]
|
||
analytics = "Analytics & Tracking"
|
||
description = "Configure privacy and data collection settings."
|
||
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."
|
||
title = "Security"
|
||
|
||
[admin.settings.security.audit]
|
||
hideDetails = "Hide audit level details"
|
||
label = "Audit Logging"
|
||
showDetails = "Show audit level details"
|
||
|
||
[admin.settings.security.audit.advancedOptions]
|
||
description = "The following options increase processing time and memory usage. Enable only if truly needed."
|
||
title = "Advanced Options"
|
||
|
||
[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.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 have been moved to the Connections menu for easier management."
|
||
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."
|
||
label = "Enable Group Signing (Alpha)"
|
||
|
||
[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 Stirling 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 <strong>Auditing</strong> to track system activity and <strong>Usage Analytics</strong> to monitor how your users interact with the platform."
|
||
configButton = "Open <strong>Settings</strong> to access all system configuration and administrative controls."
|
||
connectionsSection = "The <strong>Connections</strong> 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 <strong>external database hookups</strong> so you can integrate with your existing infrastructure."
|
||
settingsOverview = "This is the <strong>Settings Panel</strong>. Admin settings are organized by category for easy navigation."
|
||
systemCustomization = "We have extensive ways to customize the UI: <strong>System Settings</strong> let you change the app name and languages, <strong>Features</strong> allows server certificate management, and <strong>Endpoints</strong> lets you enable or disable specific tools for your users."
|
||
teamsAndUsers = "Manage <strong>Teams</strong> and individual users here. You can invite new users via email, shareable links, or create custom accounts for them yourself."
|
||
welcome = "Welcome to the <strong>Admin Tour</strong>! 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 Stirling PDF a powerful, customizable solution for organizations. You can replay it anytime - just open <strong>Settings</strong> and find it here in the <strong>Tours</strong> section under Help."
|
||
|
||
[adminUserSettings]
|
||
admin = "Admin"
|
||
title = "User Control Settings"
|
||
|
||
[agents]
|
||
stirling_name = "Stirling"
|
||
|
||
[analytics]
|
||
learnMore = "Learn more about our analytics"
|
||
paragraph1 = "Stirling PDF has opt-in analytics to help us improve the product. We do not track any personal information or file contents."
|
||
paragraph2 = "Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better."
|
||
title = "Do you want to help make Stirling 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"
|
||
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"
|
||
width = "Width"
|
||
|
||
[app]
|
||
description = "The Free Adobe Acrobat alternative (10M+ Downloads)"
|
||
|
||
[appBanner]
|
||
dismiss = "Dismiss"
|
||
|
||
[attachments]
|
||
convertToPdfA3b = "Convert to PDF/A-3b"
|
||
convertToPdfA3bDescription = "Creates an archival PDF with embedded attachments"
|
||
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"
|
||
tags = "attachments,add,remove,embed,file"
|
||
title = "Add Attachments"
|
||
|
||
[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 system not available"
|
||
notAvailableMessage = "The audit system is not configured or not available."
|
||
|
||
[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"
|
||
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)"
|
||
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]
|
||
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"
|
||
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"
|
||
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]
|
||
completing = "Completing authentication"
|
||
invalidToken = "OAuth login failed - invalid token."
|
||
missingToken = "OAuth login failed - no token received."
|
||
oauthFailed = "OAuth login failed. Please try again."
|
||
pleaseWait = "Please wait while we finish signing you in."
|
||
signedOut = "You have been signed out. Please sign in again."
|
||
windowMayClose = "You can close this window once it completes."
|
||
|
||
[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"
|
||
|
||
[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]
|
||
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..."
|
||
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..."
|
||
wait = "Please wait for the backend to finish launching and try again."
|
||
|
||
[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"
|
||
|
||
[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.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"
|
||
|
||
[bulkSelection]
|
||
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"
|
||
signed = "Signed"
|
||
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"
|
||
early = "Finalize with Current Signatures"
|
||
|
||
[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"
|
||
backToList = "Back to Sessions"
|
||
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"
|
||
owner = "Owner"
|
||
participantRemoved = "Participant removed"
|
||
participants = "Participants"
|
||
participantsAdded = "Participants added successfully"
|
||
removeParticipant = "Remove"
|
||
removeParticipantError = "Failed to remove participant"
|
||
selectUsers = "Select users..."
|
||
sessionInfo = "Session Info"
|
||
|
||
[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"
|
||
advancedSettings = "Advanced Settings"
|
||
backToList = "Back to Sign Requests"
|
||
certificateChoice = "Select a certificate to sign with"
|
||
changeSignature = "Change signature"
|
||
clearSignature = "Clear Signature"
|
||
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"
|
||
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"
|
||
noSignatures = "Please place at least one signature on the PDF"
|
||
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"
|
||
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"
|
||
signingTitle = "Signing"
|
||
textColor = "Text Color"
|
||
typeSignature = "Type your name to create a signature"
|
||
uploadCert = "Custom Certificate"
|
||
uploadCertDesc = "Use your own P12/PFX certificate"
|
||
uploadSignature = "Upload your signature image"
|
||
usePersonalCert = "Personal Certificate"
|
||
usePersonalCertDesc = "Auto-generated for your account"
|
||
useServerCert = "Organization Certificate"
|
||
useServerCertDesc = "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 = "You have placed {{count}} signature. Choose your certificate to complete signing."
|
||
description_other = "You have placed {{count}} signatures. Choose your certificate to complete signing."
|
||
sign = "Sign Document"
|
||
title = "Configure Certificate"
|
||
|
||
[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]
|
||
inviteUsers = "Add Users"
|
||
loadError = "Failed to load users"
|
||
noTeam = "No Team"
|
||
noUsers = "No other users found."
|
||
placeholder = "Select users..."
|
||
|
||
[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 <b>self-signed</b> certificate. Same <b>tamper-evident seal</b> and <b>audit trail</b>; typically shows <b>Unverified</b> 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 <b>Trusted</b> 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 <b>Trusted</b> status? <b>Manual</b>. Need a fast, tamper-evident seal and audit trail with no setup? <b>Auto</b>."
|
||
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."
|
||
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."
|
||
|
||
[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 printing different formats"
|
||
|
||
[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 = "To make these permissions unchangeable, use the Add Password tool to set an owner password."
|
||
|
||
[chat.actions]
|
||
copy = "Copy message"
|
||
|
||
[chat.emptyState]
|
||
text = "Ask a question about your documents or get help with PDF tools."
|
||
|
||
[chat.fab]
|
||
close = "Close chat"
|
||
open = "Open Stirling AI assistant"
|
||
|
||
[chat.header]
|
||
agentMenu = "Stirling agent options"
|
||
assistant = "AI Assistant"
|
||
clearChat = "Clear chat"
|
||
|
||
[chat.input]
|
||
disclaimer = "AI can make mistakes. Be sure to verify the output before sharing."
|
||
placeholder = "What do you want to do?"
|
||
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"
|
||
moreFiles = "+{{count}} more"
|
||
openFromComputer = "Open from computer"
|
||
removeFile = "Remove {{name}}"
|
||
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."
|
||
|
||
[chat.toolsUsed]
|
||
summary_one = "Ran 1 tool"
|
||
summary_other = "Ran {{count}} tools"
|
||
unknownTool = "Unknown tool"
|
||
|
||
[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"
|
||
|
||
[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"
|
||
|
||
[common]
|
||
actions = "Actions"
|
||
back = "Back"
|
||
cancel = "Cancel"
|
||
close = "Close"
|
||
codeSample = "Code sample"
|
||
collapse = "Collapse"
|
||
confirm = "Confirm"
|
||
continue = "Continue"
|
||
copied = "Copied!"
|
||
copy = "Copy"
|
||
done = "Done"
|
||
enterValue = "Enter value"
|
||
error = "Error"
|
||
expand = "Expand"
|
||
loading = "Loading..."
|
||
next = "Next"
|
||
open = "Open"
|
||
preview = "Preview"
|
||
previous = "Previous"
|
||
refresh = "Refresh"
|
||
remaining = "Remaining"
|
||
retry = "Retry"
|
||
save = "Save"
|
||
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"
|
||
|
||
[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.settings]
|
||
desiredSize = "Desired File Size"
|
||
desiredSizePlaceholder = "Enter size"
|
||
desiredSizeUnit = "Size unit"
|
||
|
||
[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"
|
||
team = "Team"
|
||
|
||
[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"
|
||
sizeError = "Please select an image smaller than 2MB."
|
||
switchedToCustom = "Switched to custom picture. You can now upload your own."
|
||
title = "Profile picture"
|
||
upload = "Upload"
|
||
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]
|
||
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"
|
||
linkWith = "Link with"
|
||
password = "Password (optional)"
|
||
passwordNote = "Leave empty to use email verification only"
|
||
passwordPlaceholder = "Set a password"
|
||
socialLogin = "Upgrade with Social Account"
|
||
title = "Upgrade Guest Account"
|
||
upgradeButton = "Upgrade Account"
|
||
|
||
[config.apiKeys]
|
||
copyKeyAriaLabel = "Copy API key"
|
||
description = "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one."
|
||
docsDescription = "Learn more about integrating with Stirling 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 Stirling 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]
|
||
description = "Model Context Protocol (MCP) lets AI assistants like Claude use your Stirling PDF tools directly. Connect a client once and your assistant can convert, edit, secure and process documents on your behalf."
|
||
guestInfo = "Guest users can't connect MCP clients. Create an account to use the MCP server and let your AI assistant run Stirling 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 Stirling PDF directly."
|
||
title = "MCP Server"
|
||
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]
|
||
label = "Your MCP endpoint"
|
||
|
||
[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 Stirling account on first use - no keys to copy."
|
||
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"
|
||
deny = "Decline"
|
||
lead = "A Stirling 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"
|
||
|
||
[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"
|
||
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"
|
||
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"
|
||
|
||
[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 Stirling 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-Stirling PDF cannot and will never track the content of the documents you work with."
|
||
title = "Analytics"
|
||
|
||
[cookieBanner.preferencesModal.description]
|
||
1 = "Stirling 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 = "Stirling 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"
|
||
|
||
[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.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"
|
||
|
||
[database]
|
||
backupCreated = "Database backup successful"
|
||
fileName = "File Name"
|
||
title = "Database Import/Export"
|
||
|
||
[defaultApp]
|
||
setDefault = "Set Default"
|
||
title = "Set as Default PDF App"
|
||
|
||
[defaultApp.error]
|
||
message = "Failed to set default PDF handler"
|
||
title = "Error"
|
||
|
||
[defaultApp.prompt]
|
||
dontRemind = "Don't remind me again"
|
||
message = "Make Stirling PDF your default application for opening PDF files."
|
||
|
||
[defaultApp.settingsOpened]
|
||
message = "In Windows Settings, search for 'PDF' and select Stirling PDF as your default app"
|
||
title = "Settings Opened"
|
||
|
||
[defaultApp.success]
|
||
message = "Stirling PDF is now your default PDF editor"
|
||
title = "Default App Set"
|
||
|
||
[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 = "Stirling-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..."
|
||
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"
|
||
|
||
[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"
|
||
|
||
[emptyFilesState]
|
||
upload = "Upload"
|
||
|
||
[encryptedPdfUnlock]
|
||
description = "This PDF is password protected. Enter the password so you can continue working with it."
|
||
emptyResponse = "Password removal did not produce a file."
|
||
incorrectPassword = "Incorrect password"
|
||
missingFile = "The selected file is no longer available."
|
||
required = "Enter the password to continue."
|
||
skip = "Skip for now"
|
||
successBody = "Password removed successfully."
|
||
successBodyWithName = "Password removed from {{fileName}}"
|
||
successTitle = "Password removed"
|
||
title = "Remove password to continue"
|
||
unlock = "Unlock & Continue"
|
||
unlockAll = "Use for all ({{count}})"
|
||
unlockAllPartialFail = "Wrong password for: {{names}}"
|
||
unlockAllSuccess_one = "Unlocked {{count}} file."
|
||
unlockAllSuccess_other = "Unlocked {{count}} files."
|
||
unlockPrompt = "Unlock PDF to continue"
|
||
viewerLocked = "This PDF is password-protected"
|
||
viewerUnlock = "Unlock"
|
||
|
||
[encryptedPdfUnlock.password]
|
||
label = "PDF password"
|
||
placeholder = "Enter the PDF password"
|
||
|
||
[endpointStatistics]
|
||
title = "Endpoint Statistics"
|
||
|
||
[error]
|
||
_value = "Error"
|
||
dismissAllErrors = "Dismiss All Errors"
|
||
generic = "An error occurred"
|
||
|
||
[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]
|
||
addFiles = "Add Files"
|
||
|
||
[fileManager]
|
||
active = "Active"
|
||
addToUpload = "Add to Upload"
|
||
changesNotUploaded = "Changes not uploaded"
|
||
clearAll = "Clear All"
|
||
clearSelection = "Clear"
|
||
closeAllFiles = "Close all files"
|
||
closeFile = "Close File"
|
||
cloudFile = "Cloud file"
|
||
copyCreated = "Copy saved to this device."
|
||
copyFailed = "Could not create a copy."
|
||
delete = "Delete"
|
||
deleteAll = "Delete All"
|
||
deleteSelected = "Delete Files"
|
||
deselectAll = "Uncheck All"
|
||
details = "File Details"
|
||
download = "Download"
|
||
downloadSelected = "Download Files"
|
||
dropFilesHere = "Drop files here"
|
||
fileFormat = "Format"
|
||
fileHistory = "File History"
|
||
fileName = "Name"
|
||
fileSize = "Size"
|
||
filesSelected = "files"
|
||
filesStored = "files stored"
|
||
fileVersion = "Version"
|
||
filterAll = "All"
|
||
filterLocal = "Local"
|
||
filterSharedByMe = "Shared by me"
|
||
filterSharedWithMe = "Shared with me"
|
||
googleDrive = "Google Drive"
|
||
googleDriveNotAvailable = "Google Drive integration not available"
|
||
googleDriveShort = "Drive"
|
||
hideHistory = "Hide History"
|
||
lastModified = "Last Modified"
|
||
lastSynced = "Last synced"
|
||
leaveShare = "Remove from my list"
|
||
leaveShareFailed = "Could not remove the shared file."
|
||
leaveShareSuccess = "Removed from your shared list."
|
||
loadingFiles = "Loading files..."
|
||
localOnly = "Local only"
|
||
makeCopy = "Make a copy"
|
||
mobileShort = "Mobile"
|
||
mobileUpload = "Mobile Upload"
|
||
mobileUploadNotAvailable = "Mobile upload not enabled"
|
||
moreOptions = "More options"
|
||
nextFile = "Next file"
|
||
noFiles = "No files available"
|
||
noFilesFound = "No files found matching your search"
|
||
noRecentFiles = "No recent files found"
|
||
openFile = "Open File"
|
||
openFiles = "Open Files"
|
||
openInFileEditor = "Open in File Editor"
|
||
openInPageEditor = "Open in Page Editor"
|
||
owner = "Owner"
|
||
ownerUnknown = "Unknown"
|
||
previousFile = "Previous file"
|
||
recent = "Recent"
|
||
removeBoth = "Remove from both"
|
||
removeFilePrompt = "This file is saved on this device and on your server. Where would you like to remove it from?"
|
||
removeFileTitle = "Remove file"
|
||
removeLocalOnly = "This device only"
|
||
removeServerFailed = "Could not remove the file from the server."
|
||
removeServerOnly = "Server only"
|
||
removeServerOnlyPrompt = "This file is stored only on your server. Would you like to remove it from the server?"
|
||
removeServerSuccess = "Removed from server."
|
||
removeSharedPrompt = "This file is shared with you. You can remove it from this device or your shared list."
|
||
removeSharedServerOnlyBlockedPrompt = "This file is shared with you and stored only on the server."
|
||
removeSharedServerOnlyPrompt = "This file is shared with you and stored only on the server. Remove it from your list?"
|
||
restore = "Restore"
|
||
saveSelected = "Save Files"
|
||
searchFiles = "Search files..."
|
||
selectAll = "Check All"
|
||
selectedCount = "{{count}} checked"
|
||
share = "Share"
|
||
shared = "Shared"
|
||
sharedByYou = "Shared by you"
|
||
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"
|
||
shareSelected = "Share Files"
|
||
sharing = "Sharing"
|
||
showAll = "Show All"
|
||
showHistory = "Show History"
|
||
sortBy = "Sort files"
|
||
sortByDate = "Sort by Date"
|
||
sortByName = "Sort by Name"
|
||
sortBySize = "Sort by Size"
|
||
storage = "Storage"
|
||
storageState = "Storage"
|
||
storageUsed = "Storage used"
|
||
synced = "Synced"
|
||
title = "Upload PDF Files"
|
||
toolChain = "Tools Applied"
|
||
unsupported = "Unsupported"
|
||
unzip = "Unzip"
|
||
updateOnServer = "Update on Server"
|
||
uploadSelected = "Upload Files"
|
||
uploadToServer = "Upload to Server"
|
||
versionHistory = "Version history"
|
||
|
||
[files]
|
||
addFiles = "Add files"
|
||
created = "Created"
|
||
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"
|
||
dropToAdd = "Drop files to add"
|
||
duplicateFailed = "Could not duplicate file"
|
||
expand = "Expand sidebar"
|
||
googleDrive = "Google Drive"
|
||
googleDriveDisabled = "Google Drive is not configured"
|
||
leaveMyFiles = "Leave File library"
|
||
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"
|
||
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]
|
||
addToWorkspace = "Add to workspace"
|
||
addToWorkspaceCount = "Add {{count}} to workspace"
|
||
allFiles = "All files"
|
||
back = "Back"
|
||
backToFolder = "Back to {{folder}}"
|
||
backToMyFiles = "Back to File library"
|
||
breadcrumbs = "Folder path"
|
||
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 All files."
|
||
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 start in Local. Use 'Move to' or 'Save to cloud' to organize them into a folder."
|
||
duplicate = "Duplicate"
|
||
file = "File"
|
||
fileInfo = "File info"
|
||
fileMenu = "File actions"
|
||
folder = "Folder"
|
||
folderItems_one = "{{count}} item"
|
||
folderItems_other = "{{count}} items"
|
||
folderMenu = "Folder actions"
|
||
inPath = "in {{path}}"
|
||
inWorkspace = "Open"
|
||
inWorkspaceAria = "Already in workspace"
|
||
loading = "Loading…"
|
||
localFoldersUnavailable = "Folders are cloud-only - save a file to the cloud to organize it."
|
||
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. Ask your admin to turn it on."
|
||
newFolderTabUnavailable = "Switch to All or Cloud 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"
|
||
refresh = "Refresh from server"
|
||
remove = "Delete"
|
||
removeVersion = "Remove this version"
|
||
rename = "Rename"
|
||
renamed = "Renamed"
|
||
renameFolder = "Rename folder"
|
||
resizeFolderTree = "Resize folder tree (arrow keys, Shift for bigger steps; double-click to auto-fit)"
|
||
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"
|
||
selectAllHint = "Click to select all. Tip: hold Ctrl (or Cmd) to add files one at a time, Shift to select a range."
|
||
selectedCount = "{{count}} selected"
|
||
selectFile = "Select file {{name}}"
|
||
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"
|
||
upload = "Upload"
|
||
uploadedToLocal = "Uploaded files start in Local. Use 'Save to cloud' to put them in a folder."
|
||
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"
|
||
icon = "Icon"
|
||
title = "Appearance"
|
||
useColour = "Use color {{c}}"
|
||
|
||
[filesPage.column]
|
||
modified = "Modified"
|
||
name = "Name"
|
||
size = "Size"
|
||
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.empty]
|
||
hint = "Drop PDFs anywhere on this page to upload, or use the New folder button to organize your files."
|
||
newFolderCta = "Create folder"
|
||
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.local]
|
||
hint = "Files saved without uploading stay here. Drop a file to add one."
|
||
title = "No local-only files"
|
||
|
||
[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}}"
|
||
cloudDeleteFailed_one = "Couldn't delete 1 file from the cloud."
|
||
cloudDeleteFailed_other = "Couldn't delete {{count}} files from the cloud."
|
||
deleteFolderFailed = "Could not delete folder."
|
||
deleteFolderFailedDetail = "Could not delete folder: {{message}}"
|
||
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}}"
|
||
moveFilesFailed = "Could not move files."
|
||
moveFilesFailedDetail = "Could not move files: {{message}}"
|
||
moveFolderFailed = "Could not move folder."
|
||
moveFolderFailedDetail = "Could not move folder: {{message}}"
|
||
removeFilesFailed = "Could not remove files."
|
||
removeFilesFailedDetail = "Could not remove files: {{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.folderName]
|
||
cancel = "Cancel"
|
||
error = "Could not save folder. Try again."
|
||
label = "Folder name"
|
||
placeholder = "Folder name"
|
||
|
||
[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.origin]
|
||
all = "All sources"
|
||
cloud = "Cloud"
|
||
cloudHint = "Stored on the Stirling server"
|
||
local = "Local"
|
||
localHint = "Only stored in this browser"
|
||
shared = "Shared"
|
||
sharedHint = "Shared with you via link"
|
||
|
||
[filesPage.search]
|
||
clear = "Clear filter"
|
||
label = "Filter files by name"
|
||
placeholder = "Filter files…"
|
||
|
||
[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.tabName]
|
||
local = "Local"
|
||
recent = "Recent"
|
||
shared = "Shared with me"
|
||
sharedByMe = "Shared by me"
|
||
|
||
[filesPage.tabs]
|
||
all = "All"
|
||
ariaLabel = "File views"
|
||
recent = "Recent"
|
||
shared = "Shared with me"
|
||
sharedByMe = "Shared by me"
|
||
|
||
[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"
|
||
|
||
[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"
|
||
filesAvailable = "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"
|
||
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"
|
||
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"
|
||
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]
|
||
commit = "Add {{count}} field(s) to PDF"
|
||
empty = "No fields drawn yet."
|
||
failed = "Failed to add fields"
|
||
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.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."
|
||
failed = "Failed to save changes"
|
||
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"
|
||
|
||
[getPdfInfo]
|
||
downloadJson = "Download JSON"
|
||
downloads = "Downloads"
|
||
indexTitle = "Index"
|
||
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"
|
||
|
||
[getPdfInfo.error]
|
||
partial = "Some files could not be processed."
|
||
unexpected = "Unexpected error during extraction."
|
||
|
||
[getPdfInfo.other]
|
||
attachments = "Attachments"
|
||
embeddedFiles = "Embedded Files"
|
||
javaScript = "JavaScript"
|
||
layers = "Layers"
|
||
structureTree = "StructureTree"
|
||
xmp = "XMPMetadata"
|
||
|
||
[getPdfInfo.perPage]
|
||
annotations = "Annotations"
|
||
fonts = "Fonts"
|
||
images = "Images"
|
||
links = "Links"
|
||
multimedia = "Multimedia"
|
||
size = "Size"
|
||
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"
|
||
completed = "Completed"
|
||
current = "Current"
|
||
stepLabel = "Step {{number}}"
|
||
|
||
[groupSigning.steps.configureDefaults]
|
||
continue = "Continue"
|
||
invisible = "Signatures will be invisible (metadata only)"
|
||
locationLabel = "Location:"
|
||
preview = "Preview"
|
||
reasonLabel = "Reason:"
|
||
title = "Configure Signature Settings"
|
||
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 = "Stirling PDF logo shown"
|
||
participantCount_one = "{{count}} participant will sign in order"
|
||
participantCount_other = "{{count}} participants will sign in order"
|
||
participants = "Participants"
|
||
reason = "Reason:"
|
||
send = "Send Signing Requests"
|
||
signatureSettings = "Signature Settings"
|
||
title = "Review Session Details"
|
||
titleShort = "Review & Send"
|
||
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"
|
||
title = "Select Document"
|
||
|
||
[groupSigning.steps.selectParticipants]
|
||
continue = "Continue"
|
||
count_one = "{{count}} participant selected"
|
||
count_other = "{{count}} participants selected"
|
||
label = "Select participants"
|
||
placeholder = "Choose participants to sign..."
|
||
title = "Choose Participants"
|
||
|
||
[groupSigning.tooltip]
|
||
header = "About Group Signing"
|
||
|
||
[groupSigning.tooltip.finalization]
|
||
bullet1 = "All signatures are applied in the participant order you specified"
|
||
bullet2 = "You can finalize with partial signatures if needed"
|
||
bullet3 = "Once finalized, the session cannot be modified"
|
||
description = "Once all participants have signed (or you choose to finalize early), you can generate the final signed PDF."
|
||
title = "Finalization Process"
|
||
|
||
[groupSigning.tooltip.roles]
|
||
bullet1 = "Owner (you): Creates session, configures signature defaults, finalizes document"
|
||
bullet2 = "Participants: Create their signature, choose certificate, place on PDF"
|
||
bullet3 = "Participants cannot modify signature visibility, reason, or location settings"
|
||
description = "You control the signature appearance settings for all participants."
|
||
title = "Participant Roles"
|
||
|
||
[groupSigning.tooltip.sequential]
|
||
bullet1 = "First participant must sign before the second can access the document"
|
||
bullet2 = "Ensures proper signing order for legal compliance"
|
||
bullet3 = "You can reorder participants by dragging them in the list"
|
||
description = "Participants sign documents in the order you specify. Each signer receives a notification when it is their turn."
|
||
title = "Sequential Signing"
|
||
|
||
[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 Stirling PDF as a guest!"
|
||
|
||
[home.addAttachments]
|
||
desc = "Add or remove embedded files (attachments) to/from a PDF"
|
||
tags = "embed,attach,include,attachments,attach files,embed files,include files,add files,file attachment,associated files,supplementary files"
|
||
title = "Add 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.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.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 = "Stirling PDF logo"
|
||
openFiles = "Open files"
|
||
swipeHint = "Swipe left or right to switch views"
|
||
tools = "Tools"
|
||
toolsSlide = "Tool selection panel"
|
||
viewSwitcher = "Switch workspace view"
|
||
workbenchSlide = "Workspace panel"
|
||
workspace = "Workspace"
|
||
|
||
[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.pdfCommentAgent]
|
||
desc = "Ask AI to annotate a PDF with sticky-note comments based on your prompt"
|
||
tags = "AI,agent,comment,annotate,sticky note,review,feedback,notes"
|
||
title = "Add AI comments"
|
||
|
||
[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 password protection from your PDF document."
|
||
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.scannerEffect]
|
||
desc = "Create a PDF that looks like it was scanned"
|
||
tags = "scan,simulate,create,fake scan,look scanned,scanner effect,make look scanned,photocopy effect,simulate scanner,realistic scan"
|
||
title = "Scanner Effect"
|
||
|
||
[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]
|
||
desc = "Request signatures from others and track signing sessions"
|
||
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"
|
||
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 Stirling 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"
|
||
uploadFromComputer = "Browse files"
|
||
|
||
[language]
|
||
direction = "ltr"
|
||
|
||
[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]
|
||
toolUnavailable = "This tool requires an account. Sign in to Stirling Cloud 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"
|
||
title = "Sign in"
|
||
unexpectedError = "Unexpected error: {{message}}"
|
||
updatePassword = "Update password"
|
||
useMagicLink = "Use magic link instead"
|
||
username = "Username"
|
||
youAreLoggedIn = "You are logged in!"
|
||
|
||
[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.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.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"
|
||
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."
|
||
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]
|
||
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."
|
||
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"
|
||
title = "Notifications"
|
||
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 Stirling PDF."
|
||
title = "Authentication Successful"
|
||
|
||
[oauthConsent]
|
||
approve = "Allow access"
|
||
approving = "Allowing..."
|
||
decisionFailed = "Could not submit your decision. Please try again."
|
||
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 Stirling PDF account"
|
||
scopesIntro = "This will allow {{app}} to:"
|
||
signedInAs = "Signed in as {{name}}"
|
||
signInButton = "Sign in to continue"
|
||
signInPrompt = "Sign in to your Stirling PDF account to continue connecting the app."
|
||
title = "Authorize access"
|
||
unknownApp = "A third-party application"
|
||
|
||
[oauthConsent.access]
|
||
actAsYou = "Act as you - everything {{app}} does runs under your account and counts towards your usage"
|
||
tools = "Use your Stirling PDF tools on your behalf - convert, edit, sign, secure and process your documents"
|
||
|
||
[oauthConsent.scope]
|
||
email = "See your email address"
|
||
openid = "Confirm your identity"
|
||
phone = "See your phone number"
|
||
profile = "See your basic profile information"
|
||
|
||
[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.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 <strong>Active Files</strong> view shows all of the PDFs you have loaded into the tool."
|
||
allTools = "This is the <strong>Tools</strong> 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 <strong>Files</strong> 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 <strong>Pin</strong> button if you'd rather your files stay active after running tools on them."
|
||
results = "After the tool has finished running, the <strong>Review</strong> 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 <strong>Crop</strong> tool to demonstrate how to use one of the tools."
|
||
stepOf = "Step {{current}} of {{total}}"
|
||
toolInterface = "This is the <strong>Crop</strong> 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 <strong>Workbench</strong> - the main area where you view and edit your PDFs."
|
||
wrapUp = "You're all set! You can replay this tour anytime - just open <strong>Settings</strong> and find it here in the <strong>Tours</strong> section under Help."
|
||
|
||
[onboarding.buttons]
|
||
back = "Back"
|
||
download = "Download →"
|
||
next = "Next →"
|
||
showMeAround = "Show me around"
|
||
skipForNow = "Skip for now"
|
||
skipTheTour = "Skip the tour"
|
||
|
||
[onboarding.checklist]
|
||
dismiss = "Dismiss"
|
||
title = "Set up Stirling PDF"
|
||
|
||
[onboarding.checklist.downloadDesktop]
|
||
description = "Run Stirling natively on your machine"
|
||
title = "Download Stirling for Desktop"
|
||
|
||
[onboarding.checklist.inviteTeam]
|
||
description = "Collaborate with your team"
|
||
title = "Invite team members"
|
||
|
||
[onboarding.checklist.shareAnalytics]
|
||
description = "Help improve Stirling"
|
||
title = "Share anonymous usage data"
|
||
|
||
[onboarding.checklist.takeTour]
|
||
description = "See how Stirling works in a quick walkthrough"
|
||
title = "Take the tour"
|
||
|
||
[onboarding.desktopInstall]
|
||
body = "Stirling 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.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 <strong>{{freeTierLimit}}</strong> people on your server get to use Stirling free of charge."
|
||
adminBodyLoginEnabled = "As an admin, you can manage users, configure settings, and monitor server health. The first <strong>{{freeTierLimit}}</strong> people on your server get to use Stirling 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 = "Stirling now runs <strong>Policies</strong> — automated rules that classify, secure, and process every document as it arrives. Set them up and monitor runs in the <strong>Processor</strong>."
|
||
cta = "Check out the Processor"
|
||
title = "Check out the Stirling Processor"
|
||
|
||
[onboarding.saas.freeEditor]
|
||
freeLine = "The editor is now <free>completely free</free>."
|
||
premium = "We've added loads of new features, including <strong>Policies</strong> and <strong>Agent Chat</strong>."
|
||
title = "Welcome to Stirling"
|
||
|
||
[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"
|
||
|
||
[onboarding.serverLicense]
|
||
freeBody = "Our <strong>Open-Core</strong> licensing permits up to <strong>{{freeTierLimit}}</strong> users for free. To scale uninterrupted, we recommend the Stirling Team plan - <strong>100 users</strong> and <strong>SSO support</strong> for $99/mo."
|
||
freeTitle = "Team plan"
|
||
overLimitBody = "Our licensing permits up to <strong>{{freeTierLimit}}</strong> users for free. You have <strong>{{overLimitUserCopy}}</strong> Stirling users. To continue uninterrupted, upgrade to the Stirling Team plan - <strong>100 users</strong>, PDF text editing, and full admin control for $99/mo."
|
||
overLimitTitle = "Team plan needed"
|
||
seePlans = "See Plans →"
|
||
upgrade = "Upgrade now →"
|
||
|
||
[onboarding.tourOverview]
|
||
body = "Stirling 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 = "Stirling PDF is now ready for teams of all sizes. This update includes a new layout, powerful new admin capabilities, and our most requested feature - <strong>Edit Text</strong>."
|
||
title = "Welcome to Stirling"
|
||
|
||
[onboarding.whatsNew]
|
||
activeFilesView = "Use Active Files to see everything you have open and pick what to work on."
|
||
fileUpload = "Use the <strong>Files</strong> button to upload or pick a recent PDF. We will load a sample so you can see the workspace."
|
||
leftPanel = "The left <strong>Tools</strong> 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 <strong>Quick Access</strong> rail to jump between Reader, Automate, your files, and all the tours."
|
||
topBar = "The top bar lets you swap between <strong>Viewer</strong>, <strong>Page Editor</strong>, and <strong>Active Files</strong>."
|
||
wrapUp = "That is what is new in V2. Open the <strong>Tours</strong> 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"
|
||
|
||
[pageEdit]
|
||
deselectAll = "None"
|
||
selectAll = "Check All"
|
||
|
||
[pageEditor]
|
||
title = "Page Editor"
|
||
|
||
[pageEditor.emptyState]
|
||
body = "Add files to start editing pages"
|
||
title = "No PDF files loaded"
|
||
|
||
[pageEditor.toolbar]
|
||
delete = "Delete Selected"
|
||
redo = "Redo"
|
||
rotateLeft = "Rotate Selected Left"
|
||
rotateRight = "Rotate Selected Right"
|
||
undo = "Undo"
|
||
|
||
[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.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 = "<strong>1,3-5,8,2n</strong> → pages 1, 3–5, 8, plus evens"
|
||
bullet2 = "<strong>10-,2n-1</strong> → 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 = "<strong>1,3,5</strong> → selects pages 1, 3, 5"
|
||
bullet2 = "<strong>2,7,12</strong> → selects pages 2, 7, 12"
|
||
description = "Enter numbers separated by commas."
|
||
title = "Individual Pages"
|
||
|
||
[pageSelection.tooltip.mathematical]
|
||
bullet1 = "<strong>2n</strong> → all even pages (2, 4, 6…)"
|
||
bullet2 = "<strong>2n-1</strong> → all odd pages (1, 3, 5…)"
|
||
bullet3 = "<strong>3n</strong> → every 3rd page (3, 6, 9…)"
|
||
bullet4 = "<strong>4n-1</strong> → pages 3, 7, 11, 15…"
|
||
description = "Use n in formulas for patterns."
|
||
title = "Mathematical Functions"
|
||
|
||
[pageSelection.tooltip.ranges]
|
||
bullet1 = "<strong>3-6</strong> → selects pages 3–6"
|
||
bullet2 = "<strong>10-15</strong> → selects pages 10–15"
|
||
bullet3 = "<strong>5-</strong> → selects pages 5 to end"
|
||
description = "Use - for consecutive pages."
|
||
title = "Page Ranges"
|
||
|
||
[pageSelection.tooltip.special]
|
||
bullet1 = "<strong>all</strong> → selects all pages"
|
||
title = "Special Keywords"
|
||
|
||
[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]
|
||
body = "Your team can now run automation, AI, and API operations beyond your 500 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 Stirling endpoint programmatically"
|
||
benefit3Title = "API access"
|
||
button = "Turn on Processor →"
|
||
reassurance = "No minimum · Set a $0 cap to test · Cancel anytime"
|
||
subtitle = "Keep going past your 500 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]
|
||
body = "Stirling PDF gives every signed-up account 500 free operations a month, enough to keep most workflows humming without paying a cent. You're currently using Stirling as a guest, which doesn't include billable tools like AI, automations, or hosted processing."
|
||
cancel = "Not now"
|
||
cta = "Sign up free"
|
||
subtext = "Creating an account is free and takes a few seconds. No credit card required."
|
||
title = "Sign up to use {{category}}"
|
||
|
||
[payg.signupRequired.category]
|
||
ai = "AI features"
|
||
api = "this tool"
|
||
automation = "automations"
|
||
default = "this feature"
|
||
|
||
[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. Stirling 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 Stirling endpoint"
|
||
apiTitle = "API calls"
|
||
automationBody = "chained tools or scheduled runs that don't need clicks"
|
||
automationTitle = "Automation pipelines"
|
||
footnote = "Manual tools (viewing, editing, merging, splitting, watermarking, compressing, manual OCR) are always free, even past 500. 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]
|
||
canCloseWindow = "You can now close this window."
|
||
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."
|
||
monthly = "Monthly"
|
||
paymentCanceled = "Payment was canceled. No charges were made."
|
||
perMonth = "/month"
|
||
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..."
|
||
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.emailStage]
|
||
continue = "Continue"
|
||
description = "We'll use this to send your license key and receipts."
|
||
emailLabel = "Email Address"
|
||
emailPlaceholder = "your@email.com"
|
||
modalTitle = "Get Started - {{planName}}"
|
||
|
||
[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}}"
|
||
selectMonthly = "Select Monthly"
|
||
selectYearly = "Select Yearly"
|
||
|
||
[pdfCommentAgent]
|
||
submit = "Generate comments"
|
||
|
||
[pdfCommentAgent.error]
|
||
emptyPrompt = "Please describe what the AI should comment on"
|
||
failed = "Failed to generate comments"
|
||
tooLong = "Prompt is too long (maximum {{max}} characters)"
|
||
|
||
[pdfCommentAgent.prompt]
|
||
label = "What should the AI comment on?"
|
||
placeholder = "e.g. Flag any ambiguous dates and suggest clarifications"
|
||
|
||
[pdfCommentAgent.results]
|
||
title = "Commented PDF"
|
||
|
||
[pdfCommentAgent.settings]
|
||
title = "Comment instructions"
|
||
|
||
[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]
|
||
confirmReplaceDirty = "You have unsaved changes. Replace the open document and discard them?"
|
||
download = "Download"
|
||
downloadTooltip = "Save and download the edited PDF"
|
||
save = "Save PDF"
|
||
saveTooltip = "Apply changes to the file in your workspace (Ctrl+S)"
|
||
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.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.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"
|
||
title = "Find & replace"
|
||
typeToSearch = "Type to search"
|
||
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.arrangement]
|
||
alignDesc = "Align edges L / centre / R / T / mid / B"
|
||
alignKey = "Toolbar align"
|
||
distributeDesc = "Equal horizontal / vertical spacing (3+)"
|
||
distributeKey = "Toolbar distribute"
|
||
frontBackDesc = "Bring to front / send to back"
|
||
frontBackKey = "Toolbar front/back"
|
||
heading = "Object arrangement"
|
||
lockDesc = "Lock / unlock selection (session-only)"
|
||
lockKey = "Lock button"
|
||
orderDesc = "Bring forward / send backward (one step)"
|
||
orderKey = "Toolbar ↑ ↓"
|
||
|
||
[pdfTextEditor.help.clipboard]
|
||
copyDesc = "Copy selected text"
|
||
copyKey = "Ctrl+C"
|
||
cutDesc = "Cut selected (copy + delete)"
|
||
cutKey = "Ctrl+X"
|
||
heading = "Clipboard"
|
||
pasteDesc = "Paste clipboard text as new run"
|
||
pasteKey = "Ctrl+V"
|
||
pastePlainDesc = "Paste as plain text"
|
||
pastePlainKey = "Ctrl+Shift+V"
|
||
|
||
[pdfTextEditor.help.document]
|
||
escDesc = "Clear selection / close find / close help"
|
||
escKey = "Esc"
|
||
heading = "Document"
|
||
helpDesc = "This help"
|
||
helpKey = "? / F1"
|
||
saveDesc = "Save to your workspace"
|
||
saveKey = "Ctrl+S"
|
||
|
||
[pdfTextEditor.help.editing]
|
||
clickDesc = "Edit text"
|
||
clickKey = "Click"
|
||
deleteDesc = "Remove selected"
|
||
deleteKey = "Delete"
|
||
duplicateDesc = "Duplicate selected"
|
||
duplicateKey = "Ctrl+D"
|
||
groupDesc = "Group selected runs (Group button)"
|
||
groupKey = "Ctrl+M"
|
||
heading = "Editing"
|
||
marqueeDesc = "Marquee multi-select"
|
||
marqueeKey = "Ctrl+Shift+drag"
|
||
moveDesc = "Move text run"
|
||
moveKey = "Ctrl+Click + drag"
|
||
selectAllDesc = "Select all"
|
||
selectAllKey = "Ctrl+A"
|
||
shiftClickDesc = "Add / remove a run from selection"
|
||
shiftClickKey = "Ctrl+Click / Shift+Click"
|
||
undoRedoDesc = "Undo / Redo"
|
||
undoRedoKey = "Ctrl+Z / Ctrl+Y"
|
||
ungroupDesc = "Ungroup paragraph: select it, click Ungroup"
|
||
ungroupKey = "-"
|
||
|
||
[pdfTextEditor.help.find]
|
||
enterFindDesc = "Next match"
|
||
enterFindKey = "Enter (in find)"
|
||
enterReplaceDesc = "Replace one (Shift = Replace All)"
|
||
enterReplaceKey = "Enter (in replace)"
|
||
heading = "Find & Replace"
|
||
nextDesc = "Next match (Shift = previous)"
|
||
nextKey = "F3 / Ctrl+G"
|
||
openDesc = "Open find bar (and replace)"
|
||
openKey = "Ctrl+F"
|
||
|
||
[pdfTextEditor.help.formatting]
|
||
caseDesc = "Change case (upper/lower/title/sentence)"
|
||
caseKey = "Toolbar case (Aa)"
|
||
colourDesc = "Change fill colour"
|
||
colourKey = "Toolbar colour"
|
||
fontFamilyDesc = "Swap to base-14 font"
|
||
fontFamilyKey = "Toolbar font family"
|
||
fontSizeDesc = "Change font size"
|
||
fontSizeKey = "Toolbar font size"
|
||
heading = "Text formatting"
|
||
italicDesc = "Italic"
|
||
italicKey = "Toolbar I"
|
||
|
||
[pdfTextEditor.help.image]
|
||
flipDesc = "Flip horizontally or vertically"
|
||
flipKey = "Toolbar flip"
|
||
heading = "Image"
|
||
moveDesc = "Move image"
|
||
moveKey = "Drag"
|
||
resizeDesc = "Resize image"
|
||
resizeKey = "Corner drag"
|
||
rotateDesc = "Rotate 90° clockwise or counter-clockwise"
|
||
rotateKey = "Toolbar rotate"
|
||
|
||
[pdfTextEditor.help.navigation]
|
||
firstLastDesc = "First / last page"
|
||
firstLastKey = "Ctrl+Home / Ctrl+End"
|
||
heading = "Navigation"
|
||
pageDesc = "Next / previous page"
|
||
pageKey = "PageDown / PageUp"
|
||
toolbarZoomDesc = "Manual zoom + Fit to width"
|
||
toolbarZoomKey = "Toolbar zoom"
|
||
zoomDesc = "Zoom in / out"
|
||
zoomKey = "Ctrl+Wheel"
|
||
|
||
[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"
|
||
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 or image on the page to edit it here."
|
||
oneImage = "Image"
|
||
oneText = "Text"
|
||
pages = "Pages"
|
||
tabDocument = "Document"
|
||
tabSelected = "Selected"
|
||
textBoxes = "Text boxes"
|
||
width = "Width"
|
||
widthHint = "A text box's width follows its content and wrapping."
|
||
x = "X"
|
||
y = "Y"
|
||
|
||
[pdfTextEditor.password]
|
||
cancel = "Cancel"
|
||
incorrect = "Incorrect password - try again."
|
||
label = "Password"
|
||
open = "Open"
|
||
protected = "This PDF is password-protected."
|
||
protectedNamed = "\"{{fileName}}\" is password-protected."
|
||
title = "Password required"
|
||
|
||
[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"
|
||
view = "View"
|
||
|
||
[pdfTextEditor.sidebar]
|
||
addImage = "Add image"
|
||
addText = "Add text"
|
||
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 (Ctrl+M)"
|
||
groupTooltipDisabled = "Select 2+ runs to merge"
|
||
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"
|
||
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.toolbar]
|
||
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)"
|
||
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"
|
||
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"
|
||
order = "Order"
|
||
outlineColour = "Outline colour"
|
||
outlineWidth = "Outline width (0 = none)"
|
||
redo = "Redo"
|
||
redoTooltip = "Redo (Ctrl+Y)"
|
||
replaceImage = "Replace, keeping placement"
|
||
rotateLeft = "Rotate 90° left"
|
||
rotateRight = "Rotate 90° right"
|
||
sendBackward = "Send backward"
|
||
sendToBack = "Send to back"
|
||
undo = "Undo"
|
||
undoTooltip = "Undo (Ctrl+Z)"
|
||
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"
|
||
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"
|
||
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"
|
||
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.licenseWarning]
|
||
body = "You have {{total}} users but the free tier only supports {{limit}}. Upgrade to keep Stirling PDF running smoothly."
|
||
cta = "See plans"
|
||
overLimit = "more than {{limit}}"
|
||
title = "Free self-hosted limit reached"
|
||
|
||
[plan.period]
|
||
month = "month"
|
||
|
||
[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.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 = "{{failures}} of {{total}} file(s) couldn't be processed and were exported as-is."
|
||
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"
|
||
enforcingTitle = "Enforcing policy..."
|
||
viewAnyway = "View file (policy still enforcing)"
|
||
|
||
[policyOption]
|
||
autoRedactPhi = "Auto-redact PHI"
|
||
blockExport = "Block export"
|
||
ccpa = "CCPA"
|
||
contracts = "Contracts"
|
||
documents = "Documents"
|
||
fedramp = "FedRAMP"
|
||
financialReports = "Financial reports"
|
||
flagForReview = "Flag for review"
|
||
gdpr = "GDPR"
|
||
hipaa = "HIPAA"
|
||
hold = "Hold"
|
||
hrRecords = "HR records"
|
||
indefinite = "Indefinite"
|
||
insurance = "Insurance"
|
||
invoices = "Invoices"
|
||
iso27001 = "ISO 27001"
|
||
legalFilings = "Legal filings"
|
||
medicalPhi = "Medical / PHI"
|
||
never = "Never"
|
||
ninetyDays = "90 days"
|
||
oneYear = "1 year"
|
||
p60 = "60%"
|
||
p70 = "70%"
|
||
p80 = "80%"
|
||
p90 = "90%"
|
||
p95 = "95%"
|
||
pciDss = "PCI DSS"
|
||
quarantineDocument = "Quarantine document"
|
||
routeToBucket = "Route to bucket"
|
||
s3Bucket = "S3 bucket"
|
||
sevenYears = "7 years"
|
||
sharePoint = "SharePoint"
|
||
soc2 = "SOC 2"
|
||
taxDocuments = "Tax documents"
|
||
thirtyDays = "30 days"
|
||
threeYears = "3 years"
|
||
webhook = "Webhook"
|
||
|
||
[portal]
|
||
comingSoon = "Coming soon"
|
||
|
||
[portal.accountLink.card]
|
||
billingNote = "Unattended processing bills against your org wallet."
|
||
eyebrow = "Account link"
|
||
linkButton = "Link your Stirling account"
|
||
linked = "Linked"
|
||
linkedAs = "Linked as {{name}}."
|
||
linkedGeneric = "This instance is linked."
|
||
notLinked = "Not linked"
|
||
title = "Link this org to its Stirling account"
|
||
unlink = "Unlink"
|
||
|
||
[portal.accountLink.card.error]
|
||
title = "Couldn't link"
|
||
|
||
[portal.accountLink.card.loginNotConfigured]
|
||
after = "to enable account linking against the hosted Stirling account. In dev you can simulate sign-in from the link dialog."
|
||
before = "Set"
|
||
title = "SaaS login not configured"
|
||
|
||
[portal.accountLink.connect]
|
||
close = "Close"
|
||
notNow = "Not now"
|
||
start = "Connect Stirling account"
|
||
step = "Step {{current}} of {{total}}"
|
||
|
||
[portal.accountLink.connect.benefits]
|
||
creditsDetail = "500 free per month"
|
||
creditsLabel = "Credits"
|
||
processorDetail = "Pipelines, policies, sources and audit"
|
||
processorLabel = "Processor"
|
||
teamsDetail = "Free for up to 5 users"
|
||
teamsLabel = "Teams"
|
||
|
||
[portal.accountLink.connect.callback]
|
||
linkedNotSignedIn = "You are not signed in to Stirling in this browser, so usage and billing will ask you to sign in."
|
||
retry = "Try again"
|
||
signedInAnyway = "You are signed in to Stirling, 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 = "Stirling 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 Stirling account."
|
||
pendingTitle = "Almost there"
|
||
switchOnProcessor = "Switch on the Processor"
|
||
title = "Connected"
|
||
|
||
[portal.accountLink.connect.handoff]
|
||
going = "Taking you to stirling.com"
|
||
reauthLede = "Your Stirling session expired. Signing in again keeps usage and billing visible. This server stays connected either way."
|
||
title = "Connecting"
|
||
|
||
[portal.accountLink.instances]
|
||
active = "Active"
|
||
revoke = "Revoke"
|
||
revoked = "Revoked"
|
||
unnamed = "Unnamed instance"
|
||
|
||
[portal.accountLink.instances.columns]
|
||
instance = "Instance"
|
||
lastSeen = "Last seen"
|
||
linked = "Linked"
|
||
status = "Status"
|
||
|
||
[portal.accountLink.instances.empty]
|
||
description = "Link this org's account, then register your self-hosted instances to see them here."
|
||
title = "No linked instances"
|
||
|
||
[portal.accountLink.instances.time]
|
||
daysAgo_one = "{{count}}d ago"
|
||
daysAgo_other = "{{count}}d ago"
|
||
hoursAgo_one = "{{count}}h ago"
|
||
hoursAgo_other = "{{count}}h ago"
|
||
justNow = "just now"
|
||
minutesAgo_one = "{{count}}m ago"
|
||
minutesAgo_other = "{{count}}m ago"
|
||
never = "never"
|
||
|
||
[portal.accountLink.modal]
|
||
cancel = "Cancel"
|
||
continueReauth = "Sign in again"
|
||
linkTitle = "Connect your Stirling account"
|
||
noAuthorizeUrl = "Stirling did not return somewhere to continue. Try again in a moment."
|
||
reauthTitle = "Sign in again"
|
||
startFailed = "Could not reach Stirling to start the connection. Check this server's outbound network access, then try again."
|
||
|
||
[portal.accountLink.modal.loginNotConfigured]
|
||
after = "so this server can finish the connection when you come back."
|
||
and = "and"
|
||
before = "Set"
|
||
title = "Stirling connection not configured"
|
||
|
||
[portal.accountLink.panel]
|
||
instancesSub = "Every self-hosted instance registered to this org. Revoke a credential to immediately cut off its unattended access."
|
||
instancesTitle = "Linked instances"
|
||
revokeError = "Couldn't revoke instance"
|
||
sub = "Link this self-hosted org to its Stirling account so unattended processing bills against your org wallet."
|
||
|
||
[portal.accountLink.panel.loadError]
|
||
forbidden = "Only the team owner can view the org's linked instances."
|
||
generic = "Couldn't load the team's linked instances. Try again in a moment."
|
||
title = "Couldn't load linked instances"
|
||
|
||
[portal.accountLink.rail]
|
||
cta = "Connect"
|
||
later = "Not now"
|
||
sub = "Unlocks teams, PDF processor, pipelines, and policies. PDF editing stays free."
|
||
title = "Connect your Stirling account"
|
||
|
||
[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 Stirling…"
|
||
open = "Open assistant"
|
||
send = "Send"
|
||
title = "Assistant"
|
||
tryAsking = "Try asking"
|
||
typing = "Typing"
|
||
|
||
[portal.auth]
|
||
loading = "Loading"
|
||
redirectingToEditor = "Redirecting to the editor..."
|
||
|
||
[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"
|
||
back = "Back"
|
||
continue = "Continue to payment"
|
||
error = "Couldn't set your spend limit"
|
||
finePrint = "Invoices post monthly. Cancel anytime."
|
||
noLimit = "No limit"
|
||
note = "You're never billed past your limit. Processing just pauses."
|
||
perMonth = "/ mo"
|
||
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. Stirling 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.enterpriseUpsell]
|
||
cta = "Explore Enterprise"
|
||
description = "Committed volume discounts, air-gapped deployment, custom MSA and security reviews, and 3rd-party distributor partnerships."
|
||
eyebrow = "Volume discount · 1M+ PDFs"
|
||
title = "Stirling Enterprise"
|
||
|
||
[portal.billing.freeEditors]
|
||
activeThisMonth = "Active this month"
|
||
cost = "Cost"
|
||
editorsDeployed = "Editors deployed"
|
||
inviteTeammates = "Invite teammates"
|
||
pdfsEdited = "PDFs edited"
|
||
subtitle = "Deploy anywhere, for your whole team."
|
||
title = "Free PDF Editors"
|
||
|
||
[portal.billing.freePlan]
|
||
anywhere = "Web, desktop & self-hosted"
|
||
checkoutErrorTitle = "Couldn't start checkout"
|
||
currentPlan = "Current plan"
|
||
everyPdfTool = "Every PDF tool"
|
||
freeForever = "Free forever"
|
||
noTeamResolved = "No team is resolved on your wallet yet — refresh and try again."
|
||
ownerOnly = "Only the team owner can switch on the Processor plan."
|
||
payInvoice = "Pay invoice to complete"
|
||
planName = "Editor"
|
||
switchOnProcessor = "Switch on the Processor →"
|
||
viewQuote = "View quote"
|
||
|
||
[portal.billing.invoices]
|
||
columnAmount = "Amount"
|
||
columnDate = "Date"
|
||
columnDescription = "Description"
|
||
columnPdfsProcessed = "PDFs processed"
|
||
columnStatus = "Status"
|
||
descriptionFallback = "Invoice"
|
||
downloadAriaLabel = "Download invoice {{number}} as PDF"
|
||
emptyDescription = "Once your team subscribes and the first cycle closes, your invoices appear here."
|
||
emptyTitle = "No invoices yet"
|
||
fetchLimitNote_one = "Showing your {{count}} most recent invoices. Older invoices are in the Stripe portal."
|
||
fetchLimitNote_other = "Showing your {{count}} most recent invoices. Older invoices are in the Stripe portal."
|
||
loadError = "Couldn't load invoices: {{error}}"
|
||
pdfLink = "PDF ↓"
|
||
showAll_one = "Show all {{count}}"
|
||
showAll_other = "Show all {{count}}"
|
||
showFewer_one = "Show fewer (top {{count}})"
|
||
showFewer_other = "Show fewer (top {{count}})"
|
||
showMostRecent_one = "Show {{count}} most recent"
|
||
showMostRecent_other = "Show {{count}} most recent"
|
||
title = "Invoice history"
|
||
viewAriaLabel = "View invoice {{number}} in Stripe"
|
||
viewLink = "View ↗"
|
||
|
||
[portal.billing.paymentMethod]
|
||
billedMonthly = "Billed monthly"
|
||
cardEnding = "{{brand}} ending {{last4}}"
|
||
cardFallback = "Card"
|
||
expiresBilledMonthly = "Expires {{expiry}} · billed monthly"
|
||
eyebrow = "Payment method"
|
||
managedSub = "Your card and billing details are kept securely in Stripe's customer portal."
|
||
managedTitle = "Managed in Stripe"
|
||
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"
|
||
sizeMultiplier = "{{formatted}} PDFs used a size multiplier"
|
||
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]
|
||
capSuffix = "of {{total}} prepaid credits"
|
||
expires = "Expires {{date}}"
|
||
eyebrow = "Prepaid capacity"
|
||
note = "Used before metered billing and outside your spend limit."
|
||
topUp = "Top up"
|
||
|
||
[portal.billing.prepaid.buy]
|
||
back = "Back"
|
||
calcTitle = "Calculate your annual payment"
|
||
cancel = "Cancel"
|
||
cancelPurchase = "Cancel purchase"
|
||
close = "Close"
|
||
continueToPayment = "Continue to payment"
|
||
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]
|
||
change = "Change"
|
||
deployRow = "Deployment"
|
||
done = "Done"
|
||
enterpriseHint = "This is enterprise scale. At this volume, enterprise rates beat any self-serve discount. Rate lock, terms, and a quote in minutes."
|
||
governanceRow = "Governance"
|
||
governanceValue = "{{label}} · {{count}} policies"
|
||
handlesLabel = "Your Processor"
|
||
handlesValue = "handles {{volume}} credits / mo"
|
||
pipelinesLabel = "Pipelines"
|
||
policiesMeta = "{{count}} policies"
|
||
poolCaption = "One pool of {{credits}} credits for the year. Heavy months borrow from light ones."
|
||
priceLabel = "Your year · 12 months for the price of 10"
|
||
rateUnknown = "We'll show the exact price at checkout."
|
||
savings = "You save {{amount}} · 2 months free."
|
||
sizingRow = "Sizing"
|
||
sizingValue = "{{label}} · {{desc}}"
|
||
usersLabel = "Total users"
|
||
|
||
[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]
|
||
cloud = "Stirling Cloud"
|
||
cloudDesc = "Managed by Stirling. Live in minutes."
|
||
cloudValue = "Stirling Cloud · Managed"
|
||
selfhost = "Self-hosted"
|
||
selfhostDesc = "Runs on private infrastructure. Same rate."
|
||
selfhostValue = "Self-hosted · Private infrastructure"
|
||
|
||
[portal.billing.prepaid.offer]
|
||
cta = "Review offer"
|
||
subtitle = "Prepay a year of PDF processing and get two months free, used before metered billing, outside your spend limit."
|
||
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]
|
||
advanced = "Advanced"
|
||
advancedDesc = "Pipelines drive most of your processing."
|
||
none = "None"
|
||
noneDesc = "Not running pipelines yet. Turn them on any time."
|
||
standard = "Standard"
|
||
standardDesc = "A few pipelines re-process arriving PDFs."
|
||
|
||
[portal.billing.prepaid.posture]
|
||
essentials = "Essentials"
|
||
essentialsDesc = "Classification, the default, plus Sharing"
|
||
governed = "Governed"
|
||
governedDesc = "Adds Security and Routing"
|
||
regulated = "Regulated"
|
||
regulatedDesc = "Every category, incl. Compliance, Retention, Ingestion"
|
||
|
||
[portal.billing.prepaid.review]
|
||
download = "Download quote (PDF)"
|
||
downloading = "Preparing…"
|
||
share = "share for approval"
|
||
|
||
[portal.billing.prepaid.size]
|
||
compact = "Compact"
|
||
compactDesc = "Files under 25 MB, no data charges"
|
||
heavy = "Heavy"
|
||
heavyDesc = "Scanned or image-heavy, routinely 50 MB+"
|
||
standard = "Standard"
|
||
standardDesc = "Mostly small, some scans past 25 MB"
|
||
|
||
[portal.billing.prepaid.state]
|
||
exhausted = "Used up"
|
||
healthy = "Plenty left"
|
||
low = "Running low"
|
||
|
||
[portal.billing.spendLimit]
|
||
adjustLimit = "Adjust limit"
|
||
cancel = "Cancel"
|
||
capControlNote = "Changes apply immediately — raise or lower the ceiling any time."
|
||
capSuffix = "/ month"
|
||
capSuffixWithDocs = "/ month · ≈ {{documents}} documents"
|
||
displaySub = "You're only billed for what you process automatically — never past the ceiling."
|
||
editTitle = "Set your monthly ceiling"
|
||
eyebrow = "Spend limit"
|
||
guardrailBody = "a hard ceiling; you're never billed past it. At the cap, metered processing pauses (unlimited PDF editing keeps working) until you raise it or the cycle resets. Nothing is lost."
|
||
guardrailLabel = "Your guardrail:"
|
||
noCap = "no cap"
|
||
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.spendThisMonth]
|
||
eyebrow = "Spend this month"
|
||
freeRemaining_one = "{{formatted}} free credit remaining"
|
||
freeRemaining_other = "{{formatted}} free credits remaining"
|
||
processed_one = "{{formattedCount}} PDF processed."
|
||
processed_other = "{{formattedCount}} PDFs processed."
|
||
processedWithRate_one = "{{formattedCount}} PDF processed, at {{rate}} each."
|
||
processedWithRate_other = "{{formattedCount}} PDFs processed, at {{rate}} each."
|
||
|
||
[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.walletMeter]
|
||
barAria = "Free credits remaining"
|
||
capSuffix_one = "of {{allowance}} free credit left this month"
|
||
capSuffix_other = "of {{allowance}} free credits left this month"
|
||
eyebrow = "Processor trial"
|
||
statusLabel_one = "{{used}} used"
|
||
statusLabel_other = "{{used}} used"
|
||
sub = "Use the PDF Editor for free. Pay to process PDFs automatically."
|
||
title_one = "{{allowance}} free credit every month"
|
||
title_other = "{{allowance}} free credits every month"
|
||
titleWithRate_one = "{{allowance}} free credit every month, then {{rate}} per PDF"
|
||
titleWithRate_other = "{{allowance}} free credits every month, then {{rate}} per PDF"
|
||
|
||
[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 = "Stirling 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.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.editorAdmin]
|
||
subtitle = "Deploy the Stirling PDF Editor, pair self-hosted instances to your org, and operate the running fleet — targets, health, credentials, and offline activation in one place."
|
||
title = "Editor deployment"
|
||
|
||
[portal.editorAdmin.health.columns]
|
||
activeUsers = "Active users"
|
||
host = "Host"
|
||
lastSeen = "Last seen"
|
||
region = "Region"
|
||
status = "Status"
|
||
target = "Target"
|
||
version = "Version"
|
||
|
||
[portal.editorAdmin.health.empty]
|
||
description = "Deploy a target and pair it to see live instance health here."
|
||
title = "No instances reporting"
|
||
|
||
[portal.editorAdmin.offlineActivation]
|
||
enterpriseTag = "Enterprise"
|
||
generateButton = "Generate offline bundle"
|
||
lockCopy = "Offline and on-prem activation is part of Enterprise."
|
||
subtitle = "Generate a signed activation bundle for an offline or on-prem install with no outbound network path. Transfer it to the instance and apply it during first-run setup."
|
||
talkToSales = "Talk to sales"
|
||
title = "Air-gapped activation"
|
||
|
||
[portal.editorAdmin.offlineActivation.readyBanner]
|
||
description = "{{file}} is signed and ready to transfer. It activates one instance and expires in 14 days."
|
||
title = "Bundle ready"
|
||
|
||
[portal.editorAdmin.pairing]
|
||
generated = "Generated ✓"
|
||
generateNewCode = "Generate new code"
|
||
lockCopy = "IaC provisioning is part of Enterprise."
|
||
rotate = "Rotate"
|
||
talkToSales = "Talk to sales"
|
||
|
||
[portal.editorAdmin.sections.health]
|
||
sub = "Every Editor instance reporting in — version, region, status, last seen, and active users."
|
||
title = "Instance health"
|
||
|
||
[portal.editorAdmin.sections.pairing]
|
||
sub = "Connect a self-hosted editor to this org. Generate a token, hand off a short code, or wire it through IaC."
|
||
title = "Pairing"
|
||
|
||
[portal.editorAdmin.sections.targets]
|
||
sub = "Where the Editor runs. Copy a snippet to stand up a self-hosted instance, or use Managed Cloud with no ops."
|
||
title = "Deployment targets"
|
||
|
||
[portal.editorAdmin.serviceToken]
|
||
currentToken = "Current token"
|
||
lastRotated = "Last rotated"
|
||
rotateButton = "Rotate service token"
|
||
subtitle = "Instances authenticate to the org with this credential. Rotate it on a schedule or immediately after a suspected leak."
|
||
title = "Service token"
|
||
|
||
[portal.editorAdmin.serviceToken.rotatedBanner]
|
||
description = "A new token was issued. Update each self-hosted instance's STIRLING_SERVICE_TOKEN within the 24h grace window or they'll drop offline."
|
||
title = "Rotate running instances"
|
||
|
||
[portal.editorAdmin.status]
|
||
degraded = "Degraded"
|
||
healthy = "Healthy"
|
||
offline = "Offline"
|
||
pairing = "Pairing"
|
||
|
||
[portal.editorAdmin.targets]
|
||
instanceCount_one = "{{count}} instance"
|
||
instanceCount_other = "{{count}} instances"
|
||
talkToSales = "Talk to sales"
|
||
upgradePlan = "Upgrade plan"
|
||
|
||
[portal.editorAdmin.targets.lock]
|
||
enterprise = "On-prem and Kubernetes self-hosting are part of Enterprise."
|
||
paid = "Self-hosting with Docker and Kubernetes unlocks on a paid plan."
|
||
|
||
[portal.editorAdmin.targets.state]
|
||
available = "Available"
|
||
locked = "Locked"
|
||
running = "Running"
|
||
|
||
[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]
|
||
fromSource = "From source {{source}}"
|
||
occurrences = "{{count}} occurrences"
|
||
reportedBy = "Hit by {{actor}}"
|
||
runReference = "Run {{runId}}"
|
||
subtitle = "Failures recorded from your policy runs and your team's editors, with the actions you can take."
|
||
title = "Failures"
|
||
|
||
[portal.failures.action]
|
||
acknowledge = "Acknowledge"
|
||
confirm = "Are you sure?"
|
||
decrypt = "Decrypt and retry"
|
||
dismiss = "Dismiss"
|
||
dismissSkipFile = "Skip this file"
|
||
openInTool = "Retry"
|
||
viewFile = "View file"
|
||
viewInProcessor = "View in processor"
|
||
|
||
[portal.failures.debug]
|
||
copyJson = "Copy JSON"
|
||
dismissAll = "Dismiss all ({{total}})"
|
||
dismissing = "Dismissing..."
|
||
hideJson = "Hide raw JSON ({{total}})"
|
||
refresh = "Refresh failures"
|
||
showJson = "Show raw JSON ({{total}})"
|
||
|
||
[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 = "Policy runs that fail will appear here with the actions you can take."
|
||
title = "No failures recorded"
|
||
|
||
[portal.failures.kind.inputPasswordProtected]
|
||
description = "Your file is password protected, so the run could not read it."
|
||
title = "Password-protected document"
|
||
|
||
[portal.failures.kind.unknown]
|
||
description = "Something went wrong that Stirling does not recognise yet."
|
||
title = "Unrecognised failure"
|
||
|
||
[portal.failures.origin]
|
||
pipeline = "Pipeline"
|
||
policy = "Policy"
|
||
tool = "Tool run"
|
||
|
||
[portal.failures.stage]
|
||
blocked = "Blocked"
|
||
input = "Input"
|
||
internal = "Internal"
|
||
never_ran = "Never ran"
|
||
output = "Output"
|
||
|
||
[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 Stirling PDF Editor"
|
||
|
||
[portal.home.download.docker]
|
||
detailBody = "Run the official image on your server."
|
||
note = "Opens at :8080. Default login: admin / stirling."
|
||
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."
|
||
guideBtn = "View Linux install options"
|
||
note = "AppImage, .deb and .rpm builds are available for common 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 / stirling."
|
||
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 this month"
|
||
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]
|
||
manageEditorDeployment = "Manage Editor deployment"
|
||
sectionsAriaLabel = "Infrastructure sections"
|
||
subtitle = "API credentials and the audit trail for your Stirling workspace."
|
||
title = "Infrastructure"
|
||
|
||
[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 Stirling 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. Stirling 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.keyLabel]
|
||
active = "Active"
|
||
revoked = "Revoked"
|
||
|
||
[portal.infrastructure.tabs]
|
||
apiKeys = "API Keys"
|
||
audit = "Audit Logs"
|
||
deployments = "Deployments"
|
||
models = "Models"
|
||
security = "Security"
|
||
storage = "Storage"
|
||
|
||
[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 Stirling 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"
|
||
sources = "Sources"
|
||
usage = "Usage & Billing"
|
||
users = "Users"
|
||
|
||
[portal.nav.section]
|
||
platform = "PDF Platform"
|
||
processor = "PDF Processor"
|
||
|
||
[portal.pipelines]
|
||
subtitle = "Every automated document pipeline on the backend: an ordered chain of operations over a set of sources, run on a trigger. Click a row for its steps and sources."
|
||
title = "Pipelines"
|
||
|
||
[portal.pipelines.actions]
|
||
newPipeline = "New pipeline"
|
||
|
||
[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"
|
||
editorDestinationHelp = "This pipeline runs on the files in your workspace, and its results replace the file it ran on. There is nowhere else to send them."
|
||
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]
|
||
destination = "Choose a destination"
|
||
heading = "To create this pipeline:"
|
||
incompatible = "Fix steps that can't run in order: {{tools}}"
|
||
name = "Give the pipeline a name"
|
||
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.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.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.kpi]
|
||
active = "Active"
|
||
paused = "Paused"
|
||
total = "Pipelines"
|
||
|
||
[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"
|
||
|
||
[portal.pipelines.trigger]
|
||
editor-export = "Every export"
|
||
editor-upload = "Every upload"
|
||
folder-watch = "Folder watch"
|
||
manual = "Manual"
|
||
schedule = "Scheduled"
|
||
|
||
[portal.policies]
|
||
defaultName = "{{category}} Policy"
|
||
subtitle = "Standing automations that enforce a tool pipeline on every document. Each policy fires on upload or export, runs its tool chain, and saves the enforced version alongside the original."
|
||
title = "Policies"
|
||
|
||
[portal.policies.card]
|
||
comingSoon = "Upgrade to Enterprise"
|
||
notSetUp = "Not set up"
|
||
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 = "Enforce HIPAA, GDPR, SOC 2, or FedRAMP requirements on every document."
|
||
label = "Compliance"
|
||
|
||
[portal.policies.categories.ingestion]
|
||
desc = "Classify documents, extract structured data, enforce naming conventions, and normalize pages."
|
||
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 = "Validates documents against regulatory frameworks before they leave the system."
|
||
|
||
[portal.policies.config.compliance.fields]
|
||
accessLog = "Access log"
|
||
auditTrail = "Audit trail"
|
||
frameworks = "Frameworks"
|
||
onViolation = "When non-compliant"
|
||
|
||
[portal.policies.config.compliance.rules]
|
||
0 = "Framework scan"
|
||
1 = "Enforce action"
|
||
2 = "Audit trail"
|
||
|
||
[portal.policies.config.ingestion]
|
||
summary = "Classifies documents, extracts structured data, enforces naming, and normalizes pages."
|
||
|
||
[portal.policies.config.ingestion.fields]
|
||
belowThreshold = "Below threshold"
|
||
minConfidence = "Min confidence"
|
||
|
||
[portal.policies.config.ingestion.rules]
|
||
0 = "Classify"
|
||
1 = "Extract"
|
||
2 = "Name"
|
||
3 = "Normalize"
|
||
|
||
[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."
|
||
|
||
[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.fields]
|
||
destination = "Destination"
|
||
notify = "Notify on route"
|
||
webhookUrl = "Webhook URL"
|
||
|
||
[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.detail]
|
||
enforces = "Enforces"
|
||
onEveryExport = "On every export"
|
||
onEveryUpload = "On every upload"
|
||
outputAsNewFile = "as a new file"
|
||
outputAsNewVersion = "as a new version"
|
||
recentActivity = "Recent activity"
|
||
retry = "Retry"
|
||
showLess = "Show less"
|
||
showMore = "Show more"
|
||
sources = "Sources"
|
||
|
||
[portal.policies.detail.actions]
|
||
clearHistory = "Clear processed history"
|
||
delete = "Delete"
|
||
editSettings = "Edit settings"
|
||
pause = "Pause"
|
||
resume = "Resume"
|
||
runNow = "Run now"
|
||
|
||
[portal.policies.detail.clearHistory]
|
||
body = "This policy will forget every file it has already processed and reprocess everything currently in its sources on the next run. The files themselves are not changed. This cannot be undone."
|
||
cancel = "Cancel"
|
||
confirm = "Clear history"
|
||
title = "Clear processed history?"
|
||
|
||
[portal.policies.detail.emptyActivity]
|
||
description = "Documents will appear here once this policy runs."
|
||
title = "No activity yet"
|
||
|
||
[portal.policies.endpoints]
|
||
addWatermark = "Watermark"
|
||
autoRedact = "Redact PII"
|
||
classifyAndLabel = "Classify"
|
||
compressPdf = "Compress"
|
||
flatten = "Flatten"
|
||
ocrPdf = "OCR"
|
||
sanitizePdf = "Remove JavaScript"
|
||
|
||
[portal.policies.offline]
|
||
description = "Your policies are saved and will appear once the connection is restored."
|
||
retry = "Retry"
|
||
title = "Backend unavailable"
|
||
|
||
[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 = "stirling-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-stirling"
|
||
|
||
[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.stats]
|
||
activeFor = "Active"
|
||
dataProcessed = "Data processed"
|
||
docsEnforced = "Docs enforced"
|
||
|
||
[portal.policies.status]
|
||
active = "Active"
|
||
paused = "Paused"
|
||
|
||
[portal.policies.summary.active]
|
||
description = "Enforcing on upload/export"
|
||
label = "Active policies"
|
||
|
||
[portal.policies.summary.categories]
|
||
description = "Available to configure"
|
||
label = "Categories"
|
||
|
||
[portal.policies.summary.docsEnforced]
|
||
description = "Across active policies"
|
||
label = "Docs enforced"
|
||
|
||
[portal.policies.summary.paused]
|
||
description = "Configured but not firing"
|
||
label = "Paused"
|
||
|
||
[portal.policies.table]
|
||
appliesTo = "Applies to"
|
||
docs = "Docs enforced"
|
||
enforces = "Enforces"
|
||
policy = "Policy"
|
||
status = "Status"
|
||
|
||
[portal.policies.wizard.actions]
|
||
back = "Back"
|
||
cancel = "Cancel"
|
||
continue = "Continue"
|
||
enablePolicy = "Enable policy"
|
||
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.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.ocr]
|
||
desc = "Runs OCR so scanned pages become selectable, searchable text."
|
||
label = "Make text searchable"
|
||
|
||
[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 tool in the workflow first."
|
||
saveFailed = "Couldn't save the policy. Please try again."
|
||
|
||
[portal.policies.wizard.output]
|
||
heading = "Output & run"
|
||
|
||
[portal.policies.wizard.output.filenameRule]
|
||
autoNumber = "Auto-number"
|
||
label = "Filename rule"
|
||
placeholder = "Text to add (optional)"
|
||
prefix = "Prefix"
|
||
suffix = "Suffix"
|
||
|
||
[portal.policies.wizard.output.outputAs]
|
||
label = "Output as"
|
||
newFile = "New file"
|
||
newVersion = "New version"
|
||
|
||
[portal.policies.wizard.output.runOn]
|
||
export = "Export"
|
||
helper = "When the policy fires: on upload, or before export."
|
||
label = "Run on"
|
||
upload = "Upload"
|
||
|
||
[portal.policies.wizard.settings]
|
||
heading = "Settings"
|
||
|
||
[portal.policies.wizard.sources]
|
||
heading = "Sources"
|
||
loading = "Loading sources…"
|
||
|
||
[portal.policies.wizard.tabs]
|
||
ariaLabel = "Setup steps"
|
||
settings = "Settings"
|
||
workflow = "Actions"
|
||
|
||
[portal.policies.wizard.title]
|
||
edit = "Edit {{category}} policy"
|
||
setUp = "Set up {{category}} policy"
|
||
|
||
[portal.policies.wizard.workflow]
|
||
description = "Choose what this policy does to every document it processes."
|
||
|
||
[portal.policySummary.action]
|
||
setUp = "Set up"
|
||
|
||
[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 = "Stirling 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 = "Stirling 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 Stirling 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 Stirling 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"
|
||
|
||
[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 Stirling 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 Stirling 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 Stirling 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 = "Stirling Cloud"
|
||
cloudSub = "Managed, fastest start"
|
||
continue = "Continue"
|
||
deployment = "Where should it deploy?"
|
||
eula = "I agree to the Stirling 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.settings.groups]
|
||
admin = "Admin"
|
||
|
||
[portal.settings.sections]
|
||
account-link = "Account link"
|
||
|
||
[portal.shell.sidebar]
|
||
appEditor = "Editor"
|
||
appProcessor = "Processor"
|
||
linkAccount = "Link Stirling account"
|
||
primaryNav = "Primary navigation"
|
||
|
||
[portal.shell.topbar]
|
||
closeNav = "Close navigation"
|
||
openNav = "Open navigation"
|
||
search = "Search"
|
||
|
||
[portal.sources]
|
||
subtitle = "Reusable input connections that feed documents into Stirling. 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."
|
||
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.kpi]
|
||
inUse = "In use"
|
||
total = "Connections"
|
||
unused = "Unused"
|
||
|
||
[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]
|
||
helperText = "Whether to leave the original file in place after it has been processed. If the original file is left in place, it will be re-processed next time the pipeline scans the source."
|
||
label = "After processing"
|
||
|
||
[portal.sources.networkFields.mode.options]
|
||
consume = "Delete the file"
|
||
snapshot = "Leave it in place"
|
||
|
||
[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 = "Whether to leave the original file in place after it has been processed. If the original file is left in place, it will be re-processed next time the pipeline scans the source."
|
||
label = "After processing"
|
||
|
||
[portal.sources.types.folder.fields.mode.options]
|
||
consume = "Delete the file"
|
||
snapshot = "Leave it in place"
|
||
|
||
[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]
|
||
helperText = "Whether to leave the original object in place after it has been processed. If the original object is left in place, it will be re-processed next time the pipeline scans the source."
|
||
label = "After processing"
|
||
|
||
[portal.sources.types.s3.fields.mode.options]
|
||
consume = "Delete the object"
|
||
snapshot = "Leave it in place"
|
||
|
||
[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.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-Stirling-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]
|
||
managePayment = "Manage Payment"
|
||
subtitle = "Consumption, invoices, and plan management for every PDF Stirling has billed, in one console."
|
||
title = "Usage & billing"
|
||
|
||
[portal.usage.error]
|
||
loadWallet = "Couldn't load wallet"
|
||
openStripePortal = "Couldn't open Stripe portal"
|
||
walletUnavailable = "Wallet unavailable: {{status}} {{statusText}}"
|
||
|
||
[portal.usage.sessionExpired]
|
||
action = "Sign in again"
|
||
body = "Your Stirling account session has expired. Sign in again to view billing — your instance stays linked."
|
||
title = "Session expired"
|
||
|
||
[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}}"
|
||
unlimited = "{{used}} · Unlimited"
|
||
|
||
[printFile]
|
||
title = "Print File"
|
||
|
||
[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.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]
|
||
editor = "Editor"
|
||
home = "Stirling"
|
||
invite = "Invite"
|
||
landmark = "Quick navigation"
|
||
noProcessorAccess = "Ask an admin for processor access"
|
||
notifications = "Notifications"
|
||
processor = "Processor"
|
||
reader = "Reader"
|
||
|
||
[read]
|
||
tags = "view,open,display,read,viewer,PDF viewer,PDF reader,open PDF,view PDF,display PDF,preview,browse"
|
||
|
||
[redact]
|
||
submit = "Redact"
|
||
tags = "Redact,Hide,black out,black,marker,hidden,auto redact,manual redact"
|
||
title = "Redact"
|
||
|
||
[redact.auto]
|
||
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."
|
||
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.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]
|
||
desc = "Remove password protection from your PDF document."
|
||
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"
|
||
stepTitle = "Remove Password"
|
||
|
||
[removePassword.results]
|
||
title = "Decrypted PDFs"
|
||
|
||
[removePassword.tooltip]
|
||
description = "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password."
|
||
|
||
[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.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"
|
||
|
||
[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"
|
||
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.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 Stirling-PDF server is unreachable"
|
||
toolNotAvailableLocally = "Your Stirling-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"
|
||
close = "Close"
|
||
title = "Settings"
|
||
|
||
[settings.ai]
|
||
documents = "Documents & RAG"
|
||
general = "General"
|
||
limits = "Limits & Performance"
|
||
models = "Models & Providers"
|
||
title = "AI"
|
||
|
||
[settings.configuration]
|
||
advanced = "Advanced"
|
||
database = "Database"
|
||
endpoints = "Endpoints"
|
||
features = "Features"
|
||
folderAccess = "Folder Access"
|
||
mcp = "MCP Server"
|
||
storageSharing = "File Storage & Sharing"
|
||
systemSettings = "System Settings"
|
||
title = "Configuration"
|
||
|
||
[settings.connection]
|
||
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 = "Stirling Cloud"
|
||
selfhosted = "Self-Hosted"
|
||
|
||
[settings.developer]
|
||
apiKeys = "API Keys"
|
||
title = "Developer"
|
||
|
||
[settings.general]
|
||
autoUnzip = "Auto-unzip API responses"
|
||
autoUnzipDescription = "Automatically extract files from ZIP responses"
|
||
autoUnzipFileLimit = "Auto-unzip file limit"
|
||
autoUnzipFileLimitDescription = "Maximum number of files to extract from ZIP"
|
||
autoUnzipFileLimitTooltip = "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs."
|
||
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 = "Stirling PDF is your default PDF editor"
|
||
defaultPdfEditorChecking = "Checking..."
|
||
defaultPdfEditorInactive = "Another application is set as default"
|
||
defaultPdfEditorRemind = "Remind me to set as default"
|
||
defaultPdfEditorRemindDescription = "Show a banner when Stirling PDF is not your default PDF application."
|
||
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.loginLanding]
|
||
description = "Choose which app opens when you sign in to Stirling Cloud."
|
||
editor = "Editor"
|
||
processor = "Processor"
|
||
title = "After signing in"
|
||
|
||
[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 Stirling-PDF handles updates on this machine. Contact them to change this."
|
||
updateBehaviorSaved = "Update behavior saved."
|
||
versionMismatch = "Warning: A mismatch has been detected between the client version and the AppConfig version. Using different versions can lead to compatibility issues, errors, and security risks. Please ensure that server and client are using the same version."
|
||
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]
|
||
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]
|
||
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"
|
||
plan = "Plan"
|
||
title = "Licensing & Analytics"
|
||
usageAnalytics = "Usage Analytics"
|
||
|
||
[settings.planBilling]
|
||
currentPlan = "Current Plan"
|
||
loading = "Loading billing information..."
|
||
notAvailable = "Plan & Billing is only available when connected to Stirling Cloud (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"
|
||
privacy = "Privacy"
|
||
title = "Policies & Privacy"
|
||
|
||
[settings.preferences]
|
||
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 = "Connections"
|
||
security = "Security"
|
||
telegram = "Telegram"
|
||
title = "Security & Authentication"
|
||
|
||
[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.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 Stirling"
|
||
|
||
[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}}"
|
||
emptyUrl = "Please enter a server URL"
|
||
invalidUrl = "Invalid URL format. Please enter a valid URL like https://your-server.com"
|
||
testFailed = "Connection test failed"
|
||
unreachable = "Could not connect to server"
|
||
|
||
[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 Stirling PDF server"
|
||
label = "Server URL"
|
||
|
||
[sharedSign]
|
||
backToSessions = "Back to sessions"
|
||
createdOn = "Created {{date}}"
|
||
disabledBody = "Collaborative signing isn't enabled on this server."
|
||
disabledTitle = "Not enabled"
|
||
due = "Due {{date}}"
|
||
filterDeclined = "Declined"
|
||
filterMine = "Mine"
|
||
filterOverdue = "Overdue"
|
||
filterSigned = "Signed"
|
||
fromOwner = "From {{owner}}"
|
||
newRequest = "Request signatures"
|
||
signedCount = "{{signed}}/{{total}} signed"
|
||
|
||
[sharedSign.empty]
|
||
active = "No pending sign requests or active sessions"
|
||
completed = "No completed sessions"
|
||
|
||
[sharedSign.tab]
|
||
active = "Active"
|
||
completed = "Completed"
|
||
|
||
[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"
|
||
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"
|
||
|
||
[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 = "<b>Visible</b>: Signature appears on PDF with custom appearance"
|
||
bullet2 = "<b>Invisible</b>: 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"
|
||
|
||
[signRequest]
|
||
declined = "Sign request declined"
|
||
fetchFailed = "Failed to load sign request"
|
||
signed = "Document signed successfully"
|
||
|
||
[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 Stirling PDF to get started"
|
||
title = "Create an account"
|
||
unexpectedError = "Unexpected error: {{message}}"
|
||
|
||
[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.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"
|
||
copyLink = "Copy share link"
|
||
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 Stirling 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 Stirling 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 Stirling"
|
||
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 = "Stirling-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?"
|
||
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..."
|
||
memberCount_one = "{{count}} member"
|
||
memberCount_other = "{{count}} members"
|
||
memberCount_zero = "no members"
|
||
memberRemoved = "Member removed successfully"
|
||
namePlaceholder = "Enter team name"
|
||
personal = "Personal"
|
||
removeError = "Failed to remove member"
|
||
renameCancel = "Cancel rename"
|
||
renameError = "Failed to rename team"
|
||
renameSubmit = "Save team name"
|
||
renameSuccess = "Team renamed successfully"
|
||
|
||
[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"
|
||
|
||
[toolPanel]
|
||
alpha = "Alpha"
|
||
backToAllTools = "Back to all tools"
|
||
collapse = "Collapse panel"
|
||
expand = "Expand panel"
|
||
goBack = "Go back"
|
||
pdfTools = "PDF Tools"
|
||
placeholder = "Choose a tool to get started"
|
||
premiumFeature = "Premium feature:"
|
||
toolsHeader = "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 Stirling-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 Stirling 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 Stirling 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"
|
||
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 Stirling PDF with 100 users, SSO, 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"
|
||
noData = "No data available"
|
||
noDataMessage = "No usage statistics are currently available."
|
||
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"
|
||
learnMore = "Learn more about roles and access."
|
||
locked = "Locked"
|
||
roleFor = "Role for {{name}}"
|
||
rowActions = "Actions for {{name}}"
|
||
showAll = "Show all {{count}}"
|
||
showLess = "Show less"
|
||
subtitle2 = "Your people, teams, and access levels."
|
||
suspended = "Suspended"
|
||
teamActions = "Team actions"
|
||
title = "Users"
|
||
you = "(you)"
|
||
|
||
[users.action]
|
||
cancelInvite = "Cancel invitation"
|
||
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"
|
||
|
||
[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.group]
|
||
addToTeam = "Add to team"
|
||
guestCount = "{{count}} guest"
|
||
guests = "Guests"
|
||
ledBy = "led by {{owner}}"
|
||
org = "Organization"
|
||
owners = "{{count}} owner"
|
||
team = "{{name}} team"
|
||
teamMeta = "{{count}} people"
|
||
|
||
[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 Stirling 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 8 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 Stirling workspace."
|
||
team = "Team"
|
||
title = "Invite people"
|
||
username = "Username"
|
||
usernameError = "Username must be at least 3 characters"
|
||
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"
|
||
emailError = "Enter a valid email address"
|
||
name = "Team name"
|
||
namePlaceholder = "e.g. Finance"
|
||
nameRequired = "Team name is required"
|
||
owner = "Team Owner"
|
||
ownerFailed = "Team created, but the owner couldn't be invited. Assign one from the roster."
|
||
ownerHelper = "Every team has a leader. They'll be invited as Team Owner, with the Processor on, and can add the rest. You can reassign later."
|
||
ownerPlaceholder = "owner@company.com"
|
||
subtitle = "Group people under a Team Owner who manages their access."
|
||
title = "New team"
|
||
|
||
[users.renameTeam]
|
||
apply = "Rename"
|
||
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]
|
||
guest = "Guest"
|
||
member = "Member"
|
||
orgOwner = "Org Owner"
|
||
teamOwner = "Team Owner"
|
||
|
||
[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 Stirling 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"
|
||
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"
|
||
copyText = "Copy"
|
||
disableColorFilter = "Disable Color Filter"
|
||
dualPageView = "Dual Page View"
|
||
enableDarkFilter = "Enable Dark Filter"
|
||
enableSepiaFilter = "Enable Sepia Filter"
|
||
firstPage = "First Page"
|
||
lastPage = "Last Page"
|
||
moreOptions = "More"
|
||
nextPage = "Next Page"
|
||
onlyPdfSupported = "This file format is not supported for preview."
|
||
pageNavigation = "Page navigation"
|
||
previousPage = "Previous Page"
|
||
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"
|
||
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"
|
||
|
||
[viewer.bookmarks]
|
||
addBookmark = "Add bookmark"
|
||
bookmarkTitle = "Bookmark title"
|
||
bookmarkTitleRequired = "Bookmark title is required"
|
||
closeSidebar = "Close bookmarks sidebar"
|
||
collapseAll = "Collapse all bookmarks"
|
||
empty = "No bookmarks in this document"
|
||
expandAll = "Expand all bookmarks"
|
||
searchPlaceholder = "Search bookmarks"
|
||
title = "Bookmarks"
|
||
|
||
[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?"
|
||
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.error]
|
||
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"
|
||
hideAll = "Hide all layers"
|
||
showAll = "Show all layers"
|
||
title = "Layers"
|
||
|
||
[viewer.link]
|
||
delete = "Delete link"
|
||
|
||
[viewer.nonPdf]
|
||
columnDefault = "Column {{index}}"
|
||
convertToPdf = "Convert to PDF"
|
||
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..."
|
||
renderMarkdown = "Render markdown"
|
||
sortedBy = "Sorted by: {{column}}"
|
||
textStats = "{{lines}} lines · {{size}}"
|
||
|
||
[viewer.redaction]
|
||
removeMark = "Remove this mark"
|
||
|
||
[viewer.search]
|
||
clear = "Clear search"
|
||
close = "Close search"
|
||
next = "Next result"
|
||
previous = "Previous result"
|
||
resultsOf = "of {{total}}"
|
||
|
||
[viewer.signature]
|
||
delete = "Delete signature"
|
||
|
||
[viewer.thumbnails]
|
||
closeSidebar = "Close thumbnails sidebar"
|
||
|
||
[viewPdf]
|
||
tags = "view,read,annotate,text,image,highlight,edit"
|
||
title = "View/Edit PDF"
|
||
|
||
[warning]
|
||
tooltipTitle = "Warning"
|
||
|
||
[watchedFolders]
|
||
alreadyInFolder = "Already in this folder"
|
||
defaultFolderWarning = "This is a default folder and will be recreated on next reload."
|
||
deleteConfirmBody = "This will remove the folder and its run history. Files already downloaded are not affected."
|
||
deleteConfirmTitle = "Delete folder?"
|
||
folderNotFound = "Folder not found"
|
||
newFolder = "New folder"
|
||
noFolders = "No watched folders yet"
|
||
sidebarTitle = "Watched Folders"
|
||
title = "Watched Folders"
|
||
|
||
[watchedFolders.actions]
|
||
back = "Back"
|
||
collapse = "Collapse"
|
||
dismiss = "Dismiss"
|
||
download = "Download"
|
||
downloadInput = "Download input"
|
||
downloadOutput = "Download output"
|
||
expand = "Expand"
|
||
retry = "Retry"
|
||
|
||
[watchedFolders.card]
|
||
delete = "Delete folder"
|
||
edit = "Edit folder"
|
||
|
||
[watchedFolders.home]
|
||
addAnother = "Add another Watched Folder"
|
||
addAnotherDesc = "Automatically process files with a new pipeline"
|
||
create = "Create your first Watched Folder"
|
||
deleteFolder = "Delete folder"
|
||
editFolder = "Edit folder"
|
||
empty = "No watched folders yet"
|
||
emptyDesc = "Set up a Watched Folder once. Drop PDFs in and they're automatically compressed, OCR'd, split, merged — whatever your pipeline does."
|
||
emptyTitle = "Automate your PDF workflows"
|
||
file = "file"
|
||
files = "files"
|
||
pause = "Pause"
|
||
resume = "Resume"
|
||
|
||
[watchedFolders.howItWorks]
|
||
step1Desc = "Drag PDFs onto any Watched Folder card — or send them from your file list"
|
||
step1Title = "Drop files"
|
||
step2Desc = "Your configured tools process each file automatically"
|
||
step2Title = "Pipeline runs"
|
||
step3Desc = "Download processed files from inside the folder"
|
||
step3Title = "Output ready"
|
||
title = "How Watched Folders work"
|
||
|
||
[watchedFolders.modal]
|
||
advanced = "Advanced"
|
||
automation = "Automation"
|
||
automationNameFallback = "Watched Folder automation"
|
||
automationRequired = "Add at least one configured step before saving."
|
||
autoNumber = "Auto-number"
|
||
autoNumberExample = "e.g. document.pdf → document (1).pdf"
|
||
autoScanHelp = "New PDF files in this folder are processed automatically every 10 seconds."
|
||
changeFolder = "Change"
|
||
chooseFolder = "Choose"
|
||
clearFolder = "Clear"
|
||
color = "Accent color"
|
||
createFolder = "Create Folder"
|
||
createTitle = "New Watched Folder"
|
||
editTitle = "Edit Watched Folder"
|
||
inputFolder = "Input folder"
|
||
inputFolderNotChosen = "No folder chosen — required for auto-scan"
|
||
inputSource = "Input source"
|
||
inputSourceBrowser = "Browser — drop files here"
|
||
inputSourceLocal = "Local folder (auto-scan)"
|
||
inputSourceLocalUnsupported = "Local folder (auto-scan) — Chrome/Edge only"
|
||
localOutputFolder = "Local output folder"
|
||
maxRetries = "Max retries"
|
||
name = "Folder name"
|
||
namePlaceholder = "My Watched Folder"
|
||
nameRequired = "Folder name is required"
|
||
nameTooLong = "Folder name must be 50 characters or less"
|
||
outputFolderNotSet = "Not set — outputs stay in app"
|
||
outputFolderUnsupported = "Not supported in this browser"
|
||
outputModeNewDesc = "Output is saved as a new separate file"
|
||
outputModeVersion = "Replace original?"
|
||
outputModeVersionDesc = "Output becomes a new version of the input file rather than a separate file"
|
||
outputName = "Output filename prefix"
|
||
outputNamePrefix = "Filename prefix"
|
||
outputNameSuffix = "Suffix"
|
||
positionPrefix = "Prefix"
|
||
positionSuffix = "Suffix"
|
||
replaceOriginal = "Replace original file"
|
||
retryDelay = "Delay (minutes)"
|
||
saveChanges = "Save Changes"
|
||
saveFailed = "Failed to save folder. Please try again."
|
||
sectionFolder = "Folder"
|
||
sectionSourceOutput = "Source & Output"
|
||
sectionSteps = "Steps"
|
||
|
||
[watchedFolders.status]
|
||
active = "Active"
|
||
done = "Done"
|
||
paused = "Paused"
|
||
processing = "Processing"
|
||
|
||
[watchedFolders.time]
|
||
daysAgo = "{{count}}d ago"
|
||
hoursAgo = "{{count}}h ago"
|
||
justNow = "just now"
|
||
minutesAgo = "{{count}}m ago"
|
||
|
||
[watchedFolders.workbench]
|
||
activity = "Activity"
|
||
addFiles = "Add files"
|
||
allTime = "All time"
|
||
cancel = "Cancel"
|
||
chartTooltipComplete = "{{count}} complete"
|
||
chartTooltipFailed = "{{count}} failed"
|
||
clearSelection = "Clear selection"
|
||
countProcessing = "{{count}} processing"
|
||
countQueued = "{{count}} queued"
|
||
countSelected = "{{count}} selected"
|
||
dataSaved = "Saved"
|
||
dayRunning = "day running"
|
||
daysRunning = "days running"
|
||
delete = "Delete"
|
||
deleteConfirmBody = "Remove notifications only clears the activity log. Delete outputs also removes the processed files from storage. Your original input files are never touched."
|
||
deleteOutputs = "Delete outputs"
|
||
directionIn = "in"
|
||
directionOut = "out"
|
||
dropToProcess = "Drop to process"
|
||
export = "Export"
|
||
exportSeparately = "Export separately"
|
||
exportZip = "Export zip"
|
||
failed = "Failed"
|
||
filesProcessedOverTime = "Files processed over time"
|
||
filterAll = "All"
|
||
filterPending = "Pending"
|
||
inputs = "Inputs"
|
||
inputSize = "Input size"
|
||
legendComplete = "Complete"
|
||
noActivity = "No activity yet — drop a PDF to start"
|
||
noActivityMatch = "No matching activity"
|
||
noInputFolder = "No input folder — edit to configure"
|
||
outputs = "Outputs"
|
||
pause = "Pause"
|
||
preview = "Preview"
|
||
previewInput = "Preview input"
|
||
previewLoadFailed = "Could not load file preview."
|
||
previewOutput = "Preview output"
|
||
queued = "Queued"
|
||
queuedWaiting = "Queued — waiting to run"
|
||
removeEntries = "Remove {{count}} entries"
|
||
removeEntry = "Remove entry"
|
||
removeNotificationsOnly = "Remove notifications only"
|
||
resume = "Resume"
|
||
retryAll = "Retry all"
|
||
retryIn = "retry in {{count}}m"
|
||
retryingSoon = "retrying…"
|
||
retryMixedConfirm = "Some selected files have already completed and will be skipped. Only failed files will be retried. Continue?"
|
||
running = "Running"
|
||
search = "Search…"
|
||
selectAll = "Select all {{count}}"
|
||
sortNameAsc = "A → Z"
|
||
sortNameDesc = "Z → A"
|
||
sortNewest = "Newest"
|
||
sortOldest = "Oldest"
|
||
watching = "Watching: {{name}}"
|
||
|
||
[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.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"
|
||
deleteSelected = "Delete Selected Pages"
|
||
deselectAll = "Deselect All"
|
||
downloadAll = "Download All"
|
||
exitRedaction = "Exit Redaction Mode"
|
||
exportAll = "Export PDF"
|
||
exportSelected = "Export Selected Pages"
|
||
formFill = "Form Editor"
|
||
hideToolbar = "Hide toolbar"
|
||
moreActions = "More actions"
|
||
multiTool = "Multi-Tool"
|
||
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"
|
||
saveChanges = "Save Changes"
|
||
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 = "Toggle Bookmarks"
|
||
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"
|
||
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"
|
||
sessionNotFound = "Session not found or access denied."
|
||
signDocument = "Sign Document"
|
||
statusDeclined = "Declined"
|
||
statusNotified = "Notified"
|
||
statusPending = "Pending"
|
||
statusSigned = "Signed"
|
||
statusViewed = "Viewed"
|
||
submitSignature = "Submit Signature"
|
||
|
||
[workspace]
|
||
title = "Workspace"
|
||
|
||
[workspace.people]
|
||
active = "Active"
|
||
activeSession = "Active session"
|
||
addMembers = "Add Members"
|
||
admin = "Admin"
|
||
confirmDelete = "Are you sure you want to delete this user? This action cannot be undone."
|
||
confirmUnlock = "Are you sure you want to unlock this user account?"
|
||
deleteUser = "Delete User"
|
||
deleteUserError = "Failed to delete user"
|
||
deleteUserSuccess = "User deleted successfully"
|
||
description = "Manage workspace members and their permissions"
|
||
disable = "Disable"
|
||
disabled = "Disabled"
|
||
editRole = "Edit Role"
|
||
enable = "Enable"
|
||
loading = "Loading people..."
|
||
locked = "locked"
|
||
lockedBadge = "Locked"
|
||
loginRequired = "Enable login mode first"
|
||
memberActions = "Member actions"
|
||
noMembersFound = "No members found"
|
||
role = "Role"
|
||
searchMembers = "Search members..."
|
||
team = "Team"
|
||
title = "People"
|
||
unlockAccount = "Unlock Account"
|
||
unlockUserError = "Failed to unlock user account"
|
||
unlockUserSuccess = "User account unlocked successfully"
|
||
user = "User"
|
||
userInfo = "User info"
|
||
|
||
[workspace.people.actions]
|
||
upgrade = "Upgrade"
|
||
|
||
[workspace.people.addMember]
|
||
authType = "Authentication Type"
|
||
error = "Failed to create user"
|
||
forceMFA = "Force MFA setup on next login"
|
||
forcePasswordChange = "Force password change on first login"
|
||
password = "Password"
|
||
passwordPlaceholder = "Enter password"
|
||
passwordRequired = "Password is required"
|
||
role = "Role"
|
||
submit = "Add Member"
|
||
success = "User created successfully"
|
||
team = "Team (Optional)"
|
||
teamPlaceholder = "Select a team"
|
||
username = "Username (Email)"
|
||
usernamePlaceholder = "user@example.com"
|
||
usernameRequired = "Username and password are required"
|
||
|
||
[workspace.people.authType]
|
||
oauth = "OAuth2"
|
||
password = "Password"
|
||
saml = "SAML2"
|
||
ssoDescription = "User will authenticate via SSO provider"
|
||
|
||
[workspace.people.changePassword]
|
||
action = "Change password"
|
||
confirmPassword = "Confirm password"
|
||
confirmPlaceholder = "Re-enter the new password"
|
||
copiedToClipboard = "Password copied to clipboard"
|
||
copyFailed = "Failed to copy password"
|
||
copyTooltip = "Copy to clipboard"
|
||
emailUnavailable = "This user's email is not a valid email address. Notifications are disabled."
|
||
error = "Failed to update password"
|
||
forcePasswordChange = "Force user to change password on next login"
|
||
generatedPreview = "Generated password:"
|
||
generateRandom = "Generate secure password"
|
||
includePassword = "Include the new password in the email"
|
||
newPassword = "New password"
|
||
notifyOnly = "An email will be sent without the password, letting the user know an admin changed it."
|
||
passwordMismatch = "Passwords do not match"
|
||
passwordRequired = "Please enter a new password"
|
||
placeholder = "Enter a new password"
|
||
sendEmail = "Email the user about this change"
|
||
smtpDisabled = "Email notifications require SMTP to be enabled in settings."
|
||
submit = "Update password"
|
||
subtitle = "Update the password for"
|
||
success = "Password updated successfully"
|
||
title = "Change password"
|
||
|
||
[workspace.people.editMember]
|
||
editing = "Editing: <0>{{username}}</0>"
|
||
error = "Failed to update user"
|
||
role = "Role"
|
||
submit = "Update User"
|
||
success = "User updated successfully"
|
||
team = "Team (Optional)"
|
||
teamPlaceholder = "Select a team"
|
||
title = "Edit User"
|
||
|
||
[workspace.people.emailInvite]
|
||
allFailed = "Failed to invite users"
|
||
emails = "Email Addresses"
|
||
emailsPlaceholder = "user1@example.com, user2@example.com"
|
||
emailsRequired = "At least one email address is required"
|
||
error = "Failed to send invites"
|
||
partialFailure = "Some invites failed"
|
||
submit = "Send Invites"
|
||
success = "user(s) invited successfully"
|
||
|
||
[workspace.people.inviteLink]
|
||
copied = "Link copied to clipboard"
|
||
email = "Email Address"
|
||
emailDescription = "Optional - leave blank for a general invite link that can be used by anyone"
|
||
emailPlaceholder = "user@example.com (optional)"
|
||
emailSent = "Invite link generated and sent via email"
|
||
error = "Failed to generate invite link"
|
||
expiryHours = "Expiry Hours"
|
||
generate = "Generate Link"
|
||
generated = "Invite Link Generated"
|
||
sendEmail = "Send invite link via email"
|
||
sendEmailDescription = "If enabled, the invite link will be sent to the specified email address"
|
||
submit = "Generate Invite Link"
|
||
|
||
[workspace.people.inviteMembers]
|
||
label = "Invite Members"
|
||
subtitle = "Type or paste in emails below, separated by commas. Your workspace will be billed by members."
|
||
|
||
[workspace.people.inviteMode]
|
||
email = "Email"
|
||
emailDisabled = "Email invites require SMTP configuration and mail.enableInvites=true in settings"
|
||
link = "Link"
|
||
username = "Username"
|
||
|
||
[workspace.people.license]
|
||
currentUsage = "Currently using {{current}} of {{max}} user licenses"
|
||
fromLicense = "from license"
|
||
grandfathered = "Grandfathered"
|
||
grandfatheredShort = "{{count}} grandfathered"
|
||
slotsAvailable_one = "{{count}} user slot available"
|
||
slotsAvailable_other = "{{count}} user slots available"
|
||
slotsAvailable_zero = "No slots available"
|
||
users_one = "user"
|
||
users_other = "users"
|
||
|
||
[workspace.people.mfa]
|
||
adminDisableError = "Failed to disable MFA for user"
|
||
adminDisableSuccess = "MFA disabled successfully for user"
|
||
disableByAdmin = "Disable MFA"
|
||
|
||
[workspace.people.roleDescriptions]
|
||
admin = "Can manage settings and invite users, with full administrative access."
|
||
currentRole = "Current assigned role."
|
||
user = "Can view and edit shared files, but cannot manage workspace settings or users."
|
||
|
||
[workspace.people.toggleEnabled]
|
||
error = "Failed to update user status"
|
||
success = "User status updated successfully"
|
||
|
||
[workspace.teams]
|
||
addMember = "Add Member"
|
||
backToTeams = "Back to Teams"
|
||
cannotAddToInternal = "Cannot add members to the Internal team"
|
||
cannotDeleteInternal = "Cannot delete the Internal team"
|
||
cannotRenameInternal = "Cannot rename the Internal team"
|
||
confirmDelete = "Are you sure you want to delete this team? This team must be empty to delete."
|
||
confirmRemove = "Remove user from this team?"
|
||
createNewTeam = "Create New Team"
|
||
deleteTeamLabel = "Delete Team"
|
||
description = "Manage teams and organize workspace members"
|
||
loadError = "Failed to load team details"
|
||
loading = "Loading teams..."
|
||
loadingDetails = "Loading team details..."
|
||
memberCount_one = "{{count}} member"
|
||
memberCount_other = "{{count}} members"
|
||
memberCount_zero = "no members"
|
||
noMembers = "No members in this team"
|
||
noTeamsFound = "No teams found"
|
||
removeMember = "Remove from team"
|
||
removeMemberError = "Failed to remove user from team"
|
||
removeMemberSuccess = "User removed from team"
|
||
renameTeamLabel = "Rename Team"
|
||
system = "System"
|
||
teamActions = "Team actions"
|
||
teamName = "Team Name"
|
||
teamNotFound = "Team not found"
|
||
title = "Teams"
|
||
totalMembers = "Total Members"
|
||
viewTeam = "View Team"
|
||
|
||
[workspace.teams.addMemberToTeam]
|
||
addingTo = "Adding to"
|
||
currentlyIn = "currently in"
|
||
error = "Failed to add member to team"
|
||
selectUser = "Select User"
|
||
selectUserPlaceholder = "Choose a user"
|
||
selectUserRequired = "Please select a user"
|
||
submit = "Add Member"
|
||
success = "Member added to team successfully"
|
||
title = "Add Member to Team"
|
||
userRequired = "Please select a user"
|
||
willBeMoved = "Note: This user will be moved from their current team to this team."
|
||
|
||
[workspace.teams.changeTeam]
|
||
changing = "Moving"
|
||
error = "Failed to change team"
|
||
label = "Change Team"
|
||
selectTeam = "Select Team"
|
||
selectTeamPlaceholder = "Choose a team"
|
||
selectTeamRequired = "Please select a team"
|
||
submit = "Change Team"
|
||
success = "Team changed successfully"
|
||
title = "Change Team"
|
||
|
||
[workspace.teams.createTeam]
|
||
error = "Failed to create team"
|
||
nameRequired = "Team name is required"
|
||
submit = "Create Team"
|
||
success = "Team created successfully"
|
||
teamName = "Team Name"
|
||
teamNamePlaceholder = "Enter team name"
|
||
title = "Create New Team"
|
||
|
||
[workspace.teams.deleteTeam]
|
||
error = "Failed to delete team. Make sure the team is empty."
|
||
success = "Team deleted successfully"
|
||
|
||
[workspace.teams.renameTeam]
|
||
error = "Failed to rename team"
|
||
nameRequired = "Team name is required"
|
||
newTeamName = "New Team Name"
|
||
newTeamNamePlaceholder = "Enter new team name"
|
||
renaming = "Renaming:"
|
||
submit = "Rename Team"
|
||
success = "Team renamed successfully"
|
||
title = "Rename Team"
|
||
|
||
[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"
|