Files
Stirling-PDF/frontend/public/locales/en-GB/translation.toml
T
1cd3e2846e feat(stamp): add dynamic variables and templates for stamp text customization (#5546)
# Description of Changes

This pull request improves the PDF stamping feature, particularly the
text stamping functionality, by introducing dynamic variables, improving
formatting flexibility, and refining positioning logic. The changes
include backend support for dynamic stamp variables (such as date, time,
filename, and metadata), improvements to text layout and positioning,
updates to the API and frontend for usability, and localization
enhancements for user guidance.

**Dynamic Stamp Variables and Text Processing:**

* Added support for dynamic variables in stamp text (e.g., `@date`,
`@time`, `@page_number`, `@filename`, `@uuid`, and metadata fields),
including custom date formats and escaping for literal `@` symbols. This
is handled by the new `processStampText` method in
`StampController.java`.
* Implemented validation and formatting for custom date variables,
ensuring only safe formats are accepted and providing user-friendly
error messages for invalid formats.

**Text Layout and Positioning Improvements:**

* Refactored text and image stamp positioning: now calculates line
heights, block heights, and widths for multi-line stamps, and adjusts
placement logic for more accurate alignment (top, center, bottom) and
margins.
* Updated the default font size for stamps to 40pt and improved font
size handling in both backend and frontend, including validation for
positive values

**API and Method Signature Updates:**

* Extended method signatures to include additional context (such as page
index and filename) for more powerful variable substitution in stamps
**Frontend and Localization Enhancements:**

* Added comprehensive help text, variable descriptions, and template
examples to the UI, making it easier for users to understand and use
dynamic stamp variables.
* Improved accessibility and clarity in the stamp formatting UI by
disabling controls appropriately and providing clearer descriptions.



<!--
Please provide a summary of the changes, including:

- What was changed
- Why the change was made
- Any challenges encountered

Closes #(issue_number)
-->

---

## Checklist

### General

- [ ] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [ ] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md)
(if applicable)
- [ ] I have performed a self-review of my own code
- [ ] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### Translations (if applicable)

- [ ] I ran
[`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md#6-testing)
for more details.

---------

Signed-off-by: Balázs Szücs <[email protected]>
Co-authored-by: ConnorYoh <[email protected]>
Co-authored-by: Anthony Stirling <[email protected]>
2026-01-29 21:16:14 +00:00

6856 lines
246 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
unsavedChanges = "You have unsaved changes to your PDF."
pendingRedactionsTitle = "Unapplied Redactions"
pendingRedactions = "You have unapplied redactions that will be lost."
areYouSure = "Are you sure you want to leave?"
unsavedChangesTitle = "Unsaved Changes"
keepWorking = "Keep Working"
discardChanges = "Discard & Leave"
discardRedactions = "Discard & Leave"
applyAndContinue = "Save & Leave"
exportAndContinue = "Export & Continue"
cancel = "Cancel"
pageSelectionPrompt = "Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1)"
startingNumberTooltip = "The first number to display. Subsequent pages will increment from this number."
marginTooltip = "Distance between the page number and the edge of the page."
fontSizeTooltip = "Size of the page number text in points. Larger numbers create bigger text."
fontTypeTooltip = "Font family for the page numbers. Choose based on your document style."
customTextTooltip = "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc."
pdfPrompt = "Select PDF(s)"
multiPdfPrompt = "Select PDFs (2+)"
multiPdfDropPrompt = "Select (or drag & drop) all PDFs you require"
imgPrompt = "Select Image(s)"
genericSubmit = "Submit"
uploadLimit = "Maximum file size:"
uploadLimitExceededSingular = "is too large. Maximum allowed size is"
uploadLimitExceededPlural = "are too large. Maximum allowed size is"
processTimeWarning = "Warning: This process can take up to a minute depending on file-size"
pageOrderPrompt = "Custom Page Order (Enter a comma-separated list of page numbers or Functions like 2n+1) :"
goToPage = "Go"
true = "True"
false = "False"
unknown = "Unknown"
save = "Save"
saveToBrowser = "Save to Browser"
download = "Download"
downloadUnavailable = "Download unavailable for this item"
saveUnavailable = "Save unavailable for this item"
pin = "Pin File (keep active after tool run)"
unpin = "Unpin File (replace after tool run)"
undoOperationTooltip = "Click to undo the last operation and restore the original files"
undo = "Undo"
back = "Back"
nothingToUndo = "Nothing to undo"
moreOptions = "More Options"
editYourNewFiles = "Edit your new file(s)"
close = "Close"
openInViewer = "Open in Viewer"
confirmClose = "Confirm Close"
confirmCloseMessage = "Are you sure you want to close this file?"
confirmCloseCancel = "Cancel"
confirmCloseConfirm = "Close File"
fileSelected = "Selected: {{filename}}"
chooseFile = "Choose File"
filesSelected = "{{count}} files selected"
noFavourites = "No favourites added"
downloadComplete = "Download Complete"
bored = "Bored Waiting?"
alphabet = "Alphabet"
downloadPdf = "Download PDF"
text = "Text"
font = "Font"
selectFillter = "-- Select --"
pageNum = "Page Number"
edit = "Edit"
delete = "Delete"
never = "Never"
username = "Username"
password = "Password"
welcome = "Welcome"
property = "Property"
black = "Black"
white = "White"
red = "Red"
green = "Green"
blue = "Blue"
custom = "Custom..."
comingSoon = "Coming soon"
WorkInProgess = "Work in progress, May not work or be buggy, Please report any problems!"
poweredBy = "Powered by"
yes = "Yes"
no = "No"
changedCredsMessage = "Credentials changed!"
notAuthenticatedMessage = "User not authenticated."
userNotFoundMessage = "User not found."
incorrectPasswordMessage = "Current password is incorrect."
usernameExistsMessage = "New Username already exists."
invalidUsernameMessage = "Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address."
invalidPasswordMessage = "The password must not be empty and must not have spaces at the beginning or end."
confirmPasswordErrorMessage = "New Password and Confirm New Password must match."
deleteCurrentUserMessage = "Cannot delete currently logged in user."
deleteUsernameExistsMessage = "The username does not exist and cannot be deleted."
downgradeCurrentUserMessage = "Cannot downgrade current user's role"
disabledCurrentUserMessage = "The current user cannot be disabled"
downgradeCurrentUserLongMessage = "Cannot downgrade current user's role. Hence, current user will not be shown."
userAlreadyExistsOAuthMessage = "The user already exists as an OAuth2 user."
userAlreadyExistsWebMessage = "The user already exists as an web user."
oops = "Oops!"
help = "Help"
goHomepage = "Go to Homepage"
joinDiscord = "Join our Discord server"
seeDockerHub = "See Docker Hub"
visitGithub = "Visit Github Repository"
donate = "Donate"
color = "Colour"
sponsor = "Sponsor"
info = "Info"
pro = "Pro"
page = "Page"
pages = "Pages"
loading = "Loading..."
review = "Review"
addToDoc = "Add to Document"
reset = "Reset"
apply = "Apply"
noFileSelected = "No file selected. Please upload one."
termsAndConditions = "Terms & Conditions"
logOut = "Log out"
customPosition = "Custom Position"
details = "Details"
invalidUndoData = "Cannot undo: invalid operation data"
noFilesToUndo = "Cannot undo: no files were processed in the last operation"
noOperationToUndo = "No operation to undo"
noValidFiles = "No valid files to process"
operationCancelled = "Operation cancelled"
quickPosition = "Quick Position"
size = "Size"
submit = "Submit"
success = "Success"
undoDataMismatch = "Cannot undo: operation data is corrupted"
undoFailed = "Failed to undo operation"
undoQuotaError = "Cannot undo: insufficient storage space"
undoStorageError = "Undo completed but some files could not be saved to storage"
undoSuccess = "Operation undone successfully"
unsupported = "Unsupported"
[toolPanel]
placeholder = "Choose a tool to get started"
alpha = "Alpha"
premiumFeature = "Premium feature:"
comingSoon = "Coming soon:"
[toolPanel.modePrompt]
title = "Choose how you browse tools"
description = "Preview both layouts and decide how you want to explore Stirling PDF tools."
sidebarTitle = "Sidebar mode"
sidebarDescription = "Keep tools alongside your workspace for quick switching."
recommended = "Recommended"
chooseSidebar = "Use sidebar mode"
fullscreenTitle = "Fullscreen mode - (legacy)"
fullscreenDescription = "Browse every tool in a catalogue that covers the workspace until you pick one."
chooseFullscreen = "Use fullscreen mode"
dismiss = "Maybe later"
[toolPanel.fullscreen]
showDetails = "Show Details"
comingSoon = "Coming soon:"
favorite = "Add to favourites"
favorites = "Favourites"
unavailable = "Disabled by server administrator:"
unavailableDependency = "Unavailable - required tool missing on server:"
heading = "All tools (fullscreen view)"
noResults = "Try adjusting your search or toggle descriptions to find what you need."
recommended = "Recommended"
unfavorite = "Remove from favourites"
[toolPanel.toggle]
fullscreen = "Switch to fullscreen mode"
sidebar = "Switch to sidebar mode"
[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."
[zipWarning]
title = "Large ZIP File"
message = "This ZIP contains {{count}} files. Extract anyway?"
cancel = "Cancel"
confirm = "Extract"
[defaultApp]
title = "Set as Default PDF App"
message = "Would you like to set Stirling PDF as your default PDF editor?"
description = "You can change this later in your system settings."
notNow = "Not Now"
setDefault = "Set Default"
dismiss = "Dismiss"
[defaultApp.prompt]
title = "Set as Default PDF Editor"
message = "Make Stirling PDF your default application for opening PDF files."
[defaultApp.success]
title = "Default App Set"
message = "Stirling PDF is now your default PDF editor"
[defaultApp.settingsOpened]
title = "Settings Opened"
message = "In Windows Settings, search for 'PDF' and select Stirling PDF as your default app"
[defaultApp.error]
title = "Error"
message = "Failed to set default PDF handler"
[language]
direction = "ltr"
[addPageNumbers]
fontSize = "Font Size"
fontName = "Font Name"
title = "Add Page Numbers"
header = "Add Page Numbers"
customTextDesc = "Custom Text"
numberPagesDesc = "e.g., 1,3,5-8 or leave blank for all pages"
customNumberDesc = "e.g., \"Page {n}\" or leave blank for just numbers"
submit = "Add Page Numbers"
configuration = "Configuration"
customize = "Customize Appearance"
pagesAndStarting = "Pages & Starting Number"
positionAndPages = "Position & Pages"
preview = "Position Selection"
previewDisclaimer = "Preview is approximate. Final output may vary due to PDF font metrics."
[addPageNumbers.selectText]
1 = "Select PDF file:"
2 = "Margin Size"
3 = "Position Selection"
4 = "Starting Number"
5 = "Pages to Number"
6 = "Custom Text Format"
[addPageNumbers.error]
failed = "Add page numbers operation failed"
[addPageNumbers.results]
title = "Page Number Results"
[app]
description = "The Free Adobe Acrobat alternative (10M+ Downloads)"
[files]
title = "Files"
upload = "Upload"
uploadFiles = "Upload Files"
addFiles = "Add files"
selectFromWorkbench = "Select files from the workbench or "
selectMultipleFromWorkbench = "Select at least {{count}} files from the workbench or "
created = "Created"
size = "File Size"
[sizes]
small = "Small"
medium = "Medium"
large = "Large"
x-large = "X-Large"
[error]
pdfPassword = "The PDF Document is passworded and either the password was not provided or was incorrect"
encryptedPdfMustRemovePassword = "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A."
incorrectPasswordProvided = "The PDF password is incorrect or not provided."
_value = "Error"
dismissAllErrors = "Dismiss All Errors"
sorry = "Sorry for the issue!"
needHelp = "Need help / Found an issue?"
contactTip = "If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord:"
github = "Submit a ticket on GitHub"
showStack = "Show Stack Trace"
copyStack = "Copy Stack Trace"
githubSubmit = "GitHub - Submit a ticket"
discordSubmit = "Discord - Submit Support post"
[error.404]
head = "404 - Page Not Found | Oops, we tripped in the code!"
1 = "We can't seem to find the page you're looking for."
2 = "Something went wrong"
[warning]
tooltipTitle = "Warning"
[legal]
privacy = "Privacy Policy"
iAgreeToThe = "I agree to all of the"
terms = "Terms and Conditions"
accessibility = "Accessibility"
cookie = "Cookie Policy"
impressum = "Impressum"
showCookieBanner = "Cookie Preferences"
[pipeline]
header = "Pipeline Menu (Beta)"
uploadButton = "Upload Custom"
configureButton = "Configure"
defaultOption = "Custom"
submitButton = "Submit"
help = "Pipeline Help"
scanHelp = "Folder Scanning Help"
deletePrompt = "Are you sure you want to delete pipeline"
tags = "automate,sequence,scripted,batch-process"
title = "Pipeline"
[pipelineOptions]
header = "Pipeline Configuration"
pipelineNameLabel = "Pipeline Name"
saveSettings = "Save Operation Settings"
pipelineNamePrompt = "Enter pipeline name here"
selectOperation = "Select Operation"
addOperationButton = "Add operation"
pipelineHeader = "Pipeline:"
saveButton = "Download"
saveForFolderScanning = "Save for Folder Scanning"
validateButton = "Validate"
[enterpriseEdition]
button = "Upgrade to Pro"
warning = "This feature is only available to Pro users."
yamlAdvert = "Stirling PDF Pro supports YAML configuration files and other SSO features."
ssoAdvert = "Looking for more user management features? Check out Stirling PDF Pro"
[analytics]
title = "Do you want to help make Stirling PDF better?"
paragraph1 = "Stirling PDF has opt-in analytics to help us improve the product. We do not track any personal information or file contents."
paragraph2 = "Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better."
learnMore = "Learn more about our analytics"
enable = "Enable analytics"
disable = "Disable analytics"
settings = "You can change the settings for analytics in the config/settings.yml file"
privacyAssurance = "We do not track any personal information or the contents of your files."
[navbar]
favorite = "Favorites"
recent = "New and recently updated"
darkmode = "Dark Mode"
language = "Languages"
settings = "Settings"
allTools = "Tools"
multiTool = "Multi Tool"
search = "Search"
[navbar.sections]
organize = "Organize"
convertTo = "Convert to PDF"
convertFrom = "Convert from PDF"
security = "Sign & Security"
advance = "Advanced"
edit = "View & Edit"
popular = "Popular"
[footer]
discord = "Discord"
issues = "GitHub"
[settings.preferences]
title = "Preferences"
[settings.workspace]
title = "Workspace"
people = "People"
teams = "Teams"
[settings.configuration]
title = "Configuration"
systemSettings = "System Settings"
features = "Features"
endpoints = "Endpoints"
database = "Database"
advanced = "Advanced"
[settings.securityAuth]
title = "Security & Authentication"
security = "Security"
connections = "Connections"
telegram = "Telegram"
[settings.licensingAnalytics]
title = "Licensing & Analytics"
plan = "Plan"
audit = "Audit"
usageAnalytics = "Usage Analytics"
[settings.policiesPrivacy]
title = "Policies & Privacy"
legal = "Legal"
privacy = "Privacy"
[settings.developer]
title = "Developer"
apiKeys = "API Keys"
[settings.tooltips]
enableLoginFirst = "Enable login mode first"
requiresEnterprise = "Requires Enterprise license"
[settings.connection]
title = "Connection Mode"
server = "Server"
user = "Logged in as"
logout = "Log Out"
[settings.connection.mode]
saas = "Stirling Cloud"
selfhosted = "Self-Hosted"
[settings.general]
title = "General"
description = "Configure general application preferences."
user = "User"
logout = "Log out"
defaultToolPickerMode = "Default tool picker mode"
defaultToolPickerModeDescription = "Choose whether the tool picker opens in fullscreen or sidebar by default"
autoUnzipTooltip = "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows."
autoUnzip = "Auto-unzip API responses"
autoUnzipDescription = "Automatically extract files from ZIP responses"
autoUnzipFileLimitTooltip = "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs."
autoUnzipFileLimit = "Auto-unzip file limit"
autoUnzipFileLimitDescription = "Maximum number of files to extract from ZIP"
defaultPdfEditor = "Default PDF editor"
defaultPdfEditorActive = "Stirling PDF is your default PDF editor"
defaultPdfEditorInactive = "Another application is set as default"
defaultPdfEditorChecking = "Checking..."
defaultPdfEditorSet = "Already Default"
setAsDefault = "Set as Default"
hideUnavailableTools = "Hide unavailable tools"
hideUnavailableToolsDescription = "Remove tools that have been disabled by your server instead of showing them greyed out."
hideUnavailableConversions = "Hide unavailable conversions"
hideUnavailableConversionsDescription = "Remove disabled conversion options in the Convert tool instead of showing them greyed out."
[settings.general.enableFeatures]
dismiss = "Dismiss"
title = "For System Administrators"
intro = "Enable user authentication, team management, and workspace features for your organisation."
action = "Configure"
and = "and"
benefit = "Enables user roles, team collaboration, admin controls, and enterprise features."
learnMore = "Learn more in documentation"
[settings.general.mode]
sidebar = "Sidebar"
fullscreen = "Fullscreen"
[settings.general.updates]
title = "Software Updates"
description = "Check for updates and view version information"
currentVersion = "Current Version"
latestVersion = "Latest Version"
checkForUpdates = "Check for Updates"
viewDetails = "View Details"
serverNeedsUpdate = "Server needs to be updated by administrator"
[settings.general.versionInfo]
title = "Version Information"
description = "Desktop and server version details"
desktop = "Desktop Version"
server = "Server Version"
[settings.security]
title = "Security"
description = "Update your password to keep your account secure."
[settings.security.password]
subtitle = "Change your password. You will be logged out after updating."
required = "All fields are required."
mismatch = "New passwords do not match."
error = "Unable to update password. Please verify your current password and try again."
success = "Password updated successfully. Please sign in again."
ssoDisabled = "Password changes are managed by your identity provider."
current = "Current password"
currentPlaceholder = "Enter your current password"
new = "New password"
newPlaceholder = "Enter a new password"
confirm = "Confirm new password"
confirmPlaceholder = "Re-enter your new password"
update = "Update password"
[settings.hotkeys]
title = "Keyboard Shortcuts"
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}}."
searchPlaceholder = "Search tools..."
none = "Not assigned"
customBadge = "Custom"
defaultLabel = "Default: {{shortcut}}"
capturing = "Press keys… (Esc to cancel)"
change = "Change shortcut"
reset = "Reset"
shortcut = "Shortcut"
noShortcut = "No shortcut set"
[settings.hotkeys.errorModifier]
mac = "Include ⌘ (Command), ⌥ (Option), or another modifier in your shortcut."
windows = "Include Ctrl, Alt, or another modifier in your shortcut."
[update]
modalTitle = "Update Available"
current = "Current Version"
latest = "Latest Version"
latestStable = "Latest Stable"
priorityLabel = "Priority"
recommendedAction = "Recommended Action"
breakingChangesDetected = "Breaking Changes Detected"
breakingChangesMessage = "Some versions contain breaking changes. Please review the migration guides below before updating."
migrationGuides = "Migration Guides"
viewGuide = "View Guide"
loadingDetailedInfo = "Loading detailed information..."
close = "Close"
viewAllReleases = "View All Releases"
downloadLatest = "Download Latest"
availableUpdates = "Available Updates"
unableToLoadDetails = "Unable to load detailed information."
version = "Version"
urgentUpdateAvailable = "Urgent Update"
updateAvailable = "Update Available"
releaseNotes = "Release Notes"
breakingChanges = "Breaking Changes"
breakingChangesDefault = "This version contains breaking changes."
migrationGuide = "Migration Guide"
[update.priority]
urgent = "Urgent"
normal = "Normal"
minor = "Minor"
low = "Low"
[changeCreds]
title = "Change Credentials"
header = "Update Your Account Details"
changePassword = "You are using default login credentials. Please enter a new password"
ssoManaged = "Your account is managed by your identity provider."
newUsername = "New Username"
oldPassword = "Current Password"
newPassword = "New Password"
confirmNewPassword = "Confirm New Password"
submit = "Submit Changes"
credsUpdated = "Account updated"
description = "Changes saved. Please log in again."
error = "Unable to update username. Please verify your password and try again."
changeUsername = "Update your username. You will be logged out after updating."
[account]
title = "Account Settings"
accountSettings = "Account Settings"
adminSettings = "Admin Settings - View and Add Users"
userControlSettings = "User Control Settings"
changeUsername = "Change Username"
changeUsernameDescription = "Update your username. You will be logged out after updating."
newUsernamePlaceholder = "Enter your new username"
newUsername = "New Username"
password = "Confirmation Password"
oldPassword = "Old password"
newPassword = "New Password"
changePassword = "Change Password"
confirmNewPassword = "Confirm New Password"
signOut = "Sign Out"
yourApiKey = "Your API Key"
syncTitle = "Sync browser settings with Account"
settingsCompare = "Settings Comparison:"
property = "Property"
webBrowserSettings = "Web Browser Setting"
syncToBrowser = "Sync Account -> Browser"
syncToAccount = "Sync Account <- Browser"
[account.mfa]
title = "Two-factor authentication"
setupFailed = "Unable to start two-factor setup. Please try again."
codeRequired = "Enter the authentication code to continue."
enabled = "Two-factor authentication enabled."
enableFailed = "Unable to enable two-factor authentication. Check the code and try again."
disabled = "Two-factor authentication disabled."
disableFailed = "Unable to disable two-factor authentication. Check the code and try again."
description = "Add an extra layer of security to your account."
enableButton = "Enable two-factor authentication"
disableButton = "Disable two-factor authentication"
setupTitle = "Set up two-factor authentication"
setupDescription = "Scan the QR code with your authenticator app, then enter the 6-digit code to confirm."
manualKey = "Manual setup key"
secretWarning = "Keep this key private. Anyone with access can generate valid authentication codes."
codePlaceholder = "Enter 6-digit code"
confirmEnable = "Enable"
disableTitle = "Disable two-factor authentication"
disableDescription = "Enter a valid authentication code to disable two-factor authentication."
codeLabel = "Authentication code"
confirmDisable = "Disable"
ssoDescription = "Two-factor authentication is managed by your identity provider for single sign-on accounts."
ssoManaged = "Configure MFA through your identity provider."
[adminUserSettings]
title = "User Control Settings"
header = "Admin User Control Settings"
admin = "Admin"
user = "User"
addUser = "Add New User"
deleteUser = "Delete User"
confirmDeleteUser = "Should the user be deleted?"
confirmChangeUserStatus = "Should the user be disabled/enabled?"
usernameInfo = "Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address."
roles = "Roles"
role = "Role"
actions = "Actions"
apiUser = "Limited API User"
extraApiUser = "Additional Limited API User"
webOnlyUser = "Web Only User"
demoUser = "Demo User (No custom settings)"
internalApiUser = "Internal API User"
forceChange = "Force user to change password on login"
submit = "Save User"
changeUserRole = "Change User's Role"
authenticated = "Authenticated"
editOwnProfil = "Edit own profile"
enabledUser = "enabled user"
disabledUser = "disabled user"
activeUsers = "Active Users:"
disabledUsers = "Disabled Users:"
totalUsers = "Total Users:"
lastRequest = "Last Request"
usage = "View Usage"
[endpointStatistics]
title = "Endpoint Statistics"
header = "Endpoint Statistics"
top10 = "Top 10"
top20 = "Top 20"
all = "All"
refresh = "Refresh"
dataTypeLabel = "Data Type:"
dataTypeAll = "All"
dataTypeApi = "API"
dataTypeUi = "UI"
totalEndpoints = "Total Endpoints"
totalVisits = "Total Visits"
showing = "Showing"
selectedVisits = "Selected Visits"
endpoint = "Endpoint"
visits = "Visits"
percentage = "Percentage"
loading = "Loading..."
failedToLoad = "Failed to load endpoint data. Please try refreshing."
home = "Home"
login = "Login"
top = "Top"
numberOfVisits = "Number of Visits"
visitsTooltip = "Visits: {0} ({1}% of total)"
retry = "Retry"
[database]
title = "Database Import/Export"
header = "Database Import/Export"
fileName = "File Name"
creationDate = "Creation Date"
fileSize = "File Size"
deleteBackupFile = "Delete Backup File"
importBackupFile = "Import Backup File"
createBackupFile = "Create Backup File"
downloadBackupFile = "Download Backup File"
info_1 = "When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application."
info_2 = "The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention."
submit = "Import Backup"
importIntoDatabaseSuccessed = "Import into database successed"
backupCreated = "Database backup successful"
fileNotFound = "File not found"
fileNullOrEmpty = "File must not be null or empty"
failedImportFile = "Failed to import file"
notSupported = "This function is not available for your database connection."
[session]
expired = "Your session has expired. Please refresh the page and try again."
refreshPage = "Refresh Page"
[home]
desc = "Your locally hosted one-stop-shop for all your PDF needs."
searchBar = "Search for features..."
setFavorites = "Set Favourites"
hideFavorites = "Hide Favourites"
showFavorites = "Show Favourites"
legacyHomepage = "Old homepage"
newHomePage = "Try our new homepage!"
alphabetical = "Alphabetical"
globalPopularity = "Global Popularity"
sortBy = "Sort by:"
[home.viewPdf]
title = "View/Edit PDF"
desc = "View, annotate, draw, add text or images"
[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]
tags = "multiple,tools,multi-tool,all-in-one,swiss army,page organizer,page editor,edit pages,manage pages,organize,reorganize"
title = "PDF Multi Tool"
desc = "Merge, Rotate, Rearrange, Split, and Remove pages"
[home.merge]
tags = "combine,join,unite,merge,merge PDFs,combine PDFs,join PDFs,concatenate,append,stitch,combine files,join files,merge documents"
title = "Merge"
desc = "Easily merge multiple PDFs into one."
[home.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"
desc = "Split PDFs into multiple documents"
[home.rotate]
tags = "turn,flip,orient,rotate,orientation,landscape,portrait,90 degrees,180 degrees,clockwise,anticlockwise,counter-clockwise,fix orientation"
title = "Rotate"
desc = "Easily rotate your PDFs."
[home.convert]
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"
desc = "Convert files between different formats"
[home.pdfOrganiser]
tags = "organize,rearrange,reorder,organise,arrange pages,sort,move pages,delete pages,remove pages,page management,page organizer,page organiser,resequence"
title = "Organise"
desc = "Remove/Rearrange pages in any order"
[home.addImage]
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"
desc = "Adds a image onto a set location on the PDF"
[home.addAttachments]
tags = "embed,attach,include,attachments,attach files,embed files,include files,add files,file attachment,associated files,supplementary files"
title = "Add Attachments"
desc = "Add or remove embedded files (attachments) to/from a PDF"
[home.watermark]
tags = "stamp,mark,overlay,watermark,branding,logo,confidential,draft,copyright,trademark,text overlay,image overlay,background text"
title = "Add Watermark"
desc = "Add a custom watermark to your PDF document."
[home.removePassword]
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"
desc = "Remove password protection from your PDF document."
[home.compress]
tags = "shrink,reduce,optimize,compress,smaller,downsize,file size,reduce size,minimize,make smaller,decrease size,optimize size"
title = "Compress"
desc = "Compress PDFs to reduce their file size."
[home.unlockPDFForms]
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"
desc = "Remove read-only property of form fields in a PDF document."
[home.changeMetadata]
tags = "edit,modify,update,metadata,properties,document properties,author,title,subject,keywords,creator,producer,info,document info,file properties"
title = "Change Metadata"
desc = "Change/Remove/Add metadata from a PDF document"
[home.ocr]
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"
desc = "Cleanup scans and detects text from images within a PDF and re-adds it as text."
[home.extractImages]
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"
desc = "Extracts all images from a PDF and saves them to zip"
[home.scannerImageSplit]
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"
desc = "Detect and split scanned photos into separate pages"
[home.sign]
tags = "signature,autograph,e-sign,electronic signature,digital signature,sign document,approval,signoff,authorize,endorse,ink signature,handwriting"
title = "Sign"
desc = "Adds signature to PDF by drawing, text or image"
[home.annotate]
tags = "annotate,highlight,draw,markup,comment,notes,review,redline,feedback,markup tools,sticky notes,shapes,arrows,text box,freehand"
title = "Annotate"
desc = "Highlight, draw, add notes and shapes in the viewer"
[home.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"
desc = "Remove all interactive elements and forms from a PDF"
[home.certSign]
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"
desc = "Signs a PDF with a Certificate/Key (PEM/P12)"
[home.repair]
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"
desc = "Tries to repair a corrupt/broken PDF"
[home.removeBlanks]
tags = "delete,clean,empty,remove blank,delete blank pages,empty pages,white pages,remove empty,clean up,cleanup blank"
title = "Remove Blank pages"
desc = "Detects and removes blank pages from a document"
[home.removeAnnotations]
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"
desc = "Removes all comments/annotations from a PDF"
[home.compare]
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"
desc = "Compares and shows the differences between 2 PDF Documents"
[home.removeCertSign]
tags = "remove,delete,unlock,remove certificate,remove signature,delete signature,unsigned,remove digital signature,strip signature,remove cert,unsign"
title = "Remove Certificate Sign"
desc = "Remove certificate signature from PDF"
[home.pageLayout]
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"
desc = "Merge multiple pages of a PDF document into a single page"
[home.bookletImposition]
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"
desc = "Create booklets with proper page ordering and multi-page layout for printing and binding"
[home.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 size/scale"
desc = "Change the size/scale of a page and/or its contents."
[home.addPageNumbers]
tags = "number,pagination,count,add page numbers,page numbering,page numbers,footer,header,number pages,sequential,pagination tool"
title = "Add Page Numbers"
desc = "Add Page numbers throughout a document in a set location"
[home.autoRename]
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"
desc = "Auto renames a PDF file based on its detected header"
[home.adjustContrast]
tags = "contrast,brightness,saturation,adjust colors,color correction,enhance,lighten,darken,improve quality,color balance,hue,vibrance"
title = "Adjust Colours/Contrast"
desc = "Adjust Colors/Contrast, Saturation and Brightness of a PDF"
[home.crop]
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"
desc = "Crop a PDF to reduce its size (maintains text!)"
[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"
desc = "Auto Split Scanned PDF with physical scanned page splitter QR Code"
[home.sanitize]
tags = "clean,purge,remove,sanitize,sanitise,remove scripts,remove javascript,remove metadata,strip metadata,security,clean document,remove hidden data,privacy"
title = "Sanitise"
desc = "Remove potentially harmful elements from PDF files"
[home.getPdfInfo]
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"
desc = "Grabs any and all information possible on PDFs"
[home.pdfToSinglePage]
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"
desc = "Merges all PDF pages into one large single page"
[home.showJS]
tags = "javascript,code,script,show javascript,show JS,find javascript,detect javascript,view javascript,embedded scripts,malware,security,inspect,debug"
title = "Show Javascript"
desc = "Searches and displays any JS injected into a PDF"
[home.redact]
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"
desc = "Redacts (blacks out) a PDF based on selected text, drawn shapes and/or selected page(s)"
[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"
desc = "Divide each page of a PDF into smaller horizontal and vertical sections"
[home.addStamp]
tags = "stamp,mark,seal,approved,rejected,confidential,stamp tool,rubber stamp,date stamp,approval stamp,received,void,copy,original"
title = "Add Stamp to PDF"
desc = "Add text or add image stamps at set locations"
[home.removeImage]
tags = "remove,delete,clean,remove image,delete image,strip images,remove pictures,delete photos,clean images,reduce size,remove graphics"
title = "Remove image"
desc = "Remove image from PDF to reduce file size"
[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"
desc = "Split a PDF into multiple files based on its chapter structure."
[home.validateSignature]
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"
desc = "Verify digital signatures and certificates in PDF documents"
[home.swagger]
tags = "API,documentation,test,swagger,API docs,REST API,endpoints,developer,API reference,API testing,OpenAPI,integration,developer docs"
title = "API Documentation"
desc = "View API documentation and test endpoints"
[home.scannerEffect]
tags = "scan,simulate,create,fake scan,look scanned,scanner effect,make look scanned,photocopy effect,simulate scanner,realistic scan"
title = "Scanner Effect"
desc = "Create a PDF that looks like it was scanned"
[home.editTableOfContents]
tags = "bookmarks,contents,edit,table of contents,TOC,outline,navigation,chapters,sections,add bookmarks,edit bookmarks,PDF outline"
title = "Edit Table of Contents"
desc = "Add or edit bookmarks and table of contents in PDF documents"
[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"
desc = "Import, export, or delete digital certificate files used for signing PDFs."
[home.read]
tags = "view,open,display,read,viewer,PDF viewer,PDF reader,open PDF,view PDF,display PDF,preview,browse"
title = "Read"
desc = "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration."
[home.reorganizePages]
tags = "rearrange,reorder,organize,reorganize,move pages,page order,sort pages,arrange pages,shuffle,resequence"
title = "Reorganize Pages"
desc = "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control."
[home.extractPages]
tags = "pull,select,copy,extract,extract pages,get pages,pull out,save pages,export pages,copy pages,select pages,specific pages"
title = "Extract Pages"
desc = "Extract specific pages from a PDF document"
[home.removePages]
tags = "delete,extract,exclude,remove pages,delete pages,remove page,delete page,exclude pages,take out pages,discard pages,drop pages"
title = "Remove Pages"
desc = "Remove specific pages from a PDF document"
[home.autoSizeSplitPDF]
tags = "auto,split,size"
title = "Auto Split by Size/Count"
desc = "Automatically split PDFs by file size or page count"
[home.replaceColor]
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 Colour"
desc = "Replace or invert colours in PDF documents"
[home.devApi]
tags = "API,development,documentation,developer,REST,integration,endpoints,programmatic,automation,scripting"
title = "API"
desc = "Link to API documentation"
[home.devFolderScanning]
tags = "automation,folder,scanning,watch folder,hot folder,automatic processing,batch,monitor folder,auto process,folder monitoring"
title = "Automated Folder Scanning"
desc = "Link to automated folder scanning guide"
[home.devSsoGuide]
tags = "SSO,single sign-on,authentication,SAML,OAuth,OIDC,login,enterprise,identity provider,IdP"
title = "SSO Guide"
desc = "Link to SSO guide"
[home.devAirgapped]
tags = "air-gapped,offline,isolated,no internet,disconnected,secure,network isolation,standalone"
title = "Air-gapped Setup"
desc = "Link to air-gapped setup guide"
[home.addPassword]
tags = "encrypt,password,lock,secure,protect,security,encryption,safeguard,confidential,private,restrict access"
title = "Add Password"
desc = "Add password protection and restrictions to PDF files"
[home.changePermissions]
tags = "permissions,restrictions,rights,access control,allow,deny,printing,copying,editing,modify permissions,security settings,user rights"
title = "Change Permissions"
desc = "Change document restrictions and permissions"
[home.automate]
tags = "workflow,sequence,automation,automate,batch,batch processing,pipeline,chain,multi-step,recurring,scheduled,automatic,process multiple,bulk operations"
title = "Automate"
desc = "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks."
[home.overlay-pdfs]
tags = "overlay,combine,merge,layer,superimpose,overlay PDF,layer PDFs,combine PDFs,stack,overlay pages,background,foreground,composite"
desc = "Overlay one PDF on top of another"
title = "Overlay PDFs"
[home.pdfTextEditor]
tags = "edit text,modify text,change text,edit content,update text,rewrite,correct,amend,redline,revise,text editor,content editor"
title = "PDF Text Editor"
desc = "Edit existing text and images inside PDFs"
[home.addText]
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"
desc = "Add custom text anywhere in your PDF"
[landing]
addFiles = "Add Files"
uploadFromComputer = "Upload from computer"
openFromComputer = "Open from computer"
mobileUpload = "Upload from Mobile"
[viewPdf]
tags = "view,read,annotate,text,image,highlight,edit"
title = "View/Edit PDF"
header = "View PDF"
[multiTool]
tags = "Multi Tool,Multi operation,UI,click drag,front end,client side,interactive,intractable,move,delete,migrate,divide"
title = "PDF Multi Tool"
header = "PDF Multi Tool"
uploadPrompts = "File Name"
selectAll = "Select All"
deselectAll = "Deselect All"
selectPages = "Page Select"
selectedPages = "Selected Pages"
page = "Page"
deleteSelected = "Delete Selected"
downloadAll = "Export"
downloadSelected = "Export Selected"
insertPageBreak = "Insert Page Break"
addFile = "Add File"
rotateLeft = "Rotate Left"
rotateRight = "Rotate Right"
split = "Split"
moveLeft = "Move Left"
moveRight = "Move Right"
delete = "Delete"
dragDropMessage = "Page(s) Selected"
undo = "Undo (CTRL + Z)"
redo = "Redo (CTRL + Y)"
[merge]
tags = "merge,Page operations,Back end,server side"
title = "Merge"
submit = "Merge"
[merge.removeDigitalSignature]
label = "Remove digital signature in the merged file?"
[merge.removeDigitalSignature.tooltip]
title = "Remove Digital Signature"
description = "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF."
[merge.generateTableOfContents]
label = "Generate table of contents in the merged file?"
[merge.generateTableOfContents.tooltip]
title = "Generate Table of Contents"
description = "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers."
[merge.sortBy]
description = "Files will be merged in the order they're selected. Drag to reorder or sort below."
label = "Sort By"
filename = "File Name"
dateModified = "Date Modified"
ascending = "Ascending"
descending = "Descending"
sort = "Sort"
[merge.error]
failed = "An error occurred while merging the PDFs."
[merge.tooltip.header]
title = "Merge Settings Overview"
[split]
title = "Split PDF"
header = "Split PDF"
splitPages = "Enter pages to split on:"
submit = "Split"
selectMethod = "Select a split method"
resultsTitle = "Split Results"
[split.desc]
1 = "The numbers you select are the page number you wish to do a split on"
2 = "As such selecting 1,3,7-9 would split a 10 page document into 6 separate PDFS with:"
3 = "Document #1: Page 1"
4 = "Document #2: Page 2 and 3"
5 = "Document #3: Page 4, 5, 6 and 7"
6 = "Document #4: Page 8"
7 = "Document #5: Page 9"
8 = "Document #6: Page 10"
[split.steps]
chooseMethod = "Choose Method"
settings = "Settings"
[split.settings]
selectMethodFirst = "Please select a split method first"
[split.error]
failed = "An error occurred while splitting the PDF."
[split.method]
label = "Choose split method"
placeholder = "Select how to split the PDF"
[split.methods.prefix]
splitAt = "Split at"
splitBy = "Split by"
[split.methods.byPages]
name = "Page Numbers"
desc = "Extract specific pages (1,3,5-10)"
tooltip = "Enter page numbers separated by commas or ranges with hyphens"
[split.methods.bySections]
name = "Sections"
desc = "Divide pages into grid sections"
tooltip = "Split each page into horizontal and vertical sections"
[split.methods.bySize]
name = "File Size"
desc = "Limit maximum file size"
tooltip = "Specify maximum file size (e.g. 10MB, 500KB)"
[split.methods.byPageCount]
name = "Page Count"
desc = "Fixed pages per file"
tooltip = "Enter the number of pages for each split file"
[split.methods.byDocCount]
name = "Document Count"
desc = "Create specific number of files"
tooltip = "Enter how many files you want to create"
[split.methods.byChapters]
name = "Chapters"
desc = "Split at bookmark boundaries"
tooltip = "Uses PDF bookmarks to determine split points"
[split.methods.byPageDivider]
name = "Page Divider"
desc = "Auto-split with divider sheets"
tooltip = "Use QR code divider sheets between documents when scanning"
[split.value.fileSize]
label = "File Size"
placeholder = "e.g. 10MB, 500KB"
[split.value.pageCount]
label = "Pages per File"
placeholder = "e.g. 5, 10"
[split.value.docCount]
label = "Number of Files"
placeholder = "e.g. 3, 5"
[split.tooltip.header]
title = "Split Methods Overview"
[split.tooltip.byPages]
title = "Split at Page Numbers"
text = "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m."
bullet1 = "Single split points: 3,7 (splits after pages 3 and 7)"
bullet2 = "Range split points: 3-8 (splits before page 3 and after page 8)"
bullet3 = "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)"
[split.tooltip.bySections]
title = "Split by Grid Sections"
text = "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas."
bullet1 = "Horizontal: Number of rows to create"
bullet2 = "Vertical: Number of columns to create"
bullet3 = "Merge: Combine all sections into one PDF"
[split.tooltip.bySize]
title = "Split by File Size"
text = "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments."
bullet1 = "Use MB for larger files (e.g., 10MB)"
bullet2 = "Use KB for smaller files (e.g., 500KB)"
bullet3 = "System will split at page boundaries"
[split.tooltip.byCount]
title = "Split by Count"
text = "Create multiple PDFs with a specific number of pages or documents each."
bullet1 = "Page Count: Fixed number of pages per file"
bullet2 = "Document Count: Fixed number of output files"
bullet3 = "Useful for batch processing workflows"
[split.tooltip.byChapters]
title = "Split by Chapters"
text = "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure."
bullet1 = "Bookmark Level: Which level to split on (1=top level)"
bullet2 = "Include Metadata: Preserve document properties"
bullet3 = "Allow Duplicates: Handle repeated bookmark names"
[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.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"
[rotate]
title = "Rotate PDF"
submit = "Apply Rotation"
selectRotation = "Select Rotation Angle (Clockwise)"
rotateLeft = "Rotate Anticlockwise"
rotateRight = "Rotate Clockwise"
[rotate.error]
failed = "An error occurred while rotating the PDF."
[rotate.preview]
title = "Rotation Preview"
[rotate.tooltip.header]
title = "Rotate Settings Overview"
[rotate.tooltip.description]
text = "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation."
[rotate.tooltip.controls]
title = "Controls"
text = "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees."
[convert]
title = "Convert"
desc = "Convert files between different formats"
files = "Files"
selectFilesPlaceholder = "Select files in the main view to get started"
settings = "Settings"
conversionCompleted = "Conversion completed"
results = "Results"
defaultFilename = "converted_file"
conversionResults = "Conversion Results"
convertFrom = "Convert from"
convertTo = "Convert to"
sourceFormatPlaceholder = "Source format"
targetFormatPlaceholder = "Target format"
selectSourceFormatFirst = "Select a source format first"
outputOptions = "Output Options"
pdfOptions = "PDF Options"
imageOptions = "Image Options"
colorType = "Colour Type"
color = "Colour"
greyscale = "Greyscale"
blackwhite = "Black & White"
dpi = "DPI"
output = "Output"
single = "Single"
multiple = "Multiple"
fitOption = "Fit Option"
maintainAspectRatio = "Maintain Aspect Ratio"
fitDocumentToPage = "Fit Document to Page"
fillPage = "Fill Page"
autoRotate = "Auto Rotate"
autoRotateDescription = "Automatically rotate images to better fit the PDF page"
combineImages = "Combine Images"
combineImagesDescription = "Combine all images into one PDF, or create separate PDFs for each image"
webOptions = "Web to PDF Options"
zoomLevel = "Zoom Level"
emailOptions = "Email to PDF Options"
includeAttachments = "Include email attachments"
maxAttachmentSize = "Maximum attachment size (MB)"
includeAllRecipients = "Include CC and BCC recipients in header"
downloadHtml = "Download HTML intermediate file instead of PDF"
pdfaOptions = "PDF/A Options"
outputFormat = "Output Format"
pdfaNote = "PDF/A-1b is more compatible, PDF/A-2b supports more features, PDF/A-3b supports embedded files."
pdfaFormat = "PDF/A Format"
pdfaDigitalSignatureWarning = "The PDF contains a digital signature. This will be removed in the next step."
pdfxDigitalSignatureWarning = "The PDF contains a digital signature. This will be removed in the next step."
pdfxDescription = "PDF/X is an ISO standard PDF subset for reliable printing and graphics exchange."
fileFormat = "File Format"
wordDoc = "Word Document"
wordDocExt = "Word Document (.docx)"
odtExt = "OpenDocument Text (.odt)"
pptExt = "PowerPoint (.pptx)"
odpExt = "OpenDocument Presentation (.odp)"
txtExt = "Plain Text (.txt)"
rtfExt = "Rich Text Format (.rtf)"
selectedFiles = "Selected files"
noFileSelected = "No file selected. Use the file panel to add files."
convertFiles = "Convert Files"
converting = "Converting..."
downloadConverted = "Download Converted File"
errorNoFiles = "Please select at least one file to convert."
errorNoFormat = "Please select both source and target formats."
errorNotSupported = "Conversion from {{from}} to {{to}} is not supported."
images = "Images"
officeDocs = "Office Documents (Word, Excel, PowerPoint)"
imagesExt = "Images (JPG, PNG, etc.)"
markdown = "Markdown"
textRtf = "Text/RTF"
grayscale = "Greyscale"
errorConversion = "An error occurred while converting the file."
cbzOptions = "CBZ to PDF Options"
optimizeForEbook = "Optimize PDF for ebook readers (uses Ghostscript)"
cbzOutputOptions = "PDF to CBZ Options"
cbzDpi = "DPI for image rendering"
cbrOptions = "CBR Options"
cbrOutputOptions = "PDF to CBR Options"
cbrDpi = "DPI for image rendering"
svgPdfOptions = "SVG to PDF Options"
combineSvgs = "Combine SVGs into single PDF"
combineSvgsDescription = "Combine all SVG files into one PDF with multiple pages, or create separate PDFs for each SVG"
svgVectorNote = "SVG files are rendered as vector graphics for crisp output at any resolution. Dimensions from the SVG determine the PDF page size."
[convert.ebookOptions]
ebookOptions = "eBook to PDF Options"
ebookOptionsDesc = "Options for converting eBooks to PDF"
embedAllFonts = "Embed all fonts"
embedAllFontsDesc = "Embed all fonts from the eBook into the generated PDF"
includeTableOfContents = "Include table of contents"
includeTableOfContentsDesc = "Add a generated table of contents to the resulting PDF"
includePageNumbers = "Include page numbers"
includePageNumbersDesc = "Add page numbers to the generated PDF"
optimizeForEbookPdf = "Optimize for ebook readers"
optimizeForEbookPdfDesc = "Optimize the PDF for eBook reading (smaller file size, better rendering on eInk devices)"
[convert.epubOptions]
epubOptions = "PDF to eBook Options"
epubOptionsDesc = "Options for converting PDF to EPUB/AZW3"
detectChapters = "Detect chapters"
detectChaptersDesc = "Detect headings that look like chapters and insert EPUB page breaks"
targetDevice = "Target device"
targetDeviceDesc = "Choose an output profile optimized for the reader device"
outputFormat = "Output format"
outputFormatDesc = "Choose the output format for the ebook"
tabletPhone = "Tablet/Phone (with images)"
kindleEink = "Kindle e-Ink (text optimized)"
[imageToPdf]
tags = "conversion,img,jpg,picture,photo"
[pdfToImage]
tags = "conversion,img,jpg,picture,photo"
title = "PDF to Image"
header = "PDF to Image"
selectText = "Image Format"
singleOrMultiple = "Page to Image result type"
single = "Single Big Image Combing all pages"
multi = "Multiple Images, one image per page"
colorType = "Colour type"
color = "Colour"
grey = "Greyscale"
blackwhite = "Black and White (May lose data!)"
submit = "Convert"
info = "Python is not installed. Required for WebP conversion."
placeholder = "(e.g. 1,2,8 or 4,7,12-16 or 2n-1)"
[pdfOrganiser]
tags = "duplex,even,odd,sort,move"
title = "Page Organiser"
header = "PDF Page Organiser"
submit = "Rearrange Pages"
placeholder = "(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)"
[pdfOrganiser.mode]
_value = "Organisation mode"
1 = "Custom Page Order"
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"
10 = "Odd-Even Merge"
11 = "Duplicate all pages"
[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 sidestitch booklet printing (optimized for binding on the side)."
[pdfOrganiser.desc]
CUSTOM = "Use a custom sequence of page numbers or expressions to define a new order."
REVERSE_ORDER = "Flip the document so the last page becomes first and so on."
DUPLEX_SORT = "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, …)."
BOOKLET_SORT = "Arrange pages for booklet printing (last, first, second, second last, …)."
SIDE_STITCH_BOOKLET_SORT = "Arrange pages for sidestitch booklet printing (optimised for binding on the side)."
ODD_EVEN_SPLIT = "Split the document into two outputs: all odd pages and all even pages."
ODD_EVEN_MERGE = "Merge two PDFs by alternating pages: odd from the first, even from the second."
DUPLICATE = "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×)."
REMOVE_FIRST = "Remove the first page from the document."
REMOVE_LAST = "Remove the last page from the document."
REMOVE_FIRST_AND_LAST = "Remove both the first and last pages from the document."
[addImage]
tags = "img,jpg,picture,photo"
title = "Add Image"
header = "Add images to PDFs"
applySignatures = "Apply Images"
[addImage.image]
name = "Image"
placeholder = "Upload an image"
label = "Image file"
hint = "Supports PNG, JPEG, GIF, BMP, TIFF, and SVG files. SVG files will be converted to PNG for embedding."
[addImage.steps]
configure = "Configure Image"
[addImage.step]
createDesc = "Upload the image you want to add"
place = "Place image"
placeDesc = "Click on the PDF to add your image"
[addImage.instructions]
title = "How to add images"
text = "After uploading your image above, click anywhere on the PDF to place it."
paused = "Placement paused"
resumeHint = "Resume placement to click and add your image."
noSignature = "Upload an image above to enable placement."
[addImage.mode]
move = "Move Image"
place = "Place Image"
pause = "Pause placement"
resume = "Resume placement"
[addImage.results]
title = "Add Image Results"
[addImage.error]
failed = "An error occurred while adding image to the PDF."
[addImage.saved]
defaultLabel = "Image"
defaultImageLabel = "Uploaded image"
[attachments]
tags = "attachments,add,remove,embed,file"
title = "Add Attachments"
header = "Add Attachments"
add = "Add Attachment"
remove = "Remove Attachment"
embed = "Embed Attachment"
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"
submit = "Add Attachments"
[watermark]
title = "Add Watermark"
desc = "Add text or image watermarks to PDF files"
completed = "Watermark added"
submit = "Add Watermark"
filenamePrefix = "watermarked"
[watermark.error]
failed = "An error occurred while adding watermark to the PDF."
[watermark.watermarkType]
text = "Text"
image = "Image"
[watermark.settings]
type = "Watermark Type"
fontSize = "Font Size"
size = "Size"
alphabet = "Font/Language"
color = "Watermark Colour"
rotation = "Rotation (degrees)"
opacity = "Opacity (%)"
convertToImage = "Flatten PDF pages to images"
[watermark.settings.text]
label = "Watermark Text"
placeholder = "Enter watermark text"
[watermark.settings.image]
label = "Watermark Image"
choose = "Choose Image"
selected = "Selected: {{filename}}"
[watermark.settings.spacing]
horizontal = "Horizontal Spacing"
vertical = "Vertical Spacing"
height = "Height Spacing"
width = "Width Spacing"
[watermark.alphabet]
roman = "Roman/Latin"
arabic = "Arabic"
japanese = "Japanese"
korean = "Korean"
chinese = "Chinese"
thai = "Thai"
[watermark.steps]
type = "Watermark Type"
wording = "Wording"
textStyle = "Style"
formatting = "Formatting"
file = "Watermark File"
[watermark.results]
title = "Watermark Results"
[watermark.tooltip.language]
title = "Language Support"
text = "Choose the appropriate language setting to ensure proper font rendering for your text."
[watermark.tooltip.appearance]
title = "Appearance Settings"
text = "Control how your watermark looks and blends with the document."
bullet1 = "Rotation: -360° to 360° for angled watermarks"
bullet2 = "Opacity: 0-100% for transparency control"
bullet3 = "Lower opacity creates subtle watermarks"
[watermark.tooltip.spacing]
title = "Spacing Control"
text = "Adjust the spacing between repeated watermarks across the page."
bullet1 = "Width spacing: Horizontal distance between watermarks"
bullet2 = "Height spacing: Vertical distance between watermarks"
bullet3 = "Higher values create more spread out patterns"
[watermark.tooltip.type.header]
title = "Watermark Type Selection"
[watermark.tooltip.type.description]
title = "Choose Your Watermark"
text = "Select between text or image watermarks based on your needs."
[watermark.tooltip.type.text]
title = "Text Watermarks"
text = "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours."
bullet1 = "Customisable fonts and languages"
bullet2 = "Adjustable colours and transparency"
bullet3 = "Ideal for legal or branding text"
[watermark.tooltip.type.image]
title = "Image Watermarks"
text = "Use logos, stamps, or any image as a watermark. Great for branding and visual identification."
bullet1 = "Upload any image format"
bullet2 = "Maintains image quality"
bullet3 = "Perfect for logos and stamps"
[watermark.tooltip.wording.header]
title = "Text Content"
[watermark.tooltip.wording.text]
title = "Watermark Text"
text = "Enter the text that will appear as your watermark across the document."
bullet1 = "Keep it concise for better readability"
bullet2 = "Common examples: 'CONFIDENTIAL', 'DRAFT', company name"
bullet3 = "Emoji characters are not supported and will be filtered out"
[watermark.tooltip.textStyle.header]
title = "Text Style"
[watermark.tooltip.textStyle.color]
title = "Colour Selection"
text = "Choose a colour that provides good contrast with your document content."
bullet1 = "Light grey (#d3d3d3) for subtle watermarks"
bullet2 = "Black or dark colours for high contrast"
bullet3 = "Custom colours for branding purposes"
[watermark.tooltip.textStyle.language]
title = "Language Support"
text = "Choose the appropriate language setting to ensure proper font rendering."
[watermark.tooltip.file.header]
title = "Image Upload"
[watermark.tooltip.file.upload]
title = "Image Selection"
text = "Upload an image file to use as your watermark."
bullet1 = "Supports common formats: PNG, JPG, GIF, BMP"
bullet2 = "PNG with transparency works best"
bullet3 = "Higher resolution images maintain quality better"
[watermark.tooltip.file.recommendations]
title = "Best Practices"
text = "Tips for optimal image watermark results."
bullet1 = "Use logos or stamps with transparent backgrounds"
bullet2 = "Simple designs work better than complex images"
bullet3 = "Consider the final document size when choosing resolution"
[watermark.tooltip.formatting.header]
title = "Formatting & Layout"
[watermark.tooltip.formatting.size]
title = "Size Control"
text = "Adjust the size of your watermark (text or image)."
bullet1 = "Larger sizes create more prominent watermarks"
[watermark.tooltip.formatting.appearance]
title = "Appearance Settings"
text = "Control how your watermark looks and blends with the document."
bullet1 = "Rotation: -360° to 360° for angled watermarks"
bullet2 = "Opacity: 0-100% for transparency control"
bullet3 = "Lower opacity creates subtle watermarks"
[watermark.tooltip.formatting.spacing]
title = "Spacing Control"
text = "Adjust the spacing between repeated watermarks across the page."
bullet1 = "Horizontal spacing: Distance between watermarks left to right"
bullet2 = "Vertical spacing: Distance between watermarks top to bottom"
bullet3 = "Higher values create more spread out patterns"
[watermark.tooltip.formatting.security]
title = "Security Option"
text = "Convert the final PDF to an image-based format for enhanced security."
bullet1 = "Prevents text selection and copying"
bullet2 = "Makes watermarks harder to remove"
bullet3 = "Results in larger file sizes"
bullet4 = "Best for sensitive or copyrighted content"
[watermark.type]
1 = "Text"
2 = "Image"
[permissions]
tags = "read,write,edit,print"
title = "Change Permissions"
header = "Change Permissions"
warning = "Warning to have these permissions be unchangeable it is recommended to set them with a password via the add-password page"
submit = "Change"
[permissions.selectText]
1 = "Select PDF to change permissions"
2 = "Permissions to set"
3 = "Prevent assembly of document"
4 = "Prevent content extraction"
5 = "Prevent extraction for accessibility"
6 = "Prevent filling in form"
7 = "Prevent modification"
8 = "Prevent annotation modification"
9 = "Prevent printing"
10 = "Prevent printing different formats"
[editTableOfContents]
submit = "Apply table of contents"
[editTableOfContents.settings]
title = "Bookmarks & outline"
replaceExisting = "Replace existing bookmarks (uncheck to append)"
replaceExistingHint = "When disabled, the new outline is appended after the current bookmarks."
[editTableOfContents.actions]
source = "Load bookmarks"
selectedFile = "Loaded from {{file}}"
noFile = "Select a PDF to extract existing bookmarks."
loadFromPdf = "Load from selected PDF"
importJson = "Import JSON"
importClipboard = "Paste JSON from clipboard"
export = "Export bookmarks"
exportJson = "Download JSON"
exportClipboard = "Copy JSON to clipboard"
clipboardUnavailable = "Clipboard access is not available in this browser."
[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.workbench]
tabTitle = "Outline workspace"
subtitle = "Import bookmarks, build hierarchies, and apply the outline without cramped side panels."
noFile = "No PDF selected"
fileLabel = "Changes will be applied to the currently selected PDF."
filePrompt = "Select a PDF from your library or upload a new one to begin."
changeFile = "Change PDF"
selectFile = "Select PDF"
[editTableOfContents.workbench.empty]
title = "Open the tool to start editing"
description = "Select the Edit Table of Contents tool to load its workspace."
[editTableOfContents.editor]
heading = "Bookmark editor"
description = "Add, nest, and reorder bookmarks to craft your PDF outline."
addTopLevel = "Add top-level bookmark"
defaultTitle = "New bookmark"
defaultChildTitle = "Child bookmark"
defaultSiblingTitle = "New bookmark"
untitled = "Untitled bookmark"
childBadge = "Child"
pagePreview = "Page {{page}}"
confirmRemove = "Remove this bookmark and all of its children?"
[editTableOfContents.editor.empty]
title = "No bookmarks yet"
description = "Import existing bookmarks or start by adding your first entry."
action = "Add first bookmark"
[editTableOfContents.editor.field]
title = "Bookmark title"
page = "Target page number"
[editTableOfContents.editor.actions]
toggle = "Toggle children"
addChild = "Add child bookmark"
addSibling = "Add sibling bookmark"
remove = "Remove bookmark"
[editTableOfContents.messages]
loadedTitle = "Bookmarks extracted"
loadedBody = "Existing bookmarks from the PDF were loaded into the editor."
noBookmarks = "No bookmarks were found in the selected PDF."
loadFailed = "Unable to extract bookmarks from the selected PDF."
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."
exported = "JSON download ready"
copied = "Copied to clipboard"
copiedBody = "Bookmark JSON copied successfully."
copyFailed = "Copy failed"
[editTableOfContents.error]
failed = "Failed to update the table of contents"
[editTableOfContents.results]
title = "Updated PDF with bookmarks"
subtitle = "Download the processed file or undo the operation below."
[removePages]
tags = "Remove pages,delete pages"
title = "Remove Pages"
filenamePrefix = "pages_removed"
submit = "Remove Pages"
[removePages.pageNumbers]
label = "Pages to Remove"
placeholder = "e.g., 1,3,5-8,10"
error = "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)"
[removePages.files]
placeholder = "Select a PDF file in the main view to get started"
[removePages.settings]
title = "Settings"
[removePages.tooltip.header]
title = "Remove Pages Settings"
[removePages.tooltip.pageNumbers]
title = "Page Selection"
text = "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions."
bullet1 = "Individual pages: 1,3,5 (removes pages 1, 3, and 5)"
bullet2 = "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)"
bullet3 = "Mathematical: 2n+1 (removes odd pages)"
bullet4 = "Open ranges: 5- (removes from page 5 to end)"
[removePages.tooltip.examples]
title = "Common Examples"
text = "Here are some common page selection patterns:"
bullet1 = "Remove first page: 1"
bullet2 = "Remove last 3 pages: -3"
bullet3 = "Remove every other page: 2n"
bullet4 = "Remove specific scattered pages: 1,5,10,15"
[removePages.tooltip.safety]
title = "Safety Tips"
text = "Important considerations when removing pages:"
bullet1 = "Always preview your selection before processing"
bullet2 = "Keep a backup of your original file"
bullet3 = "Page numbers start from 1, not 0"
bullet4 = "Invalid page numbers will be ignored"
[removePages.error]
failed = "An error occurred whilst removing pages."
[removePages.results]
title = "Page Removal Results"
[extractPages]
title = "Extract Pages"
submit = "Extract Pages"
[extractPages.pageNumbers]
label = "Pages to Extract"
placeholder = "e.g., 1,3,5-8 or odd & 1-10"
[extractPages.settings]
title = "Settings"
[extractPages.tooltip]
description = "Extracts the selected pages into a new PDF, preserving order."
[extractPages.error]
failed = "Failed to extract pages"
[extractPages.results]
title = "Pages Extracted"
[pageSelection.tooltip]
description = "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword."
[pageSelection.tooltip.header]
title = "Page Selection Guide"
[pageSelection.tooltip.basic]
title = "Basic Usage"
text = "Select specific pages from your PDF document using simple syntax."
bullet1 = "Individual pages: 1,3,5"
bullet2 = "Page ranges: 3-6 or 10-15"
bullet3 = "All pages: all"
[pageSelection.tooltip.advanced]
title = "Advanced Features"
[pageSelection.tooltip.tips]
title = "Tips"
text = "Keep these guidelines in mind:"
bullet1 = "Page numbers start from 1 (not 0)"
bullet2 = "Spaces are automatically removed"
bullet3 = "Invalid expressions are ignored"
[pageSelection.tooltip.syntax]
title = "Syntax Basics"
text = "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported."
[pageSelection.tooltip.syntax.bullets]
numbers = "Numbers/ranges: 5, 10-20"
keywords = "Keywords: odd, even"
progressions = "Progressions: 3n, 4n+1"
[pageSelection.tooltip.operators]
title = "Operators"
text = "AND has higher precedence than comma. NOT applies within the document range."
and = "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)"
comma = "Comma: , or | — combine selections (e.g., 1-10, 20)"
not = "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)"
[pageSelection.tooltip.examples]
title = "Examples"
[pageSelection.tooltip.complex]
bullet1 = "<strong>1,3-5,8,2n</strong> → pages 1, 35, 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.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 36"
bullet2 = "<strong>10-15</strong> → selects pages 1015"
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"
[bulkSelection]
syntaxError = "There is a syntax issue. See Page Selection tips for help."
[bulkSelection.header]
title = "Page Selection Guide"
[bulkSelection.syntax]
title = "Syntax Basics"
text = "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported."
[bulkSelection.syntax.bullets]
numbers = "Numbers/ranges: 5, 10-20"
keywords = "Keywords: odd, even"
progressions = "Progressions: 3n, 4n+1"
[bulkSelection.operators]
title = "Operators"
text = "AND has higher precedence than comma. NOT applies within the document range."
and = "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)"
comma = "Comma: , or | — combine selections (e.g., 1-10, 20)"
not = "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)"
[bulkSelection.examples]
title = "Examples"
first50 = "First 50"
last50 = "Last 50"
every3rd = "Every 3rd"
oddWithinExcluding = "Odd within 1-20 excluding 5-7"
combineSets = "Combine sets"
[bulkSelection.firstNPages]
title = "First N Pages"
placeholder = "Number of pages"
[bulkSelection.lastNPages]
title = "Last N Pages"
placeholder = "Number of pages"
[bulkSelection.everyNthPage]
title = "Every Nth Page"
placeholder = "Step size"
[bulkSelection.range]
title = "Range"
fromPlaceholder = "From"
toPlaceholder = "To"
[bulkSelection.keywords]
title = "Keywords"
[bulkSelection.advanced]
title = "Advanced"
[compressPdfs]
tags = "squish,small,tiny"
[unlockPDFForms]
tags = "remove,delete,form,field,readonly"
title = "Remove Read-Only from Form Fields"
header = "Unlock PDF Forms"
submit = "Unlock Forms"
description = "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable."
filenamePrefix = "unlocked_forms"
[unlockPDFForms.files]
placeholder = "Select a PDF file in the main view to get started"
[unlockPDFForms.error]
failed = "An error occurred whilst unlocking PDF forms."
[unlockPDFForms.results]
title = "Unlocked Forms Results"
[changeMetadata]
header = "Change Metadata"
submit = "Change"
filenamePrefix = "metadata"
[changeMetadata.settings]
title = "Metadata Settings"
[changeMetadata.standardFields]
title = "Standard Fields"
[changeMetadata.deleteAll]
label = "Remove Existing Metadata"
checkbox = "Delete all metadata"
[changeMetadata.title]
label = "Title"
placeholder = "Document title"
[changeMetadata.author]
label = "Author"
placeholder = "Document author"
[changeMetadata.subject]
label = "Subject"
placeholder = "Document subject"
[changeMetadata.keywords]
label = "Keywords"
placeholder = "Document keywords"
[changeMetadata.creator]
label = "Creator"
placeholder = "Document creator"
[changeMetadata.producer]
label = "Producer"
placeholder = "Document producer"
[changeMetadata.dates]
title = "Date Fields"
[changeMetadata.creationDate]
label = "Creation Date"
placeholder = "Creation date"
[changeMetadata.modificationDate]
label = "Modification Date"
placeholder = "Modification date"
[changeMetadata.trapped]
label = "Trapped Status"
unknown = "Unknown"
true = "True"
false = "False"
[changeMetadata.advanced]
title = "Advanced Options"
[changeMetadata.customFields]
title = "Custom Metadata"
description = "Add custom metadata fields to the document"
add = "Add Field"
key = "Key"
keyPlaceholder = "Custom key"
value = "Value"
valuePlaceholder = "Custom value"
remove = "Remove"
[changeMetadata.results]
title = "Updated PDFs"
[changeMetadata.error]
failed = "An error occurred while changing the PDF metadata."
[changeMetadata.tooltip.header]
title = "PDF Metadata Overview"
[changeMetadata.tooltip.standardFields]
title = "Standard Fields"
text = "Common PDF metadata fields that describe the document."
bullet1 = "Title: Document name or heading"
bullet2 = "Author: Person who created the document"
bullet3 = "Subject: Brief description of content"
bullet4 = "Keywords: Search terms for the document"
bullet5 = "Creator/Producer: Software used to create the PDF"
[changeMetadata.tooltip.dates]
title = "Date Fields"
text = "When the document was created and modified."
bullet1 = "Creation Date: When original document was made"
bullet2 = "Modification Date: When last changed"
[changeMetadata.tooltip.options]
title = "Additional Options"
text = "Custom fields and privacy controls."
bullet1 = "Custom Metadata: Add your own key-value pairs"
bullet2 = "Trapped Status: High-quality printing setting"
bullet3 = "Delete All: Remove all metadata for privacy"
[changeMetadata.tooltip.deleteAll]
title = "Remove Existing Metadata"
text = "Complete metadata deletion to ensure privacy."
[changeMetadata.tooltip.customFields]
title = "Custom Metadata"
text = "Add your own custom key-value metadata pairs."
bullet1 = "Add any custom fields relevant to your document"
bullet2 = "Examples: Department, Project, Version, Status"
bullet3 = "Both key and value are required for each entry"
[changeMetadata.tooltip.advanced]
title = "Advanced Options"
[changeMetadata.tooltip.advanced.trapped]
title = "Trapped Status"
description = "Indicates if document is prepared for high-quality printing."
bullet1 = "True: Document has been trapped for printing"
bullet2 = "False: Document has not been trapped"
bullet3 = "Unknown: Trapped status is not specified"
[fileToPDF]
tags = "transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint"
title = "File to PDF"
header = "Convert any file to PDF"
credit = "This service uses LibreOffice and Unoconv for file conversion."
supportedFileTypesInfo = "Supported File types"
supportedFileTypes = "Supported file types should include the below however for a full updated list of supported formats, please refer to the LibreOffice documentation"
submit = "Convert to PDF"
[ocr]
tags = "recognition,text,image,scan,read,identify,detection,editable"
title = "OCR / Scan Cleanup"
desc = "Cleanup scans and detects text from images within a PDF and re-adds it as text."
header = "Cleanup Scans / OCR (Optical Character Recognition)"
help = "Please read this documentation on how to use this for other languages and/or use not in docker"
credit = "This service uses qpdf and Tesseract for OCR."
submit = "Process PDF with OCR"
[ocr.selectText]
1 = "Select languages that are to be detected within the PDF (Ones listed are the ones currently detected):"
2 = "Produce text file containing OCR text alongside the OCR'ed PDF"
3 = "Correct pages were scanned at a skewed angle by rotating them back into place"
4 = "Clean page so its less likely that OCR will find text in background noise. (No output change)"
5 = "Clean page so its less likely that OCR will find text in background noise, maintains cleanup in output."
6 = "Ignores pages that have interactive text on them, only OCRs pages that are images"
7 = "Force OCR, will OCR Every page removing all original text elements"
8 = "Normal (Will error if PDF contains text)"
9 = "Additional Settings"
10 = "OCR Mode"
11 = "Remove images after OCR (Removes ALL images, only useful if part of conversion step)"
12 = "Render Type (Advanced)"
[ocr.operation]
submit = "Process OCR and Review"
[ocr.results]
title = "OCR Results"
[ocr.languagePicker]
additionalLanguages = "Looking for additional languages?"
viewSetupGuide = "View setup guide →"
[ocr.settings]
title = "Settings"
[ocr.settings.ocrMode]
label = "OCR Mode"
auto = "Auto (skip text layers)"
force = "Force (re-OCR all, replace text)"
strict = "Strict (abort if text found)"
[ocr.settings.languages]
label = "Languages"
placeholder = "Select languages"
[ocr.settings.compatibilityMode]
label = "Compatibility Mode"
[ocr.settings.advancedOptions]
label = "Processing Options"
sidecar = "Create a text file"
deskew = "Deskew pages"
clean = "Clean input file"
cleanFinal = "Clean final output"
[ocr.tooltip.header]
title = "OCR Settings Overview"
[ocr.tooltip.mode]
title = "OCR Mode"
text = "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight."
bullet1 = "Auto skips pages that already contain text layers."
bullet2 = "Force re-OCRs every page and replaces all the text."
bullet3 = "Strict halts if any selectable text is found."
[ocr.tooltip.languages]
title = "Languages"
text = "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection."
[ocr.tooltip.output]
title = "Output"
text = "Decide how you want the text output formatted:"
bullet1 = "Searchable PDF embeds text behind the original image."
bullet2 = "HOCR XML returns a structured machine-readable file."
bullet3 = "Plain-text sidecar creates a separate .txt file with raw content."
[ocr.tooltip.advanced.header]
title = "Advanced OCR Processing"
[ocr.tooltip.advanced.compatibility]
title = "Compatibility Mode"
text = "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs."
[ocr.tooltip.advanced.sidecar]
title = "Create Text File"
text = "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing."
[ocr.tooltip.advanced.deskew]
title = "Deskew Pages"
text = "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned."
[ocr.tooltip.advanced.clean]
title = "Clean Input File"
text = "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing."
[ocr.tooltip.advanced.cleanFinal]
title = "Clean Final Output"
text = "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size."
[ocr.error]
failed = "OCR operation failed"
[extractImages]
tags = "picture,photo,save,archive,zip,capture,grab"
title = "Extract Images"
header = "Extract Images"
selectText = "Select image format to convert extracted images to"
allowDuplicates = "Save duplicate images"
submit = "Extract"
[extractImages.settings]
title = "Settings"
[extractImages.error]
failed = "An error occurred while extracting images from the PDF."
[pdfToPDFA]
tags = "archive,long-term,standard,conversion,storage,preservation"
title = "PDF To PDF/A"
header = "PDF To PDF/A"
credit = "This service uses libreoffice for PDF/A conversion"
submit = "Convert"
tip = "Currently does not work for multiple inputs at once"
outputFormat = "Output format"
pdfWithDigitalSignature = "The PDF contains a digital signature. This will be removed in the next step."
[pdfToPDFX]
tags = "print,standard,conversion,production,prepress,archive"
title = "PDF To PDF/X"
header = "PDF To PDF/X"
credit = "This service uses Ghostscript for PDF/X conversion"
submit = "Convert"
tip = "Currently does not work for multiple inputs at once"
outputFormat = "Output format"
pdfWithDigitalSignature = "The PDF contains a digital signature. This will be removed in the next step."
[PDFToWord]
tags = "doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile"
title = "PDF to Word"
header = "PDF to Word"
credit = "This service uses LibreOffice for file conversion."
submit = "Convert"
[PDFToWord.selectText]
1 = "Output file format"
[PDFToPresentation]
tags = "slides,show,office,microsoft"
title = "PDF to Presentation"
header = "PDF to Presentation"
credit = "This service uses LibreOffice for file conversion."
submit = "Convert"
[PDFToPresentation.selectText]
1 = "Output file format"
[PDFToText]
tags = "richformat,richtextformat,rich text format"
title = "PDF to RTF (Text)"
header = "PDF to RTF (Text)"
credit = "This service uses LibreOffice for file conversion."
submit = "Convert"
[PDFToText.selectText]
1 = "Output file format"
[PDFToHTML]
tags = "web content,browser friendly"
title = "PDF to HTML"
header = "PDF to HTML"
credit = "This service uses pdftohtml for file conversion."
submit = "Convert"
[PDFToXML]
tags = "data-extraction,structured-content,interop,transformation,convert"
title = "PDF to XML"
header = "PDF to XML"
credit = "This service uses LibreOffice for file conversion."
submit = "Convert"
[ScannerImageSplit]
tags = "separate,auto-detect,scans,multi-photo,organize"
info = "Python is not installed. It is required to run."
[ScannerImageSplit.selectText]
1 = "Angle Threshold:"
2 = "Tilt (in degrees) needed before we auto-straighten a photo."
3 = "Tolerance:"
4 = "How closely a colour 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:"
10 = "Extra padding (in pixels) around each saved photo so edges aren't cut."
[scannerImageSplit]
title = "Extracted Images"
submit = "Extract Image Scans"
[scannerImageSplit.error]
failed = "An error occurred while extracting image scans."
[scannerImageSplit.tooltip]
title = "Photo Splitter"
whatThisDoes = "What this does"
whatThisDoesDesc = "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping."
whenToUse = "When to use"
useCase1 = "Scan whole album pages in one go"
useCase2 = "Split flatbed batches into separate files"
useCase3 = "Break collages into individual photos"
useCase4 = "Pull photos from documents"
quickFixes = "Quick fixes"
problem1 = "Photos not detected → increase Tolerance to 30-50"
problem2 = "Too many false detections → increase Minimum Area to 15,000-20,000"
problem3 = "Crops are too tight → increase Border Size to 5-10"
problem4 = "Tilted photos not straightened → lower Angle Threshold to ~5°"
problem5 = "Dust/noise boxes → increase Minimum Contour Area to 1000-2000"
setupTips = "Setup tips"
tip1 = "Use a plain, light background"
tip2 = "Leave a small gap (≈1 cm) between photos"
tip3 = "Scan at 300-600 DPI"
tip4 = "Clean the scanner glass"
headsUp = "Heads-up"
headsUpDesc = "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space."
[sign]
title = "Sign"
header = "Sign PDFs"
upload = "Upload Image"
clear = "Clear"
add = "Add"
save = "Save Signature"
applySignatures = "Apply Signatures"
personalSigs = "Personal Signatures"
sharedSigs = "Shared Signatures"
noSavedSigs = "No saved signatures found"
addToAll = "Add to all pages"
delete = "Delete"
first = "First page"
last = "Last page"
next = "Next page"
previous = "Previous page"
maintainRatio = "Toggle maintain aspect ratio"
undo = "Undo"
redo = "Redo"
submit = "Sign Document"
updateAndPlace = "Update and Place"
activate = "Activate Signature Placement"
deactivate = "Stop Placing Signatures"
[sign.draw]
title = "Draw your signature"
clear = "Clear"
[sign.canvas]
heading = "Draw your signature"
clickToOpen = "Click to open the drawing canvas"
modalTitle = "Draw your signature"
colorLabel = "Colour"
penSizeLabel = "Pen size"
penSizePlaceholder = "Size"
clear = "Clear canvas"
colorPickerTitle = "Choose stroke colour"
[sign.text]
name = "Text"
placeholder = "Enter text"
fontLabel = "Font"
fontSizeLabel = "Font size"
fontSizePlaceholder = "Type or select font size (8-200)"
colorLabel = "Text colour"
[sign.saved]
heading = "Saved signatures"
description = "Reuse saved signatures at any time."
emptyTitle = "No saved signatures yet"
emptyDescription = "Draw, upload, or type a signature above, then use \"Save to library\" to keep up to {{max}} favourites ready to use."
limitTitle = "Limit reached"
limitDescription = "Remove a saved signature before adding new ones (max {{max}})."
carouselPosition = "{{current}} of {{total}}"
prev = "Previous"
next = "Next"
delete = "Remove"
label = "Label"
defaultLabel = "Signature"
defaultCanvasLabel = "Drawing signature"
defaultImageLabel = "Uploaded signature"
defaultTextLabel = "Typed signature"
saveButton = "Save signature"
savePersonal = "Save Personal"
saveShared = "Save Shared"
saveUnavailable = "Create a signature first to save it."
noChanges = "Current signature is already saved."
tempStorageTitle = "Temporary browser storage"
tempStorageDescription = "Signatures are stored in your browser only. They will be lost if you clear browser data or switch browsers."
personalHeading = "Personal Signatures"
sharedHeading = "Shared Signatures"
personalDescription = "Only you can see these signatures."
sharedDescription = "All users can see and use these signatures."
[sign.saved.type]
canvas = "Drawing"
image = "Upload"
text = "Text"
[sign.saved.status]
saved = "Saved"
[sign.steps]
configure = "Configure Signature"
[sign.step]
createDesc = "Choose how you want to create the signature"
place = "Place & save"
placeDesc = "Position the signature on your PDF"
[sign.type]
title = "Signature Type"
draw = "Draw"
canvas = "Canvas"
image = "Image"
text = "Text"
saved = "Saved"
[sign.image]
label = "Upload signature image"
placeholder = "Select image file"
hint = "Upload a PNG or JPG image of your signature"
removeBackground = "Remove white background (make transparent)"
processing = "Processing image..."
backgroundRemovalFailedTitle = "Background removal failed"
backgroundRemovalFailedMessage = "Could not remove the background from the image. Using original image instead."
[sign.instructions]
title = "How to add signature"
canvas = "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it."
image = "After uploading your signature image above, click anywhere on the PDF to place it."
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."
paused = "Placement paused"
resumeHint = "Resume placement to click and add your signature."
noSignature = "Create a signature above to enable placement tools."
[sign.mode]
move = "Move Signature"
place = "Place Signature"
pause = "Pause placement"
resume = "Resume placement"
[sign.results]
title = "Signature Results"
[sign.error]
failed = "An error occurred while signing the PDF."
[flatten]
title = "Flatten"
header = "Flatten PDF"
flattenOnlyForms = "Flatten only forms"
submit = "Flatten"
filenamePrefix = "flattened"
[flatten.files]
placeholder = "Select a PDF file in the main view to get started"
[flatten.steps]
settings = "Settings"
[flatten.options]
stepTitle = "Flatten Options"
title = "Flatten Options"
note = "Flattening removes interactive elements from the PDF, making them non-editable."
[flatten.options.flattenOnlyForms]
label = "Flatten only forms"
desc = "Only flatten form fields, leaving other interactive elements intact"
[flatten.renderDpi]
label = "Rendering DPI (optional, recommended 150 DPI)"
help = "Leave blank to use the system default. Higher DPI sharpens output but increases processing time and file size."
placeholder = "e.g. 150"
[flatten.results]
title = "Flatten Results"
[flatten.error]
failed = "An error occurred while flattening the PDF."
[flatten.tooltip.header]
title = "About Flattening PDFs"
[flatten.tooltip.description]
title = "What does flattening do?"
text = "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere."
bullet1 = "Text boxes become regular text (can't be edited)"
bullet2 = "Checkboxes and buttons become pictures"
bullet3 = "Great for final versions you don't want changed"
bullet4 = "Ensures consistent appearance across all devices"
[flatten.tooltip.formsOnly]
title = "What does 'Flatten only forms' mean?"
text = "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments."
bullet1 = "Forms become non-editable"
bullet2 = "Links still work when clicked"
bullet3 = "Comments and notes remain visible"
bullet4 = "Bookmarks still help you navigate"
[repair]
tags = "fix,restore,correction,recover"
title = "Repair"
header = "Repair PDFs"
submit = "Repair"
description = "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required."
filenamePrefix = "repaired"
[repair.files]
placeholder = "Select a PDF file in the main view to get started"
[repair.error]
failed = "An error occurred whilst repairing the PDF."
[repair.results]
title = "Repair Results"
[removeBlanks]
title = "Remove Blanks"
header = "Remove Blank Pages"
submit = "Remove blank pages"
[removeBlanks.settings]
title = "Settings"
[removeBlanks.threshold]
label = "Pixel Whiteness Threshold"
[removeBlanks.whitePercent]
label = "White Percentage Threshold"
unit = "%"
[removeBlanks.includeBlankPages]
label = "Include detected blank pages"
[removeBlanks.tooltip.header]
title = "Remove Blank Pages Settings"
[removeBlanks.tooltip.threshold]
title = "Pixel Whiteness Threshold"
text = "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page."
bullet1 = "0 = Pure black (most restrictive)"
bullet2 = "128 = Medium grey"
bullet3 = "255 = Pure white (least restrictive)"
[removeBlanks.tooltip.whitePercent]
title = "White Percentage Threshold"
text = "Sets the minimum percentage of white pixels required for a page to be considered blank and removed."
bullet1 = "Lower values (e.g., 80%) = More pages removed"
bullet2 = "Higher values (e.g., 95%) = Only very blank pages removed"
bullet3 = "Use higher values for documents with light backgrounds"
[removeBlanks.tooltip.includeBlankPages]
title = "Include Detected Blank Pages"
text = "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document."
bullet1 = "Useful for reviewing what was removed"
bullet2 = "Helps verify the detection accuracy"
bullet3 = "Can be disabled to reduce output file size"
[removeBlanks.error]
failed = "Failed to remove blank pages"
[removeBlanks.results]
title = "Removed Blank Pages"
[removeAnnotations]
tags = "comments,highlight,notes,markup,remove"
title = "Remove Annotations"
header = "Remove Annotations"
submit = "Remove"
[removeAnnotations.settings]
title = "Settings"
[removeAnnotations.info]
title = "About Remove Annotations"
description = "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents."
[removeAnnotations.tooltip.header]
title = "About Remove Annotations"
[removeAnnotations.tooltip.description]
title = "What it does"
[removeAnnotations.error]
failed = "An error occurred while removing annotations from the PDF."
[compare]
tags = "differentiate,contrast,changes,analysis"
title = "Compare"
header = "Compare PDFs"
clearSelected = "Clear selected"
addFilesHint = "Add PDFs in the Files step to enable selection."
noFiles = "No PDFs available yet"
pages = "Pages"
cta = "Compare"
loading = "Comparing..."
newLine = "new-line"
[compare.clear]
confirmTitle = "Clear selected PDFs?"
confirmBody = "This will close the current comparison and take you back to Active Files."
confirm = "Clear and return"
[compare.review]
title = "Comparison Result"
actionsHint = "Review the comparison, switch document roles, or export the summary."
switchOrder = "Switch order"
exportSummary = "Export summary"
[compare.base]
label = "Original document"
placeholder = "Select the original PDF"
[compare.comparison]
label = "Edited document"
placeholder = "Select the edited PDF"
[compare.selection]
originalEditedTitle = "Select Original and Edited PDFs"
[compare.original]
label = "Original PDF"
[compare.edited]
label = "Edited PDF"
[compare.swap]
confirmTitle = "Re-run comparison?"
confirmBody = "This will rerun the tool. Are you sure you want to swap the order of Original and Edited?"
confirm = "Swap and Re-run"
[compare.summary]
baseHeading = "Original document"
comparisonHeading = "Edited document"
pageLabel = "Page"
[compare.rendering]
pageNotReadyTitle = "Page not rendered yet"
pageNotReadyBody = "Some pages are still rendering. Navigation will snap once they are ready."
rendering = "rendering"
inProgress = "At least one of these PDFs are very large, scrolling won't be smooth until the rendering is complete"
pagesRendered = "pages rendered"
complete = "Page rendering complete"
[compare.dropdown]
deletionsLabel = "Deletions"
additionsLabel = "Additions"
deletions = "Deletions ({{count}})"
additions = "Additions ({{count}})"
searchPlaceholder = "Search changes..."
noResults = "No changes found"
[compare.actions]
stackVertically = "Stack vertically"
placeSideBySide = "Place side by side"
zoomOut = "Zoom out"
zoomIn = "Zoom in"
resetView = "Reset view"
unlinkScrollPan = "Unlink scroll and pan"
linkScrollPan = "Link scroll and pan"
unlinkScroll = "Unlink scroll"
linkScroll = "Link scroll"
[compare.toasts]
unlinkedTitle = "Independent scroll & pan enabled"
unlinkedBody = "Tip: Arrow Up/Down scroll both panes; panning only moves the active pane."
[compare.error]
selectRequired = "Select a original and edited document."
filesMissing = "Unable to locate the selected files. Please re-select them."
generic = "Unable to compare these files."
[compare.status]
extracting = "Extracting text..."
processing = "Analysing differences..."
complete = "Comparison ready"
[compare.longJob]
title = "Large comparison in progress"
body = "These PDFs together exceed 2,000 pages. Processing can take several minutes."
[compare.slowOperation]
title = "Still working…"
body = "This comparison is taking longer than usual. You can let it continue or cancel it."
cancel = "Cancel comparison"
[compare.complex]
message = "One or both of the provided documents are large files, accuracy of comparison may be reduced"
[compare.large.file]
message = "One or Both of the provided documents are too large to process"
[compare.no.text]
message = "One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison."
[compare.too.dissimilar]
message = "These documents appear highly dissimilar. Comparison was stopped to save time."
[compare.earlyDissimilarity]
title = "These PDFs look highly different"
body = "We're seeing very few similarities so far. You can stop the comparison if these aren't related documents."
stopButton = "Stop comparison"
[certSign]
tags = "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto"
title = "Certificate Signing"
filenamePrefix = "signed"
chooseCertificate = "Choose Certificate File"
chooseJksFile = "Choose JKS File"
chooseP12File = "Choose PKCS12 File"
choosePfxFile = "Choose PFX File"
choosePrivateKey = "Choose Private Key File"
location = "Location"
logoTitle = "Logo"
name = "Name"
noLogo = "No Logo"
pageNumber = "Page Number"
password = "Certificate Password"
passwordOptional = "Leave empty if no password"
reason = "Reason"
serverCertMessage = "Using server certificate - no files or password required"
showLogo = "Show Logo"
[certSign.signMode]
stepTitle = "Sign Mode"
[certSign.signMode.tooltip.header]
title = "About PDF Signatures"
[certSign.signMode.tooltip.overview]
title = "How signatures work"
text = "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain."
[certSign.signMode.tooltip.manual]
title = "Manual - Bring your certificate"
text = "Use your own certificate files for brand-aligned identity. Can display <b>Trusted</b> when your CA/chain is recognised."
use = "Use for: customer-facing, legal, compliance."
[certSign.signMode.tooltip.auto]
title = "Auto - Zero-setup, instant system seal"
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."
use = "Use when: you need speed and consistent internal identity across reviews and records."
[certSign.signMode.tooltip.rule]
title = "Rule of thumb"
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>."
[certSign.certTypeStep]
stepTitle = "Certificate Format"
[certSign.certFiles]
stepTitle = "Certificate Files"
[certSign.appearance]
stepTitle = "Signature Appearance"
invisible = "Invisible"
visible = "Visible"
[certSign.appearance.tooltip.header]
title = "About Signature Appearance"
[certSign.appearance.tooltip.invisible]
title = "Invisible Signatures"
text = "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance."
bullet1 = "Provides security without visual changes"
bullet2 = "Meets legal requirements for digital signing"
bullet3 = "Doesn't affect document layout or design"
[certSign.appearance.tooltip.visible]
title = "Visible Signatures"
text = "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed."
bullet1 = "Shows signer name and date on the document"
bullet2 = "Can include reason and location for signing"
bullet3 = "Choose which page to place the signature"
bullet4 = "Optional logo can be included"
[certSign.appearance.options]
title = "Signature Details"
[certSign.sign]
submit = "Sign PDF"
results = "Signed PDF"
[certSign.error]
failed = "An error occurred whilst processing signatures."
[certSign.tooltip.header]
title = "About Managing Signatures"
[certSign.tooltip.overview]
title = "What can this tool do?"
text = "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing."
bullet1 = "Check existing signatures and their validity"
bullet2 = "View detailed information about signers and certificates"
bullet3 = "Add new digital signatures to secure your documents"
bullet4 = "Multiple files supported with easy navigation"
[certSign.tooltip.validation]
title = "Checking Signatures"
text = "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing."
bullet1 = "Shows if signatures are valid or invalid"
bullet2 = "Displays signer information and signing date"
bullet3 = "Checks if the document was modified after signing"
bullet4 = "Can use custom certificates for verification"
[certSign.tooltip.signing]
title = "Adding Signatures"
text = "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only."
bullet1 = "Supports PEM, PKCS12, JKS, and server certificate formats"
bullet2 = "Option to show or hide signature on the PDF"
bullet3 = "Add reason, location, and signer name"
bullet4 = "Choose which page to place visible signatures"
bullet5 = "Use server certificate for simple 'Sign with Stirling-PDF' option"
[certSign.certType.tooltip.header]
title = "About Certificate Types"
[certSign.certType.tooltip.what]
title = "What's a certificate?"
text = "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload."
[certSign.certType.tooltip.which]
title = "Which option should I use?"
text = "Choose the format that matches your certificate file:"
bullet1 = "PKCS#12 (.p12 / .pfx) one combined file (most common)"
bullet2 = "PFX (.pfx) Microsoft's version of PKCS12"
bullet3 = "PEM separate private-key and certificate .pem files"
bullet4 = "JKS Java .jks keystore for dev / CI-CD workflows"
[certSign.certType.tooltip.convert]
title = "Key not listed?"
text = "Convert your file to a Java keystore (.jks) with keytool, then pick JKS."
[removeCertSign]
tags = "authenticate,PEM,P12,official,decrypt"
title = "Remove Certificate Signature"
header = "Remove the digital certificate from the PDF"
selectPDF = "Select a PDF file:"
submit = "Remove Signature"
description = "This tool will remove digital certificate signatures from your PDF document."
filenamePrefix = "unsigned"
[removeCertSign.files]
placeholder = "Select a PDF file in the main view to get started"
[removeCertSign.error]
failed = "An error occurred whilst removing certificate signatures."
[removeCertSign.results]
title = "Certificate Removal Results"
[pageLayout]
tags = "merge,composite,single-view,organize"
title = "Multi Page Layout"
header = "Multi Page Layout"
pagesPerSheet = "Pages per sheet:"
addBorder = "Add Borders"
submit = "Submit"
[pageLayout.desc]
2 = "Place 2 pages side-by-side on a single sheet."
3 = "Place 3 pages on a single sheet in a single row."
4 = "Place 4 pages on a single sheet (2 × 2 grid)."
9 = "Place 9 pages on a single sheet (3 × 3 grid)."
16 = "Place 16 pages on a single sheet (4 × 4 grid)."
[pageLayout.error]
failed = "An error occurred while creating the multi-page layout."
[bookletImposition]
tags = "booklet,imposition,printing,binding,folding,signature"
title = "Booklet Imposition"
header = "Booklet Imposition"
submit = "Create Booklet"
paperSizeNote = "Paper size is automatically derived from your first page."
[bookletImposition.spineLocation]
label = "Spine Location"
left = "Left (Standard)"
right = "Right (RTL)"
[bookletImposition.doubleSided]
label = "Double-sided printing"
tooltip = "Creates both front and back sides for proper booklet printing"
[bookletImposition.manualDuplex]
title = "Manual Duplex Mode"
instructions = "For printers without automatic duplex. You'll need to run this twice:"
[bookletImposition.duplexPass]
label = "Print Pass"
first = "1st Pass"
second = "2nd Pass"
firstInstructions = "Prints front sides → stack face-down → run again with 2nd Pass"
secondInstructions = "Load printed stack face-down → prints back sides"
[bookletImposition.rtlBinding]
label = "Right-to-left binding"
tooltip = "For Arabic, Hebrew, or other right-to-left languages"
[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.gutterSize]
label = "Gutter size (points)"
[bookletImposition.flipOnShortEdge]
label = "Flip on short edge (automatic duplex only)"
tooltip = "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)"
manualNote = "Not needed in manual mode - you flip the stack yourself"
[bookletImposition.advanced]
toggle = "Advanced Options"
[bookletImposition.tooltip.header]
title = "Booklet Creation Guide"
[bookletImposition.tooltip.description]
title = "What is Booklet Imposition?"
text = "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book."
[bookletImposition.tooltip.example]
title = "Example: 8-Page Booklet"
text = "Your 8-page document becomes 2 sheets:"
bullet1 = "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7"
bullet2 = "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5"
bullet3 = "When folded & stacked: Reads 1→2→3→4→5→6→7→8"
[bookletImposition.tooltip.printing]
title = "How to Print & Assemble"
text = "Follow these steps for perfect booklets:"
bullet1 = "Print double-sided with 'Flip on long edge'"
bullet2 = "Stack sheets in order, fold in half"
bullet3 = "Staple or bind along the folded spine"
bullet4 = "For short-edge printers: Enable 'Flip on short edge' option"
[bookletImposition.tooltip.manualDuplex]
title = "Manual Duplex (Single-sided Printers)"
text = "For printers without automatic duplex:"
bullet1 = "Turn OFF 'Double-sided printing'"
bullet2 = "Select '1st Pass' → Print → Stack face-down"
bullet3 = "Select '2nd Pass' → Load stack → Print backs"
bullet4 = "Fold and assemble as normal"
[bookletImposition.tooltip.advanced]
title = "Advanced Options"
text = "Fine-tune your booklet:"
bullet1 = "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages"
bullet2 = "Borders: Shows cut lines for trimming"
bullet3 = "Gutter Margin: Adds space for binding/stapling"
bullet4 = "Short-edge Flip: Only for automatic duplex printers"
[bookletImposition.error]
failed = "An error occurred while creating the booklet imposition."
[scalePages]
title = "Adjust page-scale"
header = "Adjust page-scale"
pageSize = "Size of a page of the document."
keepPageSize = "Original Size"
scaleFactor = "Zoom level (crop) of a page."
submit = "Submit"
[adjustPageScale]
tags = "resize,modify,dimension,adapt"
title = "Adjust Page Scale"
header = "Adjust Page Scale"
submit = "Adjust Page Scale"
[adjustPageScale.scaleFactor]
label = "Scale Factor"
[adjustPageScale.pageSize]
label = "Target Page Size"
keep = "Keep Original Size"
letter = "Letter"
legal = "Legal"
[adjustPageScale.error]
failed = "An error occurred while adjusting the page scale."
[adjustPageScale.tooltip.header]
title = "Page Scale Settings Overview"
[adjustPageScale.tooltip.description]
title = "Description"
text = "Adjust the size of PDF content and change the page dimensions."
[adjustPageScale.tooltip.scaleFactor]
title = "Scale Factor"
text = "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped."
bullet1 = "1.0 = Original size"
bullet2 = "0.5 = Half size (50% smaller)"
bullet3 = "2.0 = Double size (200% larger, may crop)"
[adjustPageScale.tooltip.pageSize]
title = "Target Page Size"
text = "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes."
[add-page-numbers]
tags = "paginate,label,organize,index"
[auto-rename]
tags = "auto-detect,header-based,organize,relabel"
title = "Auto Rename"
header = "Auto Rename PDF"
description = "Automatically finds the title from your PDF content and uses it as the filename."
submit = "Auto Rename"
[auto-rename.files]
placeholder = "Select a PDF file in the main view to get started"
[auto-rename.error]
failed = "An error occurred whilst auto-renaming the PDF."
[auto-rename.results]
title = "Auto-Rename Results"
[auto-rename.tooltip.header]
title = "How Auto-Rename Works"
[auto-rename.tooltip.description]
title = "What it does"
[auto-rename.tooltip.howItWorks]
title = "Smart Renaming"
text = "Automatically finds the title from your PDF content and uses it as the filename."
bullet1 = "Looks for text that appears to be a title or heading"
bullet2 = "Creates a clean, valid filename from the detected title"
bullet3 = "Keeps the original name if no suitable title is found"
[auto-rename.settings]
title = "About"
[adjust-contrast]
tags = "color-correction,tune,modify,enhance,colour-correction"
[crop]
title = "Crop"
header = "Crop PDF"
submit = "Apply Crop"
noFileSelected = "Select a PDF file to begin cropping"
reset = "Reset to full PDF"
autoCrop = "Auto-crop whitespace"
[crop.preview]
title = "Crop Area Selection"
[crop.coordinates]
title = "Position and Size"
[crop.coordinates.x]
label = "X Position"
desc = "Left edge (points)"
[crop.coordinates.y]
label = "Y Position"
desc = "Bottom edge (points)"
[crop.coordinates.width]
label = "Width"
desc = "Crop width (points)"
[crop.coordinates.height]
label = "Height"
desc = "Crop height (points)"
[crop.error]
invalidArea = "Crop area extends beyond PDF boundaries"
failed = "Failed to crop PDF"
[crop.steps]
selectArea = "Select Crop Area"
[crop.tooltip]
title = "How to Crop PDFs"
description = "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail."
drag = "Drag the overlay to move the crop area"
resize = "Drag the corner and edge handles to resize"
precision = "Use coordinate inputs for precise positioning"
[crop.results]
title = "Crop Results"
[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."
[autoSplitPDF]
tags = "QR-based,separate,scan-segment,organize"
title = "Auto Split PDF"
header = "Auto Split PDF"
description = "Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed."
formPrompt = "Submit PDF containing Stirling-PDF Page dividers:"
duplexMode = "Duplex Mode (Front and back scanning)"
dividerDownload2 = "Download 'Auto Splitter Divider (with instructions).pdf'"
submit = "Submit"
[autoSplitPDF.selectText]
1 = "Print out some divider sheets from below (Black and white is fine)."
2 = "Scan all your documents at once by inserting the divider sheet between them."
3 = "Upload the single large scanned PDF file and let Stirling PDF handle the rest."
4 = "Divider pages are automatically detected and removed, guaranteeing a neat final document."
[sanitizePdf]
tags = "clean,secure,safe,remove-threats"
[URLToPDF]
tags = "web-capture,save-page,web-to-doc,archive"
title = "URL To PDF"
header = "URL To PDF"
submit = "Convert"
credit = "Uses WeasyPrint"
[HTMLToPDF]
tags = "markup,web-content,transformation,convert"
title = "HTML To PDF"
header = "HTML To PDF"
help = "Accepts HTML files and ZIPs containing html/css/images etc required"
submit = "Convert"
credit = "Uses WeasyPrint"
zoom = "Zoom level for displaying the website."
pageWidth = "Width of the page in centimeters. (Blank to default)"
pageHeight = "Height of the page in centimeters. (Blank to default)"
marginTop = "Top margin of the page in millimeters. (Blank to default)"
marginBottom = "Bottom margin of the page in millimeters. (Blank to default)"
marginLeft = "Left margin of the page in millimeters. (Blank to default)"
marginRight = "Right margin of the page in millimeters. (Blank to default)"
printBackground = "Render the background of websites."
defaultHeader = "Enable Default Header (Name and page number)"
cssMediaType = "Change the CSS media type of the page."
none = "None"
print = "Print"
screen = "Screen"
[MarkdownToPDF]
tags = "markup,web-content,transformation,convert,md"
title = "Markdown To PDF"
header = "Markdown To PDF"
submit = "Convert"
help = "Work in progress"
credit = "Uses WeasyPrint"
[PDFToMarkdown]
tags = "markup,web-content,transformation,convert,md"
title = "PDF To Markdown"
header = "PDF To Markdown"
submit = "Convert"
[getPdfInfo]
tags = "infomation,data,stats,statistics"
title = "Get Info on PDF"
header = "Get Info on PDF"
submit = "Get Info"
downloadJson = "Download JSON"
processing = "Extracting information..."
results = "Results"
noResults = "Run the tool to generate a report."
downloads = "Downloads"
noneDetected = "None detected"
indexTitle = "Index"
[getPdfInfo.report]
entryLabel = "Full information summary"
shortTitle = "PDF Information"
[getPdfInfo.sections]
metadata = "Metadata"
formFields = "Form Fields"
basicInfo = "Basic Info"
documentInfo = "Document Info"
compliance = "Compliance"
encryption = "Encryption"
permissions = "Permissions"
other = "Other"
perPageInfo = "Per Page Info"
tableOfContents = "Table of Contents"
[getPdfInfo.compliance]
notDetected = "Not Detected"
passed = "Passed"
failed = "Failed"
compliant = "Compliant"
nonCompliant = "Non-Compliant"
none = "No standards detected"
passedCount = "passed"
failedCount = "failed"
noVerification = "No Verification Performed"
noVerificationDesc = "PDF standards compliance was not verified for this document."
[getPdfInfo.other]
attachments = "Attachments"
embeddedFiles = "Embedded Files"
javaScript = "JavaScript"
layers = "Layers"
structureTree = "StructureTree"
xmp = "XMPMetadata"
[getPdfInfo.perPage]
size = "Size"
annotations = "Annotations"
images = "Images"
links = "Links"
fonts = "Fonts"
xobjects = "XObject Counts"
multimedia = "Multimedia"
[getPdfInfo.summary]
pages = "Pages"
fileSize = "File Size"
pdfVersion = "PDF Version"
language = "Language"
title = "PDF Summary"
author = "Author"
created = "Created"
modified = "Modified"
permsAll = "All Permissions Allowed"
permsRestricted = "{{count}} restrictions"
permsMixed = "Some permissions restricted"
hasCompliance = "Has compliance standards"
noCompliance = "No Compliance Standards"
compliancePassed = "{{standards}} compliant"
complianceChecked = "Standards verified ({{failed}} failed)"
basic = "Basic Information"
documentInfo = "Document Information"
securityTitle = "Security Status"
technical = "Technical"
overviewTitle = "PDF Overview"
[getPdfInfo.summary.security]
encrypted = "Encrypted PDF - Password protection present"
unencrypted = "Unencrypted PDF - No password protection"
[getPdfInfo.summary.tech]
images = "Images"
fonts = "Fonts"
formFields = "Form Fields"
embeddedFiles = "Embedded Files"
javaScript = "JavaScript"
layers = "Layers"
bookmarks = "Bookmarks"
multimedia = "Multimedia"
[getPdfInfo.summary.overview]
untitled = "an untitled document"
unknown = "Unknown Author"
text = "This is a {{pages}}-page PDF titled {{title}} created by {{author}} (PDF version {{version}})."
[getPdfInfo.error]
partial = "Some files could not be processed."
unexpected = "Unexpected error during extraction."
[getPdfInfo.status]
complete = "Extraction complete"
[extractPage]
tags = "extract"
[PdfToSinglePage]
tags = "single page"
[showJS]
tags = "JS"
title = "Show Javascript"
header = "Show Javascript"
downloadJS = "Download Javascript"
submit = "Show"
results = "Result"
processing = "Extracting JavaScript..."
done = "JavaScript extracted"
singleFileWarning = "This tool only supports one file at a time. Please select a single file."
[showJS.view]
title = "Extracted JavaScript"
[redact]
tags = "Redact,Hide,black out,black,marker,hidden,auto redact,manual redact"
title = "Redact"
submit = "Redact"
[redact.error]
failed = "An error occurred while redacting the PDF."
[redact.modeSelector]
title = "Redaction Method"
mode = "Mode"
automatic = "Automatic"
automaticDesc = "Redact text based on search terms"
automaticDisabledTooltip = "Select files in the file manager to redact multiple files at once"
manual = "Manual"
manualDesc = "Click and drag to redact specific areas"
manualComingSoon = "Manual redaction coming soon"
[redact.auto]
header = "Auto Redact"
colorLabel = "Box Colour"
useRegexLabel = "Use Regex"
wholeWordSearchLabel = "Whole Word Search"
customPaddingLabel = "Custom Extra Padding"
convertPDFToImageLabel = "Convert PDF to PDF-Image"
[redact.auto.settings]
title = "Redaction Settings"
advancedTitle = "Advanced"
[redact.auto.wordsToRedact]
title = "Words to Redact"
placeholder = "Enter a word"
add = "Add"
examples = "Examples: Confidential, Top-Secret"
[redact.tooltip.mode.header]
title = "Redaction Method"
[redact.tooltip.mode.automatic]
title = "Automatic Redaction"
text = "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers."
[redact.tooltip.mode.manual]
title = "Manual Redaction"
text = "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)"
[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.header]
title = "Words to Redact"
[redact.tooltip.words.description]
title = "Text Matching"
text = "Enter words or phrases to find and redact in your document. Each word will be searched for separately."
[redact.tooltip.words.examples]
title = "Common Examples"
text = "Typical words to redact include: bank details, email addresses, or specific names."
[redact.tooltip.advanced.header]
title = "Advanced Redaction Settings"
[redact.tooltip.advanced.color]
title = "Box Colour & Padding"
text = "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text."
[redact.tooltip.advanced.regex]
title = "Use Regex"
text = "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns."
bullet1 = "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format"
bullet2 = "Use with caution - test thoroughly"
[redact.tooltip.advanced.wholeWord]
title = "Whole Word Search"
text = "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled."
[redact.tooltip.advanced.convert]
title = "Convert to PDF-Image"
text = "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable."
[redact.tooltip.manual.header]
title = "Manual Redaction Controls"
[redact.tooltip.manual.markText]
title = "Mark Text Tool"
text = "Select text directly on the PDF to mark it for redaction. Click and drag to highlight specific text that you want to redact."
[redact.tooltip.manual.markArea]
title = "Mark Area Tool"
text = "Draw rectangular areas on the PDF to mark regions for redaction. Useful for redacting images, signatures, or irregular shapes."
[redact.tooltip.manual.apply]
title = "Apply Redactions"
text = "After marking content, click 'Apply' to permanently redact all marked areas. The pending count shows how many redactions are ready to be applied."
bullet1 = "Mark as many areas as needed before applying"
bullet2 = "All pending redactions are applied at once"
bullet3 = "Redactions cannot be undone after applying"
[redact.manual]
title = "Redaction Tools"
instructions = "Select text or draw areas on the PDF to mark content for redaction."
markText = "Mark Text"
markArea = "Mark Area"
pendingLabel = "Pending:"
applyWarning = "⚠️ Permanent application, cannot be undone and the data underneath will be deleted"
apply = "Apply"
noMarks = "No redaction marks. Use the tools above to mark content for redaction."
header = "Manual Redaction"
controlsTitle = "Manual Redaction Controls"
textBasedRedaction = "Text-based Redaction"
pageBasedRedaction = "Page-based Redaction"
convertPDFToImageLabel = "Convert PDF to PDF-Image (Used to remove text behind the box)"
export = "Export"
upload = "Upload"
boxRedaction = "Box draw redaction"
zoom = "Zoom"
zoomIn = "Zoom in"
zoomOut = "Zoom out"
nextPage = "Next Page"
previousPage = "Previous Page"
toggleSidebar = "Toggle Sidebar"
showThumbnails = "Show Thumbnails"
showDocumentOutline = "Show Document Outline (double-click to expand/collapse all items)"
showAttachments = "Show Attachments"
showLayers = "Show Layers (double-click to reset all layers to the default state)"
colourPicker = "Colour Picker"
findCurrentOutlineItem = "Find current outline item"
applyChanges = "Apply Changes"
[redact.manual.pageRedactionNumbers]
title = "Pages"
placeholder = "(e.g. 1,2,8 or 4,7,12-16 or 2n-1)"
[redact.manual.redactionColor]
title = "Redaction Colour"
[tableExtraxt]
tags = "CSV,Table Extraction,extract,convert"
[autoSizeSplitPDF]
tags = "pdf,split,document,organization"
[overlay-pdfs]
tags = "Overlay"
header = "Overlay PDF Files"
title = "Overlay PDFs"
desc = "Overlay one PDF on top of another"
submit = "Submit"
[overlay-pdfs.baseFile]
label = "Select Base PDF File"
[overlay-pdfs.overlayFiles]
label = "Select Overlay PDF Files"
placeholder = "Choose PDF(s)..."
addMore = "Add more PDFs..."
[overlay-pdfs.mode]
label = "Select Overlay Mode"
sequential = "Sequential Overlay"
interleaved = "Interleaved Overlay"
fixedRepeat = "Fixed Repeat Overlay"
[overlay-pdfs.counts]
label = "Overlay Counts (for Fixed Repeat Mode)"
placeholder = "Enter comma-separated counts (e.g., 2,3,1)"
item = "Count for file"
noFiles = "Add overlay files to configure counts"
[overlay-pdfs.position]
label = "Select Overlay Position"
foreground = "Foreground"
background = "Background"
[overlay-pdfs.settings]
title = "Settings"
[overlay-pdfs.results]
title = "Overlay Results"
[overlay-pdfs.tooltip.header]
title = "Overlay PDFs Overview"
[overlay-pdfs.tooltip.description]
title = "Description"
text = "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background."
[overlay-pdfs.tooltip.mode]
title = "Overlay Mode"
text = "Choose how to distribute overlay pages across the base PDF pages."
sequential = "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next."
interleaved = "Interleaved Overlay: Take one page from each overlay in turn."
fixedRepeat = "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers."
[overlay-pdfs.tooltip.position]
title = "Overlay Position"
text = "Foreground places the overlay on top of the page. Background places it behind."
[overlay-pdfs.tooltip.overlayFiles]
title = "Overlay Files"
text = "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes."
[overlay-pdfs.tooltip.counts]
title = "Counts (Fixed Repeat only)"
text = "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat."
[overlay-pdfs.error]
failed = "An error occurred while overlaying PDFs."
[split-by-sections]
tags = "Section Split, Divide, Customize,Customise"
title = "Split PDF by Sections"
header = "Split PDF into Sections"
submit = "Split PDF"
merge = "Merge Into One PDF"
[split-by-sections.horizontal]
label = "Horizontal Divisions"
placeholder = "Enter number of horizontal divisions"
[split-by-sections.vertical]
label = "Vertical Divisions"
placeholder = "Enter number of vertical divisions"
[split-by-sections.splitMode]
label = "Split Mode"
description = "Choose how to split the pages"
splitAll = "Split all pages"
splitAllExceptFirst = "Split all except first"
splitAllExceptLast = "Split all except last"
splitAllExceptFirstAndLast = "Split all except first and last"
custom = "Custom pages"
[split-by-sections.customPages]
label = "Custom Page Numbers"
placeholder = "e.g. 2,4,6"
[AddStampRequest]
tags = "Stamp, Add image, center image, Watermark, PDF, Embed, Customize,Customise"
header = "Stamp PDF"
title = "Stamp PDF"
stampSetup = "Stamp Setup"
stampType = "Stamp Type"
stampText = "Stamp Text"
stampImage = "Stamp Image"
alphabet = "Alphabet"
fontSize = "Font/Image Size"
rotation = "Rotation"
opacity = "Opacity"
position = "Position"
overrideX = "Override X Coordinate"
overrideY = "Override Y Coordinate"
customMargin = "Custom Margin"
customColor = "Custom Text Colour"
submit = "Submit"
noStampSelected = "No stamp selected. Return to Step 1."
customPosition = "Drag the stamp to the desired location in the preview window."
imageSize = "Image Size"
margin = "Margin"
positionAndFormatting = "Position & Formatting"
quickPosition = "Select a position on the page to place the stamp."
preview = "Preview:"
useTemplate = "Use Template"
selectTemplate = "Select a template..."
stampTextDescription = "Use dynamic variables below. Use @@ for literal @. Use \\n for new lines."
dynamicVariables = "Dynamic Variables"
clickToExpand = "Click to expand"
variablesHelp = "Click on any variable to insert it into your stamp text. Use @@ for literal @."
dateTimeVars = "Date & Time"
dateDesc = "Current date"
timeDesc = "Current time"
datetimeDesc = "Date and time combined"
customDateDesc = "Custom format"
yearMonthDayDesc = "Individual date parts"
pageVars = "Page Information"
pageNumberDesc = "Current page number"
totalPagesDesc = "Total number of pages"
fileVars = "File Information"
filenameDesc = "Filename without extension"
filenameFullDesc = "Filename with extension"
metadataVars = "Document Metadata"
metadataDesc = "From PDF document properties"
otherVars = "Other"
uuidDesc = "Short unique identifier (8 chars)"
examples = "Examples"
multiLine = "multi-line"
[AddStampRequest.template]
pageNumberFooter = "Page Number Footer"
dateHeader = "Date Header"
europeanDate = "European Date"
timestamp = "Timestamp"
draftWatermark = "Draft Watermark"
custom = "Custom"
[AddStampRequest.error]
failed = "An error occurred while adding stamp to the PDF."
[AddStampRequest.results]
title = "Stamp Results"
[removeImagePdf]
tags = "Remove Image,Page operations,Back end,server side"
[splitPdfByChapters]
tags = "split,chapters,bookmarks,organize"
[validateSignature]
tags = "signature,verify,validate,pdf,certificate,digital signature,Validate Signature,Validate certificate"
title = "Validate PDF Signatures"
header = "Validate Digital Signatures"
selectPDF = "Select signed PDF file"
submit = "Validate Signatures"
results = "Validation Results"
signer = "Signer"
date = "Date"
reason = "Reason"
location = "Location"
noSignatures = "No digital signatures found in this document"
selectCustomCert = "Custom Certificate File X.509 (Optional)"
downloadCsv = "Download CSV"
downloadJson = "Download JSON"
downloadPdf = "Download PDF Report"
finalizing = "Preparing downloads..."
noResults = "Run the validation to generate a report."
noSignaturesShort = "No signatures"
processing = "Validating signatures..."
signatureDate = "Signature Date"
totalSignatures = "Total Signatures"
[validateSignature.status]
_value = "Status"
valid = "Valid"
invalid = "Invalid"
complete = "Validation complete"
[validateSignature.chain]
invalid = "Certificate chain validation failed - cannot verify signer's identity"
[validateSignature.trust]
invalid = "Certificate not in trust store - source cannot be verified"
[validateSignature.cert]
expired = "Certificate has expired"
revoked = "Certificate has been revoked"
info = "Certificate Details"
issuer = "Issuer"
subject = "Subject"
serialNumber = "Serial Number"
validFrom = "Valid From"
validUntil = "Valid Until"
algorithm = "Algorithm"
keySize = "Key Size"
version = "Version"
keyUsage = "Key Usage"
selfSigned = "Self-Signed"
bits = "bits"
details = "Certificate Details"
[validateSignature.signature]
info = "Signature Information"
_value = "Signature"
mathValid = "Signature is mathematically valid BUT:"
[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"
signatureInvalid = "Signature cryptographic check failed"
trustInvalid = "Certificate not trusted"
[validateSignature.report]
continued = "Continued"
downloads = "Downloads"
entryLabel = "Signature Summary"
filesEvaluated = "{{count}} files evaluated"
footer = "Validated via Stirling PDF"
generatedAt = "Generated"
noPdf = "PDF report will be available after a successful validation."
page = "Page"
shortTitle = "Signature Summary"
signatureCountLabel = "{{count}} signatures"
signaturesFound = "{{count}} signatures detected"
signaturesValid = "{{count}} fully valid"
title = "Signature Validation Report"
[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"
[replaceColor]
tags = "Replace Colour,Page operations,Back end,server side"
[replaceColor.labels]
settings = "Settings"
colourOperation = "Colour operation"
[replaceColor.options]
highContrast = "High contrast"
invertAll = "Invert all colours"
custom = "Custom"
cmyk = "Convert to CMYK"
[replaceColor.tooltip.header]
title = "Replace & Invert Colour Settings Overview"
[replaceColor.tooltip.description]
title = "Description"
text = "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes."
[replaceColor.tooltip.highContrast]
title = "High Contrast"
text = "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance."
bullet1 = "White text on black background - Classic dark mode"
bullet2 = "Black text on white background - Standard high contrast"
bullet3 = "Yellow text on black background - High visibility option"
bullet4 = "Green text on black background - Alternative high contrast"
[replaceColor.tooltip.invertAll]
title = "Invert All Colours"
text = "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions."
[replaceColor.tooltip.custom]
title = "Custom Colours"
text = "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements."
bullet1 = "Text colour - Choose the colour for text elements"
bullet2 = "Background colour - Set the background colour for the document"
[replaceColor.tooltip.cmyk]
title = "Convert to CMYK"
text = "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers."
[replaceColor.error]
failed = "An error occurred while processing the colour replacement."
[login]
title = "Sign in"
header = "Sign in"
signin = "Sign in"
signInWith = "Sign in with"
signInAnonymously = "Sign Up as a Guest"
rememberme = "Remember me"
invalid = "Invalid username or password."
locked = "Your account has been locked."
sessionExpired = "Your session has expired. Please sign in again."
signinTitle = "Please sign in"
ssoSignIn = "Login via Single Sign-on"
oAuth2AutoCreateDisabled = "OAUTH2 Auto-Create User Disabled"
oAuth2AdminBlockedUser = "Registration or logging in of non-registered users is currently blocked. Please contact the administrator."
oAuth2RequiresLicense = "OAuth/SSO login requires a Server or Enterprise license. Please contact the administrator to upgrade your plan."
saml2RequiresLicense = "SAML login requires an Enterprise license. Please contact the administrator to upgrade your plan."
maxUsersReached = "Maximum number of users reached for your current license. Please contact the administrator to upgrade your plan or add more seats."
oauth2RequestNotFound = "Authorization request not found"
oauth2InvalidUserInfoResponse = "Invalid User Info Response"
oauth2invalidRequest = "Invalid Request"
oauth2AccessDenied = "Access Denied"
oauth2InvalidTokenResponse = "Invalid Token Response"
oauth2InvalidIdToken = "Invalid Id Token"
relyingPartyRegistrationNotFound = "No relying party registration found"
userIsDisabled = "User is deactivated, login is currently blocked with this username. Please contact the administrator."
alreadyLoggedIn = "You are already logged in to"
alreadyLoggedIn2 = "devices. Please log out of the devices and try again."
toManySessions = "You have too many active sessions"
logoutMessage = "You have been logged out."
youAreLoggedIn = "You are logged in!"
email = "Email"
password = "Password"
enterEmail = "Enter your email"
enterPassword = "Enter your password"
loggingIn = "Logging In..."
username = "Username"
enterUsername = "Enter username"
useEmailInstead = "Login with email"
forgotPassword = "Forgot your password?"
logIn = "Log In"
signingIn = "Signing in..."
login = "Login"
or = "Or"
useMagicLink = "Use magic link instead"
enterEmailForMagicLink = "Enter your email for magic link"
sending = "Sending…"
sendMagicLink = "Send Magic Link"
cancel = "Cancel"
dontHaveAccount = "Don't have an account? Sign up"
home = "Home"
debug = "Debug"
signOut = "Sign Out"
pleaseEnterBoth = "Please enter both email and password"
pleaseEnterEmail = "Please enter your email address"
magicLinkSent = "Magic link sent to {{email}}! Check your email and click the link to sign in."
passwordResetSent = "Password reset link sent to {{email}}! Check your email and follow the instructions."
failedToSignIn = "Failed to sign in with {{provider}}: {{message}}"
unexpectedError = "Unexpected error: {{message}}"
accountCreatedSuccess = "Account created successfully! You can now sign in."
passwordChangedSuccess = "Password changed successfully! Please sign in with your new password."
credentialsUpdated = "Your credentials have been updated. Please sign in again."
defaultCredentials = "Default Login Credentials"
changePasswordWarning = "Please change your password after logging in for the first time"
mfaRequired = "Two-factor code required"
mfaCode = "Authentication Code"
enterMfaCode = "Enter 6-digit code"
mfaPromptTitle = "Two-factor authentication"
mfaPromptBody = "Enter the authentication code from your authenticator app to continue."
verifyingMfa = "Verifying..."
verifyMfa = "Verify code"
[login.slides.overview]
alt = "Stirling PDF overview"
title = "Your one-stop-shop for all your PDF needs."
subtitle = "A privacy-first cloud suite for PDFs that lets you convert, sign, redact, and manage documents, along with 50+ other powerful tools."
[login.slides.edit]
alt = "Edit PDFs"
title = "Edit PDFs to display/secure the information you want"
subtitle = "With over a dozen tools to help you redact, sign, read and manipulate PDFs, you will be sure to find what you are looking for."
[login.slides.secure]
alt = "Secure PDFs"
title = "Protect sensitive information in your PDFs"
subtitle = "Add passwords, redact content, and manage certificates with ease."
[signup]
title = "Create an account"
subtitle = "Join Stirling PDF to get started"
name = "Name"
email = "Email"
password = "Password"
confirmPassword = "Confirm password"
enterName = "Enter your name"
enterEmail = "Enter your email"
enterPassword = "Enter your password"
confirmPasswordPlaceholder = "Confirm password"
or = "or"
creatingAccount = "Creating Account..."
signUp = "Sign Up"
alreadyHaveAccount = "Already have an account? Sign in"
pleaseFillAllFields = "Please fill in all fields"
passwordsDoNotMatch = "Passwords do not match"
passwordTooShort = "Password must be at least 6 characters long"
invalidEmail = "Please enter a valid email address"
checkEmailConfirmation = "Check your email for a confirmation link to complete your registration."
accountCreatedSuccessfully = "Account created successfully! You can now sign in."
unexpectedError = "Unexpected error: {{message}}"
useEmailInstead = "Use Email Instead"
nameRequired = "Name is required"
emailRequired = "Email is required"
passwordRequired = "Password is required"
confirmPasswordRequired = "Please confirm your password"
[pdfToSinglePage]
title = "PDF To Single Page"
header = "PDF To Single Page"
submit = "Convert To Single Page"
description = "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights."
filenamePrefix = "single_page"
[pdfToSinglePage.files]
placeholder = "Select a PDF file in the main view to get started"
[pdfToSinglePage.error]
failed = "An error occurred whilst converting to single page."
[pdfToSinglePage.results]
title = "Single Page Results"
[pageExtracter]
title = "Extract Pages"
header = "Extract Pages"
submit = "Extract"
placeholder = "(e.g. 1,2,8 or 4,7,12-16 or 2n-1)"
[sanitizePDF]
title = "Sanitise PDF"
header = "Sanitise a PDF file"
submit = "Sanitize PDF"
[sanitizePDF.selectText]
1 = "Remove JavaScript actions"
2 = "Remove embedded files"
3 = "Remove XMP metadata"
4 = "Remove links"
5 = "Remove fonts"
6 = "Remove Document Info Metadata"
[adjustContrast]
title = "Adjust Colors/Contrast"
header = "Adjust Colors/Contrast"
basic = "Basic Adjustments"
contrast = "Contrast:"
brightness = "Brightness:"
saturation = "Saturation:"
download = "Download"
adjustColors = "Adjust Colors"
blue = "Blue"
confirm = "Confirm"
green = "Green"
noPreview = "Select a PDF to preview"
red = "Red"
[adjustContrast.error]
failed = "Failed to adjust colors/contrast"
[adjustContrast.results]
title = "Adjusted PDF"
[compress]
title = "Compress"
desc = "Compress PDFs to reduce their file size."
header = "Compress PDF"
credit = "This service uses qpdf for PDF Compress/Optimisation."
submit = "Compress"
[compress.method]
title = "Compression Method"
quality = "Quality"
filesize = "File Size"
[compress.grayscale]
label = "Apply Grayscale for Compression"
[compress.linearize]
label = "Linearize PDF for fast web viewing"
[compress.lineArt]
label = "Convert images to line art"
description = "Uses ImageMagick to reduce pages to high-contrast black and white for maximum size reduction."
unavailable = "ImageMagick is not installed or enabled on this server"
detailLevel = "Detail level"
edgeEmphasis = "Edge emphasis"
edgeLow = "Gentle"
edgeMedium = "Balanced"
edgeHigh = "Strong"
[compress.tooltip.header]
title = "Compress Settings Overview"
[compress.tooltip.description]
title = "Description"
text = "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually."
[compress.tooltip.qualityAdjustment]
title = "Quality Adjustment"
text = "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity."
bullet1 = "Lower values preserve quality"
bullet2 = "Higher values reduce file size"
[compress.tooltip.grayscale]
title = "Grayscale"
text = "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents."
[compress.tooltip.lineArt]
title = "Line Art"
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."
[compress.error]
failed = "An error occurred while compressing the PDF."
[compress.selectText]
2 = "Optimisation level:"
4 = "Auto mode - Auto adjusts quality to get PDF to exact size"
5 = "Expected PDF Size (e.g. 25MB, 10.8MB, 25KB)"
[compress.selectText.1]
_value = "Compression Settings"
1 = "1-3 PDF compression,</br> 4-6 lite image compression,</br> 7-9 intense image compression Will dramatically reduce image quality"
[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"
[decrypt]
passwordPrompt = "This file is password-protected. Please enter the password:"
cancelled = "Operation cancelled for PDF: {0}"
noPassword = "No password provided for encrypted PDF: {0}"
invalidPassword = "Please try again with the correct password."
invalidPasswordHeader = "Incorrect password or unsupported encryption for PDF: {0}"
unexpectedError = "There was an error processing the file. Please try again."
serverError = "Server error while decrypting: {0}"
success = "File decrypted successfully."
[multiTool-advert]
message = "This feature is also available in our <a href=\"{0}\">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!"
[pageRemover]
title = "Page Remover"
header = "PDF Page remover"
pagesToDelete = "Pages to delete (Enter a comma-separated list of page numbers) :"
submit = "Delete Pages"
placeholder = "(e.g. 1,2,6 or 1-10,15-30)"
[imageToPDF]
title = "Image to PDF"
header = "Image to PDF"
submit = "Convert"
selectLabel = "Image Fit Options"
fillPage = "Fill Page"
fitDocumentToImage = "Fit Page to Image"
maintainAspectRatio = "Maintain Aspect Ratios"
[imageToPDF.selectText]
2 = "Auto rotate PDF"
3 = "Multi file logic (Only enabled if working with multiple images)"
4 = "Merge into single PDF"
5 = "Convert to separate PDFs"
[PDFToCSV]
title = "PDF to CSV"
header = "PDF to CSV"
prompt = "Choose page to extract table"
submit = "Extract"
[split-by-size-or-count]
title = "Split PDF by Size or Count"
header = "Split PDF by Size or Count"
submit = "Submit"
[split-by-size-or-count.type]
label = "Select Split Type"
size = "By Size"
pageCount = "By Page Count"
docCount = "By Document Count"
[split-by-size-or-count.value]
label = "Enter Value"
placeholder = "Enter size (e.g., 2MB or 3KB) or count (e.g., 5)"
[printFile]
title = "Print File"
header = "Print File to Printer"
submit = "Print"
[printFile.selectText]
1 = "Select File to Print"
2 = "Enter Printer Name"
[licenses]
nav = "Licences"
title = "3rd Party Licences"
header = "3rd Party Licences"
module = "Module"
version = "Version"
license = "Licence"
[survey]
nav = "Survey"
title = "Stirling-PDF Survey"
description = "Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF!"
changes = "Stirling-PDF has changed since the last survey! To find out more please check our blog post here:"
changes2 = "With these changes we are getting paid business support and funding"
please = "Please consider taking our survey to have input on the future of Stirling-PDF!"
disabled = "(Survey popup will be disabled in following updates but available at foot of page)"
button = "Take Survey"
dontShowAgain = "Don't show again"
[survey.meeting]
1 = "If you're using Stirling PDF at work, we'd love to speak to you. We're offering technical support sessions in exchange for a 15 minute user discovery session."
2 = "This is a chance to:"
3 = "Get help with deployment, integrations, or troubleshooting"
4 = "Provide direct feedback on performance, edge cases, and feature gaps"
5 = "Help us refine Stirling PDF for real-world enterprise use"
6 = "If you're interested, you can book time with our team directly. (English speaking only)"
7 = "Looking forward to digging into your use cases and making Stirling PDF even better!"
notInterested = "Not a business and/or interested in a meeting?"
button = "Book meeting"
[removeImage]
title = "Remove image"
header = "Remove image"
removeImage = "Remove image"
submit = "Remove image"
[removeImage.error]
failed = "Failed to remove images from the PDF."
[removeImage.results]
title = "Remove Images Results"
[splitByChapters]
title = "Split PDF by Chapters"
header = "Split PDF by Chapters"
bookmarkLevel = "Bookmark Level"
includeMetadata = "Include Metadata"
allowDuplicates = "Allow Duplicates"
submit = "Split PDF"
[splitByChapters.desc]
1 = "This tool splits a PDF file into multiple PDFs based on its chapter structure."
2 = "Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.)."
3 = "Include Metadata: If checked, the original PDF's metadata will be included in each split PDF."
4 = "Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs."
[fileChooser]
click = "Click"
or = "or"
dragAndDrop = "Drag & Drop"
dragAndDropPDF = "Drag & Drop PDF file"
dragAndDropImage = "Drag & Drop Image file"
hoveredDragAndDrop = "Drag & Drop file(s) here"
extractPDF = "Extracting..."
[releases]
footer = "Releases"
title = "Release Notes"
header = "Release Notes"
note = "Release notes are only available in English"
[releases.current]
version = "Current Release"
[swagger]
title = "API Documentation"
header = "API Documentation"
desc = "View and test the Stirling PDF API endpoints"
tags = "api,documentation,swagger,endpoints,development"
[cookieBanner.popUp]
title = "How we use Cookies"
acceptAllBtn = "Okay"
acceptNecessaryBtn = "No Thanks"
showPreferencesBtn = "Manage preferences"
[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]
title = "Consent Preferences Center"
acceptAllBtn = "Accept all"
acceptNecessaryBtn = "Reject all"
savePreferencesBtn = "Save preferences"
closeIconLabel = "Close modal"
serviceCounterLabel = "Service|Services"
subtitle = "Cookie Usage"
[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.preferencesModal.analytics]
title = "Analytics"
description = "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with."
[cookieBanner.services]
posthog = "PostHog Analytics"
scarf = "Scarf Pixel"
[removeMetadata]
submit = "Remove Metadata"
[sidebar]
toggle = "Toggle Sidebar"
[theme]
toggle = "Toggle Theme"
[view]
viewer = "Viewer"
pageEditor = "Page Editor"
fileManager = "File Manager"
[pageEditor]
title = "Page Editor"
save = "Save Changes"
noPdfLoaded = "No PDF loaded. Please upload a PDF to edit."
rotatedLeft = "Rotated left:"
rotatedRight = "Rotated right:"
deleted = "Deleted:"
movedLeft = "Moved left:"
movedRight = "Moved right:"
splitAt = "Split at:"
insertedPageBreak = "Inserted page break at:"
addFileNotImplemented = "Add file not implemented in demo"
closePdf = "Close PDF"
reset = "Reset Changes"
zoomIn = "Zoom In"
zoomOut = "Zoom Out"
fitToWidth = "Fit to Width"
actualSize = "Actual Size"
[viewer]
cannotPreviewFile = "Cannot Preview File"
dualPageView = "Dual Page View"
firstPage = "First Page"
lastPage = "Last Page"
nextPage = "Next Page"
onlyPdfSupported = "The viewer only supports PDF files. This file appears to be a different format."
previousPage = "Previous Page"
singlePageView = "Single Page View"
unknownFile = "Unknown file"
zoomIn = "Zoom In"
zoomOut = "Zoom Out"
[rightRail]
closeSelected = "Close Selected Files"
selectAll = "Select All"
deselectAll = "Deselect All"
selectByNumber = "Select by Page Numbers"
deleteSelected = "Delete Selected Pages"
closePdf = "Close PDF"
exportAll = "Export PDF"
downloadSelected = "Download Selected Files"
annotations = "Annotations"
exportSelected = "Export Selected Pages"
saveChanges = "Save Changes"
toggleTheme = "Toggle Theme"
language = "Language"
toggleAnnotations = "Toggle Annotations Visibility"
search = "Search PDF"
panMode = "Pan Mode"
applyRedactionsFirst = "Apply redactions first"
rotateLeft = "Rotate Left"
rotateRight = "Rotate Right"
toggleSidebar = "Toggle Sidebar"
toggleBookmarks = "Toggle Bookmarks"
print = "Print PDF"
draw = "Draw"
redact = "Redact"
exitRedaction = "Exit Redaction Mode"
save = "Save"
downloadAll = "Download All"
saveAll = "Save All"
[textAlign]
left = "Left"
center = "Center"
right = "Right"
[annotation]
title = "Annotate"
desc = "Use highlight, pen, text, and notes. Changes stay live—no flattening required."
highlight = "Highlight"
pen = "Pen"
text = "Text box"
note = "Note"
rectangle = "Rectangle"
ellipse = "Ellipse"
select = "Select"
exit = "Exit annotation mode"
strokeWidth = "Width"
opacity = "Opacity"
strokeOpacity = "Stroke Opacity"
fillOpacity = "Fill Opacity"
fontSize = "Font size"
chooseColor = "Choose colour"
color = "Colour"
strokeColor = "Stroke Colour"
fillColor = "Fill Colour"
underline = "Underline"
strikeout = "Strikeout"
squiggly = "Squiggly"
inkHighlighter = "Freehand Highlighter"
freehandHighlighter = "Freehand Highlighter"
square = "Square"
circle = "Circle"
polygon = "Polygon"
line = "Line"
stamp = "Add Image"
textMarkup = "Text Markup"
drawing = "Drawing"
shapes = "Shapes"
notesStamps = "Notes & Stamps"
settings = "Settings"
borderOn = "Border: On"
borderOff = "Border: Off"
editInk = "Edit Pen"
editLine = "Edit Line"
editNote = "Edit Note"
editText = "Edit Text Box"
editTextMarkup = "Edit Text Markup"
editSelected = "Edit Annotation"
editSquare = "Edit Square"
editCircle = "Edit Circle"
editPolygon = "Edit Polygon"
unsupportedType = "This annotation type is not fully supported for editing."
textAlignment = "Text Alignment"
noteIcon = "Note Icon"
imagePreview = "Preview"
contents = "Text"
backgroundColor = "Background colour"
clearBackground = "Remove background"
noBackground = "No background"
stampSettings = "Stamp Settings"
savingCopy = "Preparing download..."
saveFailed = "Unable to save copy"
saveReady = "Download ready"
selectAndMove = "Select and Edit"
editSelectDescription = "Click an existing annotation to edit its colour, opacity, text, or size."
editStampHint = "To change the image, delete this stamp and add a new one."
editSwitchToSelect = "Switch to Select & Edit to edit this annotation."
undo = "Undo"
redo = "Redo"
applyChanges = "Apply Changes"
saveChanges = "Save Changes"
[search]
title = "Search PDF"
placeholder = "Enter search term..."
noResults = "No results found"
searching = "Searching..."
[guestBanner]
title = "You're using Stirling PDF as a guest!"
message = "Create a free account to save your work, access more features, and support the project."
dismiss = "Dismiss banner"
signUp = "Sign Up Free"
[toolPicker]
searchPlaceholder = "Search tools..."
noToolsFound = "No tools found"
allTools = "ALL TOOLS"
quickAccess = "QUICK ACCESS"
[toolPicker.categories]
standardTools = "Standard Tools"
advancedTools = "Advanced Tools"
recommendedTools = "Recommended Tools"
[toolPicker.subcategories]
signing = "Signing"
documentSecurity = "Document Security"
verification = "Verification"
documentReview = "Document Review"
pageFormatting = "Page Formatting"
extraction = "Extraction"
removal = "Removal"
automation = "Automation"
general = "General"
advancedFormatting = "Advanced Formatting"
developerTools = "Developer Tools"
[quickAccess]
read = "Read"
sign = "Sign"
automate = "Automate"
files = "Files"
activity = "Activity"
help = "Help"
account = "Account"
config = "Config"
settings = "Settings"
adminSettings = "Admin Settings"
allTools = "Tools"
reader = "Reader"
tours = "Tours"
showMeAround = "Show me around"
[quickAccess.toursTooltip]
admin = "Watch walkthroughs here: Tools tour, New V2 layout tour, and the Admin tour."
user = "Watch walkthroughs here: Tools tour and the New V2 layout tour."
[quickAccess.helpMenu]
toolsTour = "Tools Tour"
toolsTourDesc = "Learn what the tools can do"
adminTour = "Admin Tour"
adminTourDesc = "Explore admin settings & features"
whatsNewTour = "See what's new in V2"
whatsNewTourDesc = "Tour the updated layout"
[admin]
error = "Error"
success = "Success"
expand = "Expand"
close = "Close"
[admin.status]
active = "Active"
inactive = "Inactive"
[admin.settings]
title = "Admin Settings"
workspace = "Workspace"
fetchError = "Failed to load settings"
saveError = "Failed to save settings"
saved = "Settings saved successfully"
saveSuccess = "Settings saved successfully"
success = "Settings saved successfully"
error = "Failed to save settings"
save = "Save Changes"
discard = "Discard"
restartRequired = "Restart Required"
loginRequired = "Login mode must be enabled to modify admin settings"
restarting = "Restarting Server"
restartingMessage = "The server is restarting. Please wait a moment..."
restartError = "Failed to restart server. Please restart manually."
[admin.settings.unsavedChanges]
title = "Unsaved Changes"
message = "You have unsaved changes. Do you want to discard them?"
cancel = "Keep Editing"
discard = "Discard Changes"
hint = "You have unsaved changes"
[admin.settings.loginDisabled]
title = "Login Mode Required"
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."
[admin.settings.enterpriseRequired]
title = "Enterprise License Required"
message = "An Enterprise license is required to access {{featureName}}. You are viewing demo data for reference."
[admin.settings.restart]
title = "Restart Required"
message = "Settings have been saved successfully. A server restart is required for the changes to take effect."
question = "Would you like to restart the server now or later?"
now = "Restart Now"
later = "Restart Later"
[admin.settings.general]
title = "System Settings"
description = "Configure system-wide application settings including branding and default behaviour."
ui = "User Interface"
system = "System"
[admin.settings.general.appName]
label = "Application Name"
description = "The name displayed in the browser tab and home page"
[admin.settings.general.appNameNavbar]
label = "Navbar Brand"
description = "The name displayed in the navigation bar"
[admin.settings.general.homeDescription]
label = "Home Description"
description = "The description text shown on the home page"
[admin.settings.general.defaultLocale]
label = "Default Locale"
description = "The default language for new users (e.g., en_US, es_ES)"
[admin.settings.general.fileUploadLimit]
label = "File Upload Limit"
description = "Maximum file upload size (e.g., 100MB, 1GB)"
[admin.settings.general.showUpdate]
label = "Show Update Notifications"
description = "Display notifications when a new version is available"
[admin.settings.general.showUpdateOnlyAdmin]
label = "Show Updates to Admins Only"
description = "Restrict update notifications to admin users only"
[admin.settings.general.customHTMLFiles]
label = "Custom HTML Files"
description = "Allow serving custom HTML files from the customFiles directory"
[admin.settings.general.languages]
label = "Available Languages"
description = "Languages that users can select from (leave empty to enable all languages)"
placeholder = "Select languages"
[admin.settings.general.customMetadata]
label = "Custom Metadata"
[admin.settings.general.customMetadata.autoUpdate]
label = "Auto Update Metadata"
description = "Automatically update PDF metadata on all processed documents"
[admin.settings.general.customMetadata.author]
label = "Default Author"
description = "Default author for PDF metadata (e.g., username)"
[admin.settings.general.customMetadata.creator]
label = "Default Creator"
description = "Default creator for PDF metadata"
[admin.settings.general.customMetadata.producer]
label = "Default Producer"
description = "Default producer for PDF metadata"
[admin.settings.general.logoStyle]
label = "Logo Style"
description = "Set the default logo style for all users on this server. Users can override this setting in their personal preferences."
classic = "Classic"
classicAlt = "Classic logo"
modern = "Modern"
modernAlt = "Modern logo"
[admin.settings.general.customPaths]
label = "Custom Paths"
description = "Configure custom file system paths for pipeline processing and external tools"
[admin.settings.general.customPaths.pipeline]
label = "Pipeline Directories"
[admin.settings.general.customPaths.pipeline.watchedFoldersDir]
label = "Watched Folders Directory"
description = "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)"
[admin.settings.general.customPaths.pipeline.finishedFoldersDir]
label = "Finished Folders Directory"
description = "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)"
[admin.settings.general.customPaths.operations]
label = "External Tool Paths"
[admin.settings.general.customPaths.operations.weasyprint]
label = "WeasyPrint Executable"
description = "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)"
[admin.settings.general.customPaths.operations.unoconvert]
label = "Unoconvert Executable"
description = "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)"
[admin.settings.general.frontendUrl]
label = "Frontend URL"
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."
[admin.settings.badge]
clickToUpgrade = "Click to view plan details"
[admin.settings.security]
title = "Security"
description = "Configure authentication, login behaviour, and security policies."
authentication = "Authentication"
[admin.settings.security.ssoNotice]
title = "Looking for SSO/SAML settings?"
message = "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management."
[admin.settings.security.enableLogin]
label = "Enable Login"
description = "Require users to log in before accessing the application"
[admin.settings.security.loginMethod]
label = "Login Method"
description = "The authentication method to use for user login"
all = "All Methods"
normal = "Username/Password Only"
oauth2 = "OAuth2 Only"
saml2 = "SAML2 Only"
[admin.settings.security.loginAttemptCount]
label = "Login Attempt Limit"
description = "Maximum number of failed login attempts before account lockout"
[admin.settings.security.loginResetTimeMinutes]
label = "Login Reset Time (minutes)"
description = "Time before failed login attempts are reset"
[admin.settings.security.xFrameOptions]
label = "X-Frame-Options"
description = "Controls whether the application can be embedded in iframes"
deny = "Deny (Prevents all framing)"
sameorigin = "Same Origin (Allow framing from same domain)"
disabled = "Disabled (No X-Frame-Options header)"
[admin.settings.security.csrfDisabled]
label = "Disable CSRF Protection"
description = "Disable Cross-Site Request Forgery protection (not recommended)"
[admin.settings.security.initialLogin]
label = "Initial Login"
[admin.settings.security.initialLogin.username]
label = "Initial Username"
description = "The username for the initial admin account"
[admin.settings.security.initialLogin.password]
label = "Initial Password"
description = "The password for the initial admin account"
[admin.settings.security.jwt]
label = "JWT Configuration"
[admin.settings.security.jwt.secureCookie]
label = "Secure Cookie"
description = "Require HTTPS for JWT cookies (recommended for production)"
[admin.settings.security.jwt.keyRetentionDays]
label = "Key Retention Days"
description = "Number of days to retain old JWT keys for verification"
[admin.settings.security.jwt.persistence]
label = "Enable Key Persistence"
description = "Store JWT keys persistently to survive server restarts"
[admin.settings.security.jwt.enableKeyRotation]
label = "Enable Key Rotation"
description = "Automatically rotate JWT signing keys periodically"
[admin.settings.security.jwt.enableKeyCleanup]
label = "Enable Key Cleanup"
description = "Automatically remove expired JWT keys"
[admin.settings.security.audit]
label = "Audit Logging"
[admin.settings.security.audit.enabled]
label = "Enable Audit Logging"
description = "Track user actions and system events for compliance and security monitoring"
[admin.settings.security.audit.level]
label = "Audit Level"
description = "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE"
[admin.settings.security.audit.retentionDays]
label = "Audit Retention (days)"
description = "Number of days to retain audit logs"
[admin.settings.security.htmlUrlSecurity]
label = "HTML URL Security"
description = "Configure URL access restrictions for HTML processing to prevent SSRF attacks"
advanced = "Advanced Settings"
networkBlocking = "Network Blocking"
[admin.settings.security.htmlUrlSecurity.enabled]
label = "Enable URL Security"
description = "Enable URL security restrictions for HTML to PDF conversions"
[admin.settings.security.htmlUrlSecurity.level]
label = "Security Level"
description = "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions"
max = "Maximum (Whitelist Only)"
medium = "Medium (Block Internal)"
off = "Off (No Restrictions)"
[admin.settings.security.htmlUrlSecurity.allowedDomains]
label = "Allowed Domains (Whitelist)"
description = "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX"
[admin.settings.security.htmlUrlSecurity.blockedDomains]
label = "Blocked Domains (Blacklist)"
description = "One domain per line (e.g., malicious.com). Additional domains to block"
[admin.settings.security.htmlUrlSecurity.internalTlds]
label = "Internal TLDs"
description = "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns"
[admin.settings.security.htmlUrlSecurity.blockPrivateNetworks]
label = "Block Private Networks"
description = "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)"
[admin.settings.security.htmlUrlSecurity.blockLocalhost]
label = "Block Localhost"
description = "Block localhost and loopback addresses (127.x.x.x, ::1)"
[admin.settings.security.htmlUrlSecurity.blockLinkLocal]
label = "Block Link-Local Addresses"
description = "Block link-local addresses (169.254.x.x, fe80::/10)"
[admin.settings.security.htmlUrlSecurity.blockCloudMetadata]
label = "Block Cloud Metadata Endpoints"
description = "Block cloud provider metadata endpoints (169.254.169.254)"
[admin.settings.connections]
title = "Connections"
description = "Configure external authentication providers like OAuth2 and SAML."
linkedServices = "Linked Services"
unlinkedServices = "Unlinked Services"
connect = "Connect"
disconnect = "Disconnect"
disconnected = "Provider disconnected successfully"
disconnectError = "Failed to disconnect provider"
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."
imageResolutionFull = "Full (Original Size)"
imageResolutionReduced = "Reduced (Max 1200px)"
mobileScannerPageFormat = "Page Format"
mobileScannerPageFormatDesc = "PDF page size for converted images. \"Keep\" uses original image dimensions."
pageFormatKeep = "Keep (Original Dimensions)"
pageFormatA4 = "A4 (210×297mm)"
pageFormatLetter = "Letter (8.5×11in)"
mobileScannerStretchToFit = "Stretch to Fit"
mobileScannerStretchToFitDesc = "Stretch images to fill the entire page. If disabled, images are centered with preserved aspect ratio."
[admin.settings.connections.ssoAutoLogin]
label = "SSO Auto Login"
enable = "Enable SSO Auto Login"
description = "Automatically redirect to SSO login when authentication is required"
[admin.settings.connections.oauth2]
label = "OAuth2"
[admin.settings.connections.oauth2.enabled]
label = "Enable OAuth2"
description = "Allow users to authenticate using OAuth2 providers"
[admin.settings.connections.oauth2.provider]
label = "Provider"
description = "The OAuth2 provider to use for authentication"
[admin.settings.connections.oauth2.issuer]
label = "Issuer URL"
description = "The OAuth2 provider issuer URL"
[admin.settings.connections.oauth2.clientId]
label = "Client ID"
description = "The OAuth2 client ID from your provider"
[admin.settings.connections.oauth2.clientSecret]
label = "Client Secret"
description = "The OAuth2 client secret from your provider"
[admin.settings.connections.oauth2.useAsUsername]
label = "Use as Username"
description = "The OAuth2 claim to use as the username (e.g., email, sub)"
[admin.settings.connections.oauth2.autoCreateUser]
label = "Auto Create Users"
description = "Automatically create user accounts on first OAuth2 login"
[admin.settings.connections.oauth2.blockRegistration]
label = "Block Registration"
description = "Prevent new user registration via OAuth2"
[admin.settings.connections.oauth2.scopes]
label = "OAuth2 Scopes"
description = "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)"
[admin.settings.connections.saml2]
label = "SAML2"
[admin.settings.connections.saml2.enabled]
label = "Enable SAML2"
description = "Allow users to authenticate using SAML2 providers"
[admin.settings.connections.saml2.provider]
label = "Provider"
description = "The SAML2 provider name"
[admin.settings.connections.saml2.registrationId]
label = "Registration ID"
description = "The SAML2 registration identifier"
[admin.settings.connections.saml2.autoCreateUser]
label = "Auto Create Users"
description = "Automatically create user accounts on first SAML2 login"
[admin.settings.connections.saml2.blockRegistration]
label = "Block Registration"
description = "Prevent new user registration via SAML2"
[admin.settings.telegram]
title = "Telegram Bot"
description = "Configure Telegram bot connectivity, access controls, and feedback behavior."
[admin.settings.telegram.enabled]
label = "Enable Telegram Bot"
description = "Allow users to interact with Stirling PDF through your configured Telegram bot."
[admin.settings.telegram.botUsername]
label = "Bot Username"
description = "The public username of your Telegram bot."
[admin.settings.telegram.botToken]
label = "Bot Token"
description = "API token provided by BotFather for your Telegram bot."
[admin.settings.telegram.pipelineInboxFolder]
label = "Inbox Folder"
description = "Folder under the pipeline directory where incoming Telegram files are stored."
[admin.settings.telegram.customFolderSuffix]
label = "Use Custom Folder Suffix"
description = "Append the chat ID to incoming file folders to isolate uploads per chat."
[admin.settings.telegram.accessControl]
title = "Access Control"
description = "Restrict which users or channels can interact with the bot."
[admin.settings.telegram.enableAllowUserIDs]
label = "Allow Specific User IDs"
description = "When enabled, only listed user IDs can use the bot."
[admin.settings.telegram.allowUserIDs]
label = "Allowed User IDs"
description = "Enter Telegram user IDs allowed to interact with the bot."
placeholder = "Add user ID and press enter"
[admin.settings.telegram.enableAllowChannelIDs]
label = "Allow Specific Channel IDs"
description = "When enabled, only listed channel IDs can use the bot."
[admin.settings.telegram.allowChannelIDs]
label = "Allowed Channel IDs"
description = "Enter Telegram channel IDs allowed to interact with the bot."
placeholder = "Add channel ID and press enter"
[admin.settings.telegram.processing]
title = "Processing"
description = "Control polling intervals and processing timeouts for Telegram uploads."
[admin.settings.telegram.processingTimeoutSeconds]
label = "Processing Timeout (seconds)"
description = "Maximum time to wait for a processing job before reporting an error."
[admin.settings.telegram.pollingIntervalMillis]
label = "Polling Interval (ms)"
description = "Interval between checks for new Telegram updates."
[admin.settings.telegram.feedback]
title = "Feedback Messages"
description = "Choose when the bot should send feedback to users and channels."
[admin.settings.telegram.feedback.general.enabled]
label = "Enable Feedback"
description = "Control whether the bot sends feedback messages at all."
[admin.settings.telegram.feedback.channel]
title = "Channel Feedback Rules"
noValidDocument.label = "Show \"No valid document\" (Channel)"
noValidDocument.description = "Suppress the no valid document response for channel uploads."
errorProcessing.label = "Show processing errors (Channel)"
errorProcessing.description = "Send processing error messages to channels."
errorMessage.label = "Show error messages (Channel)"
errorMessage.description = "Show detailed error messages for channels."
[admin.settings.telegram.feedback.user]
title = "User Feedback Rules"
noValidDocument.label = "Show \"No valid document\" (User)"
noValidDocument.description = "Suppress the no valid document response for user uploads."
errorProcessing.label = "Show processing errors (User)"
errorProcessing.description = "Send processing error messages to users."
errorMessage.label = "Show error messages (User)"
errorMessage.description = "Show detailed error messages for users."
[admin.settings.connections.mobileScanner]
label = "Mobile Phone Upload"
enable = "Enable QR Code Upload"
description = "Allow users to upload files from mobile devices by scanning a QR code"
note = "Note: Requires Frontend URL to be configured. "
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."
imageResolutionFull = "Full (Original Size)"
imageResolutionReduced = "Reduced (Max 1200px)"
mobileScannerPageFormat = "Page Format"
mobileScannerPageFormatDesc = "PDF page size for converted images. \"Keep\" uses original image dimensions."
pageFormatKeep = "Keep (Original Dimensions)"
pageFormatA4 = "A4 (210×297mm)"
pageFormatLetter = "Letter (8.5×11in)"
mobileScannerStretchToFit = "Stretch to Fit"
mobileScannerStretchToFitDesc = "Stretch images to fill the entire page. If disabled, images are centered with preserved aspect ratio."
[admin.settings.database]
title = "Database"
description = "Configure custom database connection settings for enterprise deployments."
configuration = "Database Configuration"
backupTitle = "Backups & Restore"
backupDescription = "Manage H2 backups directly from the admin console."
loadError = "Failed to load database backups"
backupCreated = "Backup created successfully"
backupFailed = "Failed to create backup"
deleteTitle = "Delete backup"
deleteConfirm = "Delete this backup? This cannot be undone."
deleteSuccess = "Backup deleted"
deleteFailed = "Failed to delete backup"
deleteConfirmAction = "Delete backup"
downloadFailed = "Failed to download backup"
version = "H2 Version"
embedded = "Embedded H2"
external = "External DB"
h2Only = "Backups are available only for the embedded H2 database."
h2Hint = "Set the database type to H2 and disable custom database to enable backup and restore."
manageBackups = "Manage backups"
refresh = "Refresh"
createBackup = "Create backup"
uploadTitle = "Upload & import"
chooseFile = "Choose a .sql backup file"
importFromUpload = "Import upload"
confirmImportTitle = "Confirm database import"
overwriteWarning = "Warning: This will overwrite the current database."
overwriteWarningBody = "All existing data will be replaced by the uploaded backup. This action cannot be undone."
confirmCodeLabel = "Enter the confirmation code to proceed"
enterCode = "Enter the code shown above"
confirmImport = "Confirm import"
codeMismatch = "Confirmation code does not match"
codeMismatchBody = "Please enter the code exactly as shown to proceed."
selectFile = "Please select a .sql file to import"
importSuccess = "Backup imported successfully"
importFailed = "Failed to import backup"
noBackups = "No backups found yet."
unavailable = "Backup list unavailable for the current database configuration."
fileName = "File"
created = "Created"
size = "Size"
actions = "Actions"
download = "Download"
import = "Import"
delete = "Delete"
[admin.settings.database.enableCustom]
label = "Enable Custom Database"
description = "Use your own custom database configuration instead of the default embedded database"
[admin.settings.database.customUrl]
label = "Custom Database URL"
description = "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used."
[admin.settings.database.type]
label = "Database Type"
description = "Type of database (not used if custom URL is provided)"
[admin.settings.database.hostName]
label = "Host Name"
description = "Database server hostname (not used if custom URL is provided)"
[admin.settings.database.port]
label = "Port"
description = "Database server port (not used if custom URL is provided)"
[admin.settings.database.name]
label = "Database Name"
description = "Name of the database (not used if custom URL is provided)"
[admin.settings.database.username]
label = "Username"
description = "Database authentication username"
[admin.settings.database.password]
label = "Password"
description = "Database authentication password"
[admin.settings.privacy]
title = "Privacy"
description = "Configure privacy and data collection settings."
analytics = "Analytics & Tracking"
searchEngine = "Search Engine Visibility"
[admin.settings.privacy.enableAnalytics]
label = "Enable Analytics"
description = "Collect anonymous usage analytics to help improve the application"
[admin.settings.privacy.metricsEnabled]
label = "Enable Metrics"
description = "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data"
[admin.settings.privacy.googleVisibility]
label = "Google Visibility"
description = "Allow search engines to index this application"
[admin.settings.advanced]
title = "Advanced"
description = "Configure advanced features and experimental functionality."
features = "Feature Flags"
processing = "Processing"
[admin.settings.advanced.endpoints]
label = "Endpoints"
manage = "Manage API Endpoints"
description = "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints."
[admin.settings.advanced.enableAlphaFunctionality]
label = "Enable Alpha Features"
description = "Enable experimental and alpha-stage features (may be unstable)"
[admin.settings.advanced.enableUrlToPDF]
label = "Enable URL to PDF"
description = "Allow conversion of web pages to PDF documents"
[admin.settings.advanced.maxDPI]
label = "Maximum DPI"
description = "Maximum DPI for image processing (0 = unlimited)"
[admin.settings.advanced.tessdataDir]
label = "Tessdata Directory"
description = "Path to the tessdata directory for OCR language files"
downloadMissingTitle = "No language selected"
downloadMissingBody = "Please select at least one language to download."
downloadSuccessTitle = "Languages downloaded"
downloadSuccessBody = "The selected tessdata languages have been saved."
downloadErrorTitle = "Download Failed"
loadingLanguages = "Loading installed tessdata languages..."
installedLanguages = "Installed tessdata languages"
noLanguages = "No tessdata languages found in the configured directory."
downloadLabel = "Download additional tessdata languages"
downloadPlaceholder = "Select languages"
downloadNothingFound = "No additional languages found"
permissionNotice = "The tessdata path is not writable. Downloads will be opened in the browser; please save the .traineddata files manually into the tessdata folder."
manualLinks = "Manual downloads: click the links and place the files into the tessdata folder."
downloadButton = "Download selected languages"
downloadInvalidTitle = "Invalid selection"
downloadInvalidBody = "Some selected languages are not available to download. Please refresh and choose from the list."
downloadErrorNetwork = "Download failed due to a network error. Please check your connection and try again."
downloadErrorServer = "The server encountered an error while downloading tessdata languages. Please try again later."
downloadErrorPermission = "Tessdata directory is not writable: {{message}}. Please choose a writable directory (e.g. under the application data folder) or adjust permissions."
downloadErrorGeneric = "Download failed: {{message}}. Please try again later."
[admin.settings.advanced.disableSanitize]
label = "Disable HTML Sanitization"
description = "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities"
[admin.settings.advanced.tempFileManagement]
label = "Temp File Management"
description = "Configure temporary file storage and cleanup behavior"
[admin.settings.advanced.tempFileManagement.baseTmpDir]
label = "Base Temp Directory"
description = "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)"
[admin.settings.advanced.tempFileManagement.libreofficeDir]
label = "LibreOffice Temp Directory"
description = "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)"
[admin.settings.advanced.tempFileManagement.systemTempDir]
label = "System Temp Directory"
description = "System temp directory to clean (only used if cleanupSystemTemp is enabled)"
[admin.settings.advanced.tempFileManagement.prefix]
label = "Temp File Prefix"
description = "Prefix for temp file names"
[admin.settings.advanced.tempFileManagement.maxAgeHours]
label = "Max Age (hours)"
description = "Maximum age in hours before temp files are cleaned up"
[admin.settings.advanced.tempFileManagement.cleanupIntervalMinutes]
label = "Cleanup Interval (minutes)"
description = "How often to run cleanup (in minutes)"
[admin.settings.advanced.tempFileManagement.startupCleanup]
label = "Startup Cleanup"
description = "Clean up old temp files on application startup"
[admin.settings.advanced.tempFileManagement.cleanupSystemTemp]
label = "Cleanup System Temp"
description = "Whether to clean broader system temp directory (use with caution)"
[admin.settings.advanced.processExecutor]
label = "Process Executor Limits"
description = "Configure session limits and timeouts for each process executor"
libreOffice = "LibreOffice"
pdfToHtml = "PDF to HTML"
qpdf = "QPDF"
tesseract = "Tesseract OCR"
pythonOpenCv = "Python OpenCV"
weasyPrint = "WeasyPrint"
installApp = "Install App"
calibre = "Calibre"
ghostscript = "Ghostscript"
ocrMyPdf = "OCRmyPDF"
[admin.settings.advanced.processExecutor.sessionLimit]
label = "Session Limit"
description = "Maximum concurrent instances"
[admin.settings.advanced.processExecutor.timeout]
label = "Timeout (minutes)"
description = "Maximum execution time"
[admin.settings.mail]
title = "Mail Server"
description = "Configure SMTP settings for sending email notifications."
smtp = "SMTP Configuration"
[admin.settings.mail.enabled]
label = "Enable Mail"
description = "Enable email notifications and SMTP functionality"
[admin.settings.mail.host]
label = "SMTP Host"
description = "The hostname or IP address of your SMTP server"
[admin.settings.mail.port]
label = "SMTP Port"
description = "The port number for SMTP connection (typically 25, 465, or 587)"
[admin.settings.mail.username]
label = "SMTP Username"
description = "Username for SMTP authentication"
[admin.settings.mail.password]
label = "SMTP Password"
description = "Password for SMTP authentication"
[admin.settings.mail.from]
label = "From Address"
description = "The email address to use as the sender"
[admin.settings.mail.enableInvites]
label = "Enable Email Invites"
description = "Allow admins to invite users via email with auto-generated passwords"
[admin.settings.mail.frontendUrl]
label = "Frontend URL"
description = "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL."
[admin.settings.mail.frontendUrlNote]
note = "Note: Requires Frontend URL to be configured. "
link = "Configure in System Settings"
[admin.settings.legal]
title = "Legal Documents"
description = "Configure links to legal documents and policies."
[admin.settings.legal.disclaimer]
title = "Legal Responsibility Warning"
message = "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations."
[admin.settings.legal.termsAndConditions]
label = "Terms and Conditions"
description = "URL or filename to terms and conditions"
[admin.settings.legal.privacyPolicy]
label = "Privacy Policy"
description = "URL or filename to privacy policy"
[admin.settings.legal.accessibilityStatement]
label = "Accessibility Statement"
description = "URL or filename to accessibility statement"
[admin.settings.legal.cookiePolicy]
label = "Cookie Policy"
description = "URL or filename to cookie policy"
[admin.settings.legal.impressum]
label = "Impressum"
description = "URL or filename to impressum (required in some jurisdictions)"
[admin.settings.premium]
title = "Premium & Enterprise"
description = "Configure your premium or enterprise license key."
license = "License Configuration"
noInput = "Please provide a license key or file"
[admin.settings.premium.licenseKey]
toggle = "Got a license key or certificate file?"
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."
[admin.settings.premium.key]
label = "License Key"
description = "Enter your premium or enterprise license key. Premium features will be automatically enabled when a key is provided."
success = "License Key Saved"
successMessage = "Your license key has been activated successfully. No restart required."
[admin.settings.premium.key.overwriteWarning]
title = "⚠️ Warning: Existing License Detected"
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."
[admin.settings.premium.inputMethod]
text = "License Key"
file = "Certificate File"
[admin.settings.premium.file]
label = "License Certificate File"
description = "Upload your .lic or .cert license file from offline purchases"
choose = "Choose License File"
selected = "Selected: {{filename}} ({{size}})"
successMessage = "License file uploaded and activated successfully. No restart required."
[admin.settings.premium.currentLicense]
title = "Active License"
file = "Source: License file ({{path}})"
key = "Source: License key"
type = "Type: {{type}}"
noInput = "Please provide a license key or upload a certificate file"
success = "Success"
[admin.settings.premium.enabled]
label = "Enable Premium Features"
description = "Enable license key checks for pro/enterprise features"
[admin.settings.premium.movedFeatures]
title = "Premium Features Distributed"
message = "Premium and Enterprise features are now organized in their respective sections:"
[admin.settings.features]
title = "Features"
description = "Configure optional features and functionality."
[admin.settings.features.serverCertificate]
label = "Server Certificate"
description = "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality"
[admin.settings.features.serverCertificate.enabled]
label = "Enable Server Certificate"
description = "Enable server-side certificate for \"Sign with Stirling-PDF\" option"
[admin.settings.features.serverCertificate.organizationName]
label = "Organization Name"
description = "Organization name for generated certificates"
[admin.settings.features.serverCertificate.validity]
label = "Certificate Validity (days)"
description = "Number of days the certificate will be valid"
[admin.settings.features.serverCertificate.regenerateOnStartup]
label = "Regenerate on Startup"
description = "Generate new certificate on each application startup"
[admin.settings.endpoints]
title = "API Endpoints"
description = "Control which API endpoints and endpoint groups are available."
management = "Endpoint Management"
note = "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect."
[admin.settings.endpoints.toRemove]
label = "Disabled Endpoints"
description = "Select individual endpoints to disable"
[admin.settings.endpoints.groupsToRemove]
label = "Disabled Endpoint Groups"
description = "Select endpoint groups to disable"
[fileUpload]
selectFile = "Select a file"
selectFiles = "Select files"
selectPdfToView = "Select a PDF to view"
selectPdfToEdit = "Select a PDF to edit"
chooseFromStorage = "Choose a file from storage or upload a new PDF"
chooseFromStorageMultiple = "Choose files from storage or upload new PDFs"
loadFromStorage = "Load from Storage"
filesAvailable = "files available"
loading = "Loading..."
or = "or"
dropFileHere = "Drop file here or click to upload"
dropFilesHere = "Drop files here or click the upload button"
dropFilesHereOpen = "Drop files here or click the open button"
pdfFilesOnly = "PDF files only"
supportedFileTypes = "Supported file types"
upload = "Upload"
uploadFile = "Upload File"
uploadFiles = "Upload Files"
open = "Open"
openFile = "Open File"
openFiles = "Open Files"
noFilesInStorage = "No files available in storage. Upload some files first."
noFilesInStorageOpen = "No files available in storage. Open some files first."
selectFromStorage = "Select from Storage"
backToTools = "Back to Tools"
addFiles = "Add Files"
dragFilesInOrClick = "Drag files in or click \"Add Files\" to browse"
[fileEditor]
addFiles = "Add Files"
[fileManager]
title = "Upload PDF Files"
subtitle = "Add files to your storage for easy access across tools"
filesSelected = "files selected"
clearSelection = "Clear Selection"
openInFileEditor = "Open in File Editor"
uploadError = "Failed to upload some files."
failedToOpen = "Failed to open file. It may have been removed from storage."
failedToLoad = "Failed to load file to active set."
storageCleared = "Browser cleared storage. Files have been removed. Please re-upload."
clearAll = "Clear All"
reloadFiles = "Reload Files"
dragDrop = "Drag & Drop files here"
clickToUpload = "Click to upload files"
selectedFiles = "Selected Files"
storage = "Storage"
filesStored = "files stored"
storageError = "Storage error occurred"
storageLow = "Storage is running low. Consider removing old files."
supportMessage = "Powered by browser database storage for unlimited capacity"
noFileSelected = "No files selected"
showHistory = "Show History"
hideHistory = "Hide History"
fileHistory = "File History"
loadingHistory = "Loading History..."
lastModified = "Last Modified"
toolChain = "Tools Applied"
restore = "Restore"
unzip = "Unzip"
searchFiles = "Search files..."
recent = "Recent"
localFiles = "Local Files"
googleDrive = "Google Drive"
googleDriveShort = "Drive"
myFiles = "My Files"
noRecentFiles = "No recent files found"
googleDriveNotAvailable = "Google Drive integration not available"
mobileUpload = "Mobile Upload"
mobileShort = "Mobile"
mobileUploadNotAvailable = "Mobile upload not enabled"
downloadSelected = "Download Selected"
saveSelected = "Save Selected"
openFiles = "Open Files"
openFile = "Open File"
details = "File Details"
fileName = "Name"
fileFormat = "Format"
fileSize = "Size"
fileVersion = "Version"
totalSelected = "Total Selected"
dropFilesHere = "Drop files here"
selectAll = "Select All"
deselectAll = "Deselect All"
deleteSelected = "Delete Selected"
selectedCount = "{{count}} selected"
download = "Download"
delete = "Delete"
unsupported = "Unsupported"
active = "Active"
addToUpload = "Add to Upload"
closeFile = "Close File"
deleteAll = "Delete All"
loadingFiles = "Loading files..."
noFiles = "No files available"
noFilesFound = "No files found matching your search"
openInPageEditor = "Open in Page Editor"
showAll = "Show All"
sortByDate = "Sort by Date"
sortByName = "Sort by Name"
sortBySize = "Sort by Size"
[storage]
temporaryNotice = "Files are stored temporarily in your browser and may be cleared automatically"
storageLimit = "Storage limit"
storageUsed = "Temporary Storage used"
storageFull = "Storage is nearly full. Consider removing some files."
fileTooLarge = "File too large. Maximum size per file is"
storageQuotaExceeded = "Storage quota exceeded. Please remove some files before uploading more."
approximateSize = "Approximate size"
[sanitize]
title = "Sanitise"
desc = "Remove potentially harmful elements from PDF files."
submit = "Sanitise PDF"
completed = "Sanitisation completed successfully"
filenamePrefix = "sanitised"
sanitizationResults = "Sanitisation Results"
[sanitize.error]
generic = "Sanitisation failed"
failed = "An error occurred while sanitising the PDF."
[sanitize.steps]
files = "Files"
settings = "Settings"
results = "Results"
[sanitize.files]
placeholder = "Select a PDF file in the main view to get started"
[sanitize.options]
title = "Sanitisation Options"
note = "Select the elements you want to remove from the PDF. At least one option must be selected."
[sanitize.options.removeJavaScript]
label = "Remove JavaScript"
desc = "Remove JavaScript actions and scripts from the PDF"
[sanitize.options.removeEmbeddedFiles]
label = "Remove Embedded Files"
desc = "Remove any files embedded within the PDF"
[sanitize.options.removeXMPMetadata]
label = "Remove XMP Metadata"
desc = "Remove XMP metadata from the PDF"
[sanitize.options.removeMetadata]
label = "Remove Document Metadata"
desc = "Remove document information metadata (title, author, etc.)"
[sanitize.options.removeLinks]
label = "Remove Links"
desc = "Remove external links and launch actions from the PDF"
[sanitize.options.removeFonts]
label = "Remove Fonts"
desc = "Remove embedded fonts from the PDF"
[addPassword]
title = "Add Password"
desc = "Encrypt your PDF document with a password."
completed = "Password protection applied"
submit = "Encrypt"
filenamePrefix = "encrypted"
[addPassword.error]
failed = "An error occurred while encrypting the PDF."
[addPassword.passwords]
stepTitle = "Passwords & Encryption"
completed = "Passwords configured"
[addPassword.passwords.user]
label = "User Password"
placeholder = "Enter user password"
[addPassword.passwords.owner]
label = "Owner Password"
placeholder = "Enter owner password"
[addPassword.encryption.keyLength]
label = "Encryption Key Length"
40bit = "40-bit (Low)"
128bit = "128-bit (Standard)"
256bit = "256-bit (High)"
[addPassword.results]
title = "Encrypted PDFs"
[addPassword.tooltip.header]
title = "Password Protection Overview"
[addPassword.tooltip.passwords]
title = "Password Types"
text = "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one."
bullet1 = "User Password: Required to open the PDF"
bullet2 = "Owner Password: Controls document permissions (not supported by all PDF viewers)"
[addPassword.tooltip.encryption]
title = "Encryption Levels"
text = "Higher encryption levels provide better security but may not be supported by older PDF viewers."
bullet1 = "40-bit: Basic security, compatible with older viewers"
bullet2 = "128-bit: Standard security, widely supported"
bullet3 = "256-bit: Maximum security, requires modern viewers"
[addPassword.tooltip.permissions]
title = "Change Permissions"
text = "These permissions control what users can do with the PDF. Most effective when combined with an owner password."
[changePermissions]
title = "Change Permissions"
desc = "Change document restrictions and permissions."
completed = "Permissions changed"
submit = "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.header]
title = "Change Permissions"
[changePermissions.tooltip.description]
text = "Changes document permissions, allowing/disallowing access to different features in PDF readers."
[changePermissions.tooltip.warning]
text = "To make these permissions unchangeable, use the Add Password tool to set an owner password."
[removePassword]
title = "Remove Password"
desc = "Remove password protection from your PDF document."
tags = "secure,Decrypt,security,unpassword,delete password"
filenamePrefix = "decrypted"
submit = "Remove Password"
[removePassword.password]
stepTitle = "Remove Password"
label = "Current Password"
placeholder = "Enter current password"
completed = "Password configured"
[removePassword.error]
failed = "An error occurred while removing the password from the PDF."
[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."
[removePassword.results]
title = "Decrypted PDFs"
[automate]
title = "Automate"
desc = "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks."
invalidStep = "Invalid step"
reviewTitle = "Automation Results"
copyToSaved = "Copy to Saved"
exportForFolderScanning = "Export for Folder Scanning"
[automate.files]
placeholder = "Select files to process with this automation"
[automate.selection]
title = "Automation Selection"
[automate.selection.saved]
title = "Saved"
[automate.selection.createNew]
title = "Create New Automation"
[automate.selection.suggested]
title = "Suggested"
[automate.creation]
createTitle = "Create Automation"
editTitle = "Edit Automation"
intro = "Automations run tools sequentially. To get started, add tools in the order you want them to run."
save = "Save Automation"
exportForFolderScanning = "Export for Folder Scanning"
[automate.creation.name]
label = "Automation Name"
placeholder = "My Automation"
[automate.creation.description]
label = "Description (optional)"
placeholder = "Describe what this automation does..."
[automate.creation.tools]
selectTool = "Select a tool..."
selected = "Selected Tools"
remove = "Remove tool"
configure = "Configure tool"
notConfigured = "! Not Configured"
addTool = "Add Tool"
add = "Add a tool..."
[automate.creation.unsavedChanges]
title = "Unsaved Changes"
message = "You have unsaved changes. Are you sure you want to go back? All changes will be lost."
cancel = "Cancel"
confirm = "Go Back"
[automate.creation.icon]
label = "Icon"
[automate.run]
title = "Run Automation"
[automate.sequence]
unnamed = "Unnamed Automation"
steps = "{{count}} steps"
running = "Running Automation..."
run = "Run Automation"
finish = "Finish"
[automate.config]
loading = "Loading tool configuration..."
noSettings = "This tool does not have configurable settings."
title = "Configure {{toolName}}"
description = "Configure the settings for this tool. These settings will be applied when the automation runs."
cancel = "Cancel"
save = "Save Configuration"
[automation.suggested]
securePdfIngestion = "Secure PDF Ingestion"
securePdfIngestionDesc = "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size."
emailPreparation = "Email Preparation"
emailPreparationDesc = "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy."
secureWorkflow = "Security Workflow"
secureWorkflowDesc = "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default."
processImages = "Process Images"
processImagesDesc = "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images."
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."
[colorPicker]
title = "Choose colour"
[common]
previous = "Previous"
next = "Next"
collapse = "Collapse"
expand = "Expand"
collapsed = "collapsed"
lines = "lines"
copy = "Copy"
copied = "Copied!"
refresh = "Refresh"
retry = "Retry"
remaining = "remaining"
used = "used"
available = "available"
cancel = "Cancel"
preview = "Preview"
close = "Close"
done = "Done"
loading = "Loading..."
back = "Back"
continue = "Continue"
error = "Error"
save = "Save"
[config.overview]
title = "Application Configuration"
description = "Current application settings and configuration details."
loading = "Loading configuration..."
error = "Error"
warning = "Configuration Warning"
[config.overview.sections]
basic = "Basic Configuration"
security = "Security Configuration"
system = "System Configuration"
integration = "Integration Configuration"
[config.account.overview]
title = "Account Settings"
manageAccountPreferences = "Manage your account preferences"
guestDescription = "You are signed in as a guest. Consider upgrading your account above."
[config.account.upgrade]
title = "Upgrade Guest Account"
description = "Link your account to preserve your history and access more features!"
socialLogin = "Upgrade with Social Account"
linkWith = "Link with"
emailPassword = "or enter your email & password"
email = "Email"
emailPlaceholder = "Enter your email"
password = "Password (optional)"
passwordPlaceholder = "Set a password"
passwordNote = "Leave empty to use email verification only"
upgradeButton = "Upgrade Account"
[config.apiKeys]
intro = "Use your API key to programmatically access Stirling PDF's processing capabilities."
docsTitle = "API Documentation"
docsDescription = "Learn more about integrating with Stirling PDF:"
docsLink = "API Documentation"
schemaLink = "API Schema Reference"
usage = "Include this key in the X-API-KEY header with all API requests."
description = "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one."
publicKeyAriaLabel = "Public API key"
copyKeyAriaLabel = "Copy API key"
refreshAriaLabel = "Refresh API key"
includedCredits = "Included credits"
purchasedCredits = "Purchased credits"
totalCredits = "Total Credits"
chartAriaLabel = "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}"
nextReset = "Next Reset"
lastApiUse = "Last API Use"
overlayMessage = "Generate a key to see credits and available credits"
label = "API Key"
guestInfo = "Guest users do not receive API keys. Create an account to get an API key you can use in your applications."
goToAccount = "Go to Account"
generateError = "We couldn't generate your API key."
[config.apiKeys.refreshModal]
title = "Refresh API Keys"
warning = "⚠️ Warning: This action will generate new API keys and make your previous keys invalid."
impact = "Any applications or services currently using these keys will stop working until you update them with the new keys."
confirmPrompt = "Are you sure you want to continue?"
confirmCta = "Refresh Keys"
[config.apiKeys.alert]
apiKeyErrorTitle = "API Key Error"
failedToCreateApiKey = "Failed to create API key."
failedToRetrieveApiKey = "Failed to retrieve API key from response."
failedToFetchApiKey = "Failed to fetch API key."
apiKeyRefreshed = "API Key Refreshed"
apiKeyRefreshedBody = "Your API key has been successfully refreshed."
failedToRefreshApiKey = "Failed to refresh API key."
[AddAttachmentsRequest]
attachments = "Select Attachments"
info = "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel."
selectFiles = "Select Files to Attach"
placeholder = "Choose files..."
addMoreFiles = "Add more files..."
selectedFiles = "Selected Files"
submit = "Add Attachments"
[AddAttachmentsRequest.tooltip.header]
title = "About Add Attachments"
[AddAttachmentsRequest.tooltip.description]
title = "What it does"
[AddAttachmentsRequest.results]
title = "Attachment Results"
[AddAttachmentsRequest.error]
failed = "Add attachments operation failed"
[addAttachments.error]
failed = "An error occurred while adding attachments to the PDF."
[autoRename]
description = "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text."
[margin]
large = "Large"
medium = "Medium"
small = "Small"
xLarge = "Extra Large"
[pageEdit]
deselectAll = "Select None"
selectAll = "Select All"
[reorganizePages]
submit = "Reorganize Pages"
[reorganizePages.error]
failed = "Failed to reorganize pages"
[reorganizePages.results]
title = "Pages Reorganized"
[reorganizePages.settings]
title = "Settings"
[replace-color]
previewOverlayOpacity = "Preview overlay opacity"
previewOverlayTransparency = "Preview overlay transparency"
previewOverlayVisibility = "Show preview overlay"
submit = "Replace"
title = "Replace-Invert-Color"
[replace-color.options]
fill = "Fill colour"
gradient = "Gradient"
[replace-color.selectText]
1 = "Replace or invert colour options"
2 = "Default (preset high contrast colours)"
3 = "Custom (choose your own colours)"
4 = "Full invert (invert all colours)"
5 = "High contrast color options"
6 = "White text on black background"
7 = "Black text on white background"
8 = "Yellow text on black background"
9 = "Green text on black background"
10 = "Choose text Color"
11 = "Choose background Color"
12 = "Choose start colour"
13 = "Choose end colour"
[tools]
noSearchResults = "No tools found"
noTools = "No tools available"
[onboarding]
allTools = "This is the <strong>Tools</strong> panel, where you can browse and select from all available PDF tools."
selectCropTool = "Let's select the <strong>Crop</strong> tool to demonstrate how to use one of the tools."
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."
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."
workbench = "This is the <strong>Workbench</strong> - the main area where you view and edit your PDFs."
viewSwitcher = "Use these controls to select how you want to view your PDFs."
viewer = "The <strong>Viewer</strong> lets you read and annotate your PDFs."
pageEditor = "The <strong>Page Editor</strong> allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting."
activeFiles = "The <strong>Active Files</strong> view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process."
fileCheckbox = "Clicking one of the files selects it for processing. You can select multiple files for batch operations."
selectControls = "The <strong>Right Rail</strong> contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language."
cropSettings = "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to."
runButton = "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs."
results = "After the tool has finished running, the <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. "
fileReplacement = "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools."
pinButton = "You can use the <strong>Pin</strong> button if you'd rather your files stay active after running tools on them."
wrapUp = "You're all set! You've learnt about the main areas of the app and how to use them. Click the <strong>Help</strong> button whenever you like to see this tour again."
previous = "Previous"
next = "Next"
finish = "Finish"
startTour = "Start Tour"
startTourDescription = "Take a guided tour of Stirling PDF's key features"
[onboarding.whatsNew]
quickAccess = "Start at the <strong>Quick Access</strong> rail to jump between Reader, Automate, your files, and all the tours."
leftPanel = "The left <strong>Tools</strong> panel lists everything you can do. Browse categories or search to find a tool quickly."
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."
rightRail = "The <strong>Right Rail</strong> holds quick actions to select files, change theme or language, and download results."
topBar = "The top bar lets you swap between <strong>Viewer</strong>, <strong>Page Editor</strong>, and <strong>Active Files</strong>."
pageEditorView = "Switch to the Page Editor to reorder, rotate, or delete pages."
activeFilesView = "Use Active Files to see everything you have open and pick what to work on."
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."
[onboarding.welcomeModal]
title = "Welcome to Stirling PDF!"
description = "Would you like to take a quick 1-minute tour to learn the key features and how to get started?"
helpHint = "You can always access this tour later from the <strong>Help</strong> button in the bottom left."
startTour = "Start Tour"
maybeLater = "Maybe Later"
dontShowAgain = "Don't Show Again"
[onboarding.welcomeSlide]
title = "Welcome to Stirling"
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>."
[onboarding.buttons]
next = "Next →"
back = "Back"
skipForNow = "Skip for now"
download = "Download →"
showMeAround = "Show me around"
skipTheTour = "Skip the tour"
[onboarding.tourOverview]
title = "Tour Overview"
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."
[onboarding.serverLicense]
skip = "Skip for now"
seePlans = "See Plans →"
upgrade = "Upgrade now →"
freeTitle = "Server License"
overLimitTitle = "Server License Needed"
overLimitBody = "Our licensing permits up to <strong>{{freeTierLimit}}</strong> users for free per server. You have <strong>{{overLimitUserCopy}}</strong> Stirling users. To continue uninterrupted, upgrade to the Stirling Server plan - <strong>unlimited seats</strong>, PDF text editing, and full admin control for $99/server/mo."
freeBody = "Our <strong>Open-Core</strong> licensing permits up to <strong>{{freeTierLimit}}</strong> users for free per server. To scale uninterrupted, we recommend the Stirling Server plan - <strong>unlimited seats</strong> and <strong>SSO support</strong> for $99/server/mo."
[onboarding.desktopInstall]
title = "Download"
titleWithOs = "Download for {{osLabel}}"
body = "Stirling works best as a desktop app. You can use it offline, access documents faster, and make edits locally on your computer."
[onboarding.planOverview]
adminTitle = "Admin Overview"
userTitle = "Plan Overview"
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."
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."
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."
[onboarding.securityCheck]
message = "The application has undergone significant changes recently. Your server admin's attention may be required. Please confirm your role to continue."
[adminOnboarding]
welcome = "Welcome to the <strong>Admin Tour</strong>! Let's explore the powerful enterprise features and settings available to system administrators."
configButton = "Click the <strong>Config</strong> button to access all system settings and administrative controls."
settingsOverview = "This is the <strong>Settings Panel</strong>. Admin settings are organised by category for easy navigation."
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."
systemCustomization = "We have extensive ways to customise 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."
databaseSection = "For advanced production environments, we have settings to allow <strong>external database hookups</strong> so you can integrate with your existing infrastructure."
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."
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."
wrapUp = "That's the admin tour! You've seen the enterprise features that make Stirling PDF a powerful, customisable solution for organisations. Access this tour anytime from the <strong>Help</strong> menu."
[workspace]
title = "Workspace"
[workspace.people]
title = "People"
description = "Manage workspace members and their permissions"
loading = "Loading people..."
searchMembers = "Search members..."
addMembers = "Add Members"
user = "User"
role = "Role"
team = "Team"
status = "Status"
noMembersFound = "No members found"
active = "Active"
disabled = "Disabled"
activeSession = "Active session"
member = "Member"
admin = "Admin"
editRole = "Edit Role"
enable = "Enable"
disable = "Disable"
deleteUser = "Delete User"
deleteUserSuccess = "User deleted successfully"
deleteUserError = "Failed to delete user"
confirmDelete = "Are you sure you want to delete this user? This action cannot be undone."
loginRequired = "Enable login mode first"
[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.actions]
label = "Actions"
upgrade = "Upgrade"
[workspace.people.roleDescriptions]
admin = "Can manage settings and invite members, with full administrative access."
member = "Can view and edit shared files, but cannot manage workspace settings or members."
user = "User"
[workspace.people.addMember]
title = "Add Member"
username = "Username (Email)"
usernamePlaceholder = "[email protected]"
password = "Password"
passwordPlaceholder = "Enter password"
passwordRequired = "Password is required"
role = "Role"
team = "Team (Optional)"
teamPlaceholder = "Select a team"
authType = "Authentication Type"
forcePasswordChange = "Force password change on first login"
cancel = "Cancel"
submit = "Add Member"
usernameRequired = "Username and password are required"
passwordTooShort = "Password must be at least 6 characters"
success = "User created successfully"
error = "Failed to create user"
forceMFA = "Force MFA setup on next login"
[workspace.people.authType]
password = "Password"
oauth = "OAuth2"
saml = "SAML2"
ssoDescription = "User will authenticate via SSO provider"
[workspace.people.editMember]
title = "Edit Member"
editing = "Editing:"
role = "Role"
team = "Team (Optional)"
teamPlaceholder = "Select a team"
cancel = "Cancel"
submit = "Update Member"
success = "User updated successfully"
error = "Failed to update user"
[workspace.people.toggleEnabled]
success = "User status updated successfully"
error = "Failed to update user status"
[workspace.people.delete]
success = "User deleted successfully"
error = "Failed to delete user"
[workspace.people.changePassword]
action = "Change password"
title = "Change password"
subtitle = "Update the password for"
newPassword = "New password"
confirmPassword = "Confirm password"
placeholder = "Enter a new password"
confirmPlaceholder = "Re-enter the new password"
passwordRequired = "Please enter a new password"
passwordMismatch = "Passwords do not match"
generateRandom = "Generate secure password"
generatedPreview = "Generated password:"
copyTooltip = "Copy to clipboard"
copiedToClipboard = "Password copied to clipboard"
copyFailed = "Failed to copy password"
sendEmail = "Email the user about this change"
includePassword = "Include the new password in the email"
forcePasswordChange = "Force user to change password on next login"
emailUnavailable = "This user's email is not a valid email address. Notifications are disabled."
smtpDisabled = "Email notifications require SMTP to be enabled in settings."
notifyOnly = "An email will be sent without the password, letting the user know an admin changed it."
submit = "Update password"
success = "Password updated successfully"
error = "Failed to update password"
[workspace.people.emailInvite]
tab = "Email Invite"
description = "Type or paste in emails below, separated by commas. Users will receive login credentials via email."
emails = "Email Addresses"
emailsPlaceholder = "[email protected], [email protected]"
emailsRequired = "At least one email address is required"
submit = "Send Invites"
success = "user(s) invited successfully"
partialFailure = "Some invites failed"
allFailed = "Failed to invite users"
error = "Failed to send invites"
[workspace.people.directInvite]
tab = "Direct Create"
[workspace.people.inviteLinkTab]
tab = "Invite Link"
[workspace.people.inviteLink]
description = "Generate a secure link that allows the user to set their own password"
email = "Email Address"
emailPlaceholder = "[email protected] (optional)"
emailDescription = "Optional - leave blank for a general invite link that can be used by anyone"
emailRequired = "Email address is required"
emailOptional = "Optional - leave blank for a general invite link"
emailRequiredForSend = "Email address is required to send email notification"
expiryHours = "Expiry Hours"
expiryDescription = "How many hours until the link expires"
sendEmail = "Send invite link via email"
sendEmailDescription = "If enabled, the invite link will be sent to the specified email address"
smtpRequired = "SMTP not configured"
generate = "Generate Link"
generated = "Invite Link Generated"
copied = "Link copied to clipboard"
success = "Invite link generated successfully"
successWithEmail = "Invite link generated and sent via email"
emailSent = "Invite link generated and sent via email"
emailFailed = "Invite link generated, but email failed"
emailFailedDetails = "Error: {0}. Please share the invite link manually."
error = "Failed to generate invite link"
submit = "Generate Invite Link"
[workspace.people.inviteMode]
username = "Username"
email = "Email"
link = "Link"
emailDisabled = "Email invites require SMTP configuration and mail.enableInvites=true in settings"
[workspace.people.license]
users = "users"
availableSlots = "Available Slots"
grandfathered = "Grandfathered"
grandfatheredShort = "{{count}} grandfathered"
fromLicense = "from license"
slotsAvailable = "{{count}} user slot(s) available"
noSlotsAvailable = "No slots available"
currentUsage = "Currently using {{current}} of {{max}} user licences"
[workspace.people.mfa]
adminDisableSuccess = "MFA disabled successfully for user"
adminDisableError = "Failed to disable MFA for user"
disableByAdmin = "Disable MFA"
[workspace.teams]
title = "Teams"
description = "Manage teams and organize workspace members"
loading = "Loading teams..."
loadingDetails = "Loading team details..."
loadError = "Failed to load team details"
createNewTeam = "Create New Team"
teamName = "Team Name"
totalMembers = "Total Members"
actions = "Actions"
noTeamsFound = "No teams found"
noMembers = "No members in this team"
system = "System"
addMember = "Add Member"
viewTeam = "View Team"
removeMember = "Remove from team"
cannotRemoveFromSystemTeam = "Cannot remove from system team"
renameTeamLabel = "Rename Team"
deleteTeamLabel = "Delete Team"
cannotDeleteInternal = "Cannot delete the Internal team"
confirmDelete = "Are you sure you want to delete this team? This team must be empty to delete."
confirmRemove = "Remove user from this team?"
cannotRenameInternal = "Cannot rename the Internal team"
cannotAddToInternal = "Cannot add members to the Internal team"
teamNotFound = "Team not found"
backToTeams = "Back to Teams"
memberCount = "{{count}} members"
removeMemberSuccess = "User removed from team"
removeMemberError = "Failed to remove user from team"
[workspace.teams.createTeam]
title = "Create New Team"
teamName = "Team Name"
teamNamePlaceholder = "Enter team name"
cancel = "Cancel"
submit = "Create Team"
nameRequired = "Team name is required"
success = "Team created successfully"
error = "Failed to create team"
[workspace.teams.renameTeam]
title = "Rename Team"
renaming = "Renaming:"
newTeamName = "New Team Name"
newTeamNamePlaceholder = "Enter new team name"
cancel = "Cancel"
submit = "Rename Team"
nameRequired = "Team name is required"
success = "Team renamed successfully"
error = "Failed to rename team"
[workspace.teams.deleteTeam]
success = "Team deleted successfully"
error = "Failed to delete team. Make sure the team is empty."
teamMustBeEmpty = "Team must be empty before deletion"
[workspace.teams.addMemberToTeam]
title = "Add Member to Team"
addingTo = "Adding to"
selectUser = "Select User"
selectUserPlaceholder = "Choose a user"
selectUserRequired = "Please select a user"
currentlyIn = "currently in"
willBeMoved = "Note: This user will be moved from their current team to this team."
cancel = "Cancel"
submit = "Add Member"
userRequired = "Please select a user"
success = "Member added to team successfully"
error = "Failed to add member to team"
[workspace.teams.changeTeam]
label = "Change Team"
title = "Change Team"
changing = "Moving"
selectTeam = "Select Team"
selectTeamPlaceholder = "Choose a team"
selectTeamRequired = "Please select a team"
success = "Team changed successfully"
error = "Failed to change team"
submit = "Change Team"
[plan]
currency = "Currency"
popular = "Popular"
current = "Current Plan"
upgrade = "Upgrade"
contact = "Contact Us"
customPricing = "Custom"
showComparison = "Compare All Features"
hideComparison = "Hide Feature Comparison"
featureComparison = "Feature Comparison"
from = "From"
perMonth = "/month"
perSeat = "/seat"
withServer = "+ Server Plan"
licensedSeats = "Licensed: {{count}} seats"
includedInCurrent = "Included in Your Plan"
selectPlan = "Select Plan"
manage = "Manage"
[plan.manageSubscription]
description = "Manage your subscription, billing, and payment methods"
[plan.activePlan]
title = "Active Plan"
subtitle = "Your current subscription details"
[plan.availablePlans]
title = "Available Plans"
subtitle = "Choose the plan that fits your needs"
[plan.static]
title = "Billing Information"
message = "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly."
contactSales = "Contact Sales"
contactToUpgrade = "Contact us to upgrade or customize your plan"
maxUsers = "Max Users"
upTo = "Up to"
getLicense = "Get Server License"
upgradeToEnterprise = "Upgrade to Enterprise"
selectPeriod = "Select Billing Period"
monthlyBilling = "Monthly Billing"
yearlyBilling = "Yearly Billing"
checkoutOpened = "Checkout Opened"
checkoutInstructions = "Complete your purchase in the Stripe tab. After payment, return here and refresh the page to activate your license. You will also receive an email with your license key."
activateLicense = "Activate Your License"
[plan.static.licenseActivation]
checkoutOpened = "Checkout Opened in New Tab"
instructions = "Complete your purchase in the Stripe tab. Once your payment is complete, you will receive an email with your license key."
enterKey = "Enter your license key below to activate your plan:"
keyDescription = "Paste the license key from your email"
activate = "Activate License"
doLater = "I'll do this later"
success = "License Activated!"
successMessage = "Your license has been successfully activated. You can now close this window."
[plan.static.billingPortal]
title = "Email Verification Required"
message = "You will need to verify your email address in the Stripe billing portal. Check your email for a login link."
[plan.period]
month = "month"
perUserPerMonth = "/user/month"
[plan.free]
name = "Free"
highlight1 = "Limited Tool Usage Per week"
highlight2 = "Access to all tools"
highlight3 = "Community support"
forever = "Forever free"
included = "Included"
[plan.pro]
name = "Pro"
highlight1 = "Unlimited Tool Usage"
highlight2 = "Advanced PDF tools"
highlight3 = "No watermarks"
[plan.enterprise]
name = "Enterprise"
highlight1 = "Custom pricing"
highlight2 = "Dedicated support"
highlight3 = "Latest features"
requiresServer = "Requires Server"
requiresServerMessage = "Please upgrade to the Server plan first before upgrading to Enterprise."
[plan.feature]
title = "Feature"
pdfTools = "Basic PDF Tools"
fileSize = "File Size Limit"
automation = "Automate tool workflows"
api = "API Access"
priority = "Priority Support"
customPricing = "Custom Pricing"
[plan.licenseWarning]
title = "Free self-hosted limit reached"
body = "You have {{total}} users but the free tier only supports {{limit}} per server. Upgrade to keep Stirling PDF running smoothly."
overLimit = "more than {{limit}}"
cta = "See plans"
[subscription]
renewsOn = "Renews on {{date}}"
cancelsOn = "Cancels on {{date}}"
[subscription.status]
active = "Active"
pastDue = "Past Due"
canceled = "Canceled"
incomplete = "Incomplete"
trialing = "Trial"
none = "No Subscription"
[billing]
manageBilling = "Manage Billing"
updateSeats = "Update Seats"
updateEnterpriseSeats = "Update Enterprise Seats"
currentSeats = "Current Seats"
minimumSeats = "Minimum Seats"
basedOnUsers = "(current users)"
newSeatCount = "New Seat Count"
newSeatCountDescription = "Select the number of seats for your enterprise licence"
whatHappensNext = "What happens next?"
stripePortalRedirect = "You will be redirected to Stripe's billing portal to review and confirm the seat change. The prorated amount will be calculated automatically."
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}}"
updateProcessing = "Update Processing"
updateProcessingMessage = "Your seat update is being processed. Please refresh in a few moments."
notEnterprise = "Seat management is only available for enterprise licences"
[billing.portal]
error = "Failed to open billing portal"
[upgradeBanner]
title = "Upgrade to Server Plan"
message = "Get the most out of Stirling PDF with unlimited users and advanced features"
upgradeButton = "Upgrade Now"
dismiss = "Dismiss banner"
attentionTitle = "This server needs admin attention"
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."
seeInfo = "See info"
[payment]
preparing = "Preparing your checkout..."
redirecting = "Redirecting to secure checkout..."
upgradeTitle = "Upgrade to {{planName}}"
success = "Payment Successful!"
successMessage = "Your subscription has been activated successfully. You will receive a confirmation email shortly."
autoClose = "This window will close automatically..."
error = "Payment Error"
upgradeSuccess = "Payment successful! Your subscription has been upgraded. The license has been updated on your server. You will receive a confirmation email shortly."
paymentSuccess = "Payment successful! Retrieving 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."
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."
syncError = "Payment successful but license sync failed. Your license will be updated shortly. Please contact support if issues persist."
licenseSaveError = "Failed to save license key. Please contact support with your license key to complete activation."
paymentCanceled = "Payment was canceled. No charges were made."
syncingLicense = "Syncing your upgraded license..."
generatingLicense = "Generating your license key..."
upgradeComplete = "Upgrade Complete"
upgradeCompleteMessage = "Your subscription has been upgraded successfully. Your existing license key has been updated."
stripeNotConfigured = "Stripe Not Configured"
stripeNotConfiguredMessage = "Stripe payment integration is not configured. Please contact your administrator."
monthly = "Monthly"
yearly = "Yearly"
billingPeriod = "Billing Period"
enterpriseNote = "Seats can be adjusted in checkout (1-1000)."
installationId = "Installation ID"
licenseKey = "Your License Key"
licenseInstructions = "This has been added to your installation. You will receive a copy in your email as well."
canCloseWindow = "You can now close this window."
licenseKeyProcessing = "License Key Processing"
licenseDelayedMessage = "Your license key is being generated. Please check your email shortly or contact support."
perYear = "/year"
perMonth = "/month"
emailInvalid = "Please enter a valid email address"
[payment.emailStage]
title = "Enter Your Email"
description = "We'll use this to send your license key and receipts."
emailLabel = "Email Address"
emailPlaceholder = "[email protected]"
continue = "Continue"
modalTitle = "Get Started - {{planName}}"
[payment.planStage]
title = "Choose Your Billing Period"
savingsNote = "Save {{percent}}% with annual billing"
basePrice = "Base Price"
seatPrice = "Per Seat"
totalForSeats = "Total ({{count}} seats)"
selectMonthly = "Select Monthly"
selectYearly = "Select Yearly"
savePercent = "Save {{percent}}%"
savingsAmount = "You save {{amount}}"
modalTitle = "Select Billing Period - {{planName}}"
billedYearly = "Billed yearly at {{currency}}{{amount}}"
[payment.paymentStage]
backToPlan = "Back to Plan Selection"
selectedPlan = "Selected Plan"
modalTitle = "Complete Payment - {{planName}}"
[firstLogin]
title = "First Time Login"
welcomeTitle = "Welcome!"
welcomeMessage = "For security reasons, you must change your password on your first login."
loggedInAs = "Logged in as"
error = "Error"
currentPassword = "Current Password"
enterCurrentPassword = "Enter your current password"
newPassword = "New Password"
enterNewPassword = "Enter new password (min 8 characters)"
confirmPassword = "Confirm New Password"
reEnterNewPassword = "Re-enter new password"
changePassword = "Change Password"
allFieldsRequired = "All fields are required"
passwordsDoNotMatch = "New passwords do not match"
passwordTooShort = "Password must be at least 8 characters"
passwordMustBeDifferent = "New password must be different from current password"
passwordChangedSuccess = "Password changed successfully! Please log in again."
passwordChangeFailed = "Failed to change password. Please check your current password."
[invite]
welcome = "Welcome to Stirling PDF"
invalidToken = "Invalid invitation link"
validationError = "Failed to validate invitation link"
passwordRequired = "Password is required"
passwordTooShort = "Password must be at least 6 characters"
passwordMismatch = "Passwords do not match"
acceptError = "Failed to create account"
validating = "Validating invitation..."
invalidInvitation = "Invalid Invitation"
goToLogin = "Go to Login"
welcomeTitle = "You've been invited!"
welcomeSubtitle = "Complete your account setup to get started"
accountFor = "Creating account for"
linkExpires = "Link expires"
email = "Email address"
emailPlaceholder = "Enter your email address"
emailRequired = "Email address is required"
invalidEmail = "Invalid email address"
choosePassword = "Choose a password"
passwordPlaceholder = "Enter your password"
confirmPassword = "Confirm password"
confirmPasswordPlaceholder = "Re-enter your password"
createAccount = "Create Account"
creating = "Creating Account..."
alreadyHaveAccount = "Already have an account?"
signIn = "Sign in"
[audit]
notAvailable = "Audit system not available"
notAvailableMessage = "The audit system is not configured or not available."
disabled = "Audit logging is disabled"
disabledMessage = "Enable audit logging in your application configuration to track system events."
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."
[audit.error]
title = "Error loading audit system"
[audit.systemStatus]
title = "System Status"
status = "Audit Logging"
enabled = "Enabled"
disabled = "Disabled"
level = "Audit Level"
retention = "Retention Period"
days = "days"
totalEvents = "Total Events"
[audit.tabs]
dashboard = "Dashboard"
events = "Audit Events"
export = "Export"
[audit.charts]
title = "Audit Dashboard"
error = "Error loading charts"
day = "Day"
week = "Week"
month = "Month"
byType = "Events by Type"
byUser = "Events by User"
overTime = "Events Over Time"
[audit.events]
title = "Audit Events"
filterByType = "Filter by type"
filterByUser = "Filter by user"
startDate = "Start date"
endDate = "End date"
clearFilters = "Clear"
error = "Error loading events"
noEvents = "No events found"
timestamp = "Timestamp"
type = "Type"
user = "User"
ipAddress = "IP Address"
actions = "Actions"
viewDetails = "View Details"
eventDetails = "Event Details"
details = "Details"
[audit.export]
title = "Export Audit Data"
description = "Export audit events to CSV or JSON format. Use filters to limit the exported data."
format = "Export Format"
filters = "Filters (Optional)"
filterByType = "Filter by type"
filterByUser = "Filter by user"
startDate = "Start date"
endDate = "End date"
clearFilters = "Clear"
exportButton = "Export Data"
error = "Failed to export data"
[usage]
noData = "No data available"
error = "Error loading usage statistics"
noDataMessage = "No usage statistics are currently available."
[usage.controls]
top10 = "Top 10"
top20 = "Top 20"
all = "All"
refresh = "Refresh"
dataTypeLabel = "Data Type:"
[usage.controls.dataType]
all = "All"
api = "API"
ui = "UI"
[usage.showing]
top10 = "Top 10"
top20 = "Top 20"
all = "All"
[usage.stats]
totalEndpoints = "Total Endpoints"
totalVisits = "Total Visits"
showing = "Showing"
selectedVisits = "Selected Visits"
[usage.chart]
title = "Endpoint Usage Chart"
[usage.table]
title = "Detailed Statistics"
endpoint = "Endpoint"
visits = "Visits"
percentage = "Percentage"
noData = "No data available"
unknownEndpoint = "Unknown endpoint"
[backendHealth]
checking = "Checking backend status..."
online = "Backend Online"
offline = "Backend Offline"
starting = "Backend starting up..."
wait = "Please wait for the backend to finish launching and try again."
[encryptedPdfUnlock]
unlockPrompt = "Unlock PDF to continue"
title = "Remove password to continue"
description = "This PDF is password protected. Enter the password so you can continue working with it."
skip = "Skip for now"
unlock = "Unlock & Continue"
incorrectPassword = "Incorrect password"
missingFile = "The selected file is no longer available."
emptyResponse = "Password removal did not produce a file."
required = "Enter the password to continue."
successTitle = "Password removed"
successBodyWithName = "Password removed from {{fileName}}"
successBody = "Password removed successfully."
[encryptedPdfUnlock.password]
label = "PDF password"
placeholder = "Enter the PDF password"
[setup]
welcome = "Welcome to Stirling PDF"
description = "Get started by choosing how you want to use Stirling PDF"
[setup.step1]
label = "Choose Mode"
description = "Offline or Server"
[setup.step2]
label = "Select Server"
description = "Self-hosted server"
[setup.step3]
label = "Login"
description = "Enter credentials"
[setup.mode.saas]
title = "Stirling Cloud"
description = "Sign in with your Stirling account"
[setup.mode.selfhosted]
title = "Self-Hosted Server"
description = "Connect to your own Stirling PDF server with your personal account"
[setup.saas]
title = "Sign in to Stirling"
subtitle = "Sign in with your Stirling account"
[setup.selfhosted]
title = "Sign in to Server"
subtitle = "Enter your server credentials"
link = "or connect to a self-hosted account"
[setup.server]
title = "Connect to Server"
subtitle = "Enter your self-hosted server URL"
testing = "Testing connection..."
[setup.server.type]
saas = "Stirling PDF SaaS"
selfhosted = "Self-hosted server"
[setup.server.url]
label = "Server URL"
description = "Enter the full URL of your self-hosted Stirling PDF server"
[setup.server.error]
emptyUrl = "Please enter a server URL"
invalidUrl = "Invalid URL format. Please enter a valid URL like https://your-server.com"
unreachable = "Could not connect to server"
testFailed = "Connection test failed"
configFetch = "Failed to fetch server configuration. Please check the URL and try again."
[setup.server.error.securityDisabled]
title = "Login Not Enabled"
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"
[setup.login]
title = "Sign In"
subtitle = "Enter your credentials to continue"
connectingTo = "Connecting to:"
submit = "Login"
signInWith = "Sign in with"
oauthPending = "Opening browser for authentication..."
sso = "Single Sign-On"
orContinueWith = "Or continue with email"
serverRequirement = "Note: The server must have login enabled."
showInstructions = "How to enable?"
hideInstructions = "Hide instructions"
instructions = "To enable login on your Stirling PDF server:"
instructionsEnvVar = "Set the environment variable:"
instructionsOrYml = "Or in settings.yml:"
instructionsRestart = "Then restart your server for the changes to take effect."
[setup.login.username]
label = "Username"
placeholder = "Enter your username"
[setup.login.email]
label = "Email"
placeholder = "Enter your email"
[setup.login.password]
label = "Password"
placeholder = "Enter your password"
[setup.login.error]
emptyUsername = "Please enter your username"
emptyEmail = "Please enter your email"
emptyPassword = "Please enter your password"
oauthFailed = "OAuth login failed. Please try again."
[oauth.success]
title = "Authentication Successful"
message = "You can close this window and return to Stirling PDF."
[oauth.error]
title = "Authentication Failed"
message = "Authentication was not successful. You can close this window and try again."
[pdfTextEditor]
title = "PDF Text Editor"
viewLabel = "PDF Editor"
converting = "Converting PDF to editable format..."
conversionFailed = "Failed to convert PDF. Please try again."
currentFile = "Current file: {{name}}"
pageSummary = "Page {{number}} of {{total}}"
pagePreviewAlt = "Page preview"
imageLabel = "Placed image"
noTextOnPage = "No editable text was detected on this page."
[pdfTextEditor.pageType]
paragraph = "Paragraph page"
sparse = "Sparse text"
[pdfTextEditor.groupingMode]
auto = "Auto"
paragraph = "Paragraph"
singleLine = "Single Line"
[pdfTextEditor.badges]
unsaved = "Edited"
modified = "Edited"
earlyAccess = "Early Access"
[pdfTextEditor.actions]
reset = "Reset Changes"
downloadJson = "Download JSON"
generatePdf = "Generate PDF"
saveChanges = "Save Changes"
applyChanges = "Apply Changes"
downloadCopy = "Download Copy"
[pdfTextEditor.options.autoScaleText]
title = "Auto-scale text to fit boxes"
description = "Automatically scales text horizontally to fit within its original bounding box when font rendering differs from PDF."
[pdfTextEditor.options.groupingMode]
title = "Text Grouping Mode"
autoDescription = "Automatically detects page type and groups text appropriately."
paragraphDescription = "Groups aligned lines into multi-line paragraph text boxes."
singleLineDescription = "Keeps each PDF text line as a separate text box."
[pdfTextEditor.options.manualGrouping]
descriptionInline = "Tip: Hold Ctrl (Cmd) or Shift to multi-select text boxes. A floating toolbar will appear above the selection so you can merge, ungroup, or adjust widths."
[pdfTextEditor.options.forceSingleElement]
title = "Lock edited text to a single PDF element"
description = "When enabled, the editor exports each edited text box as one PDF text element to avoid overlapping glyphs or mixed fonts."
[pdfTextEditor.options.advanced]
title = "Advanced Settings"
[pdfTextEditor.tooltip.header]
title = "Preview Limitations"
[pdfTextEditor.tooltip.textFocus]
title = "Text and Image Focus"
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."
[pdfTextEditor.tooltip.previewVariance]
title = "Preview Variance"
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."
[pdfTextEditor.tooltip.alpha]
title = "Alpha Viewer"
text = "This alpha viewer is still evolving—certain fonts, colours, transparency effects, and layout details may shift slightly. Please double-check the generated PDF before sharing."
[pdfTextEditor.manual]
mergeTooltip = "Merge selected boxes"
merge = "Merge selection"
ungroupTooltip = "Split paragraph back into lines"
ungroup = "Ungroup selection"
widthMenu = "Width options"
expandWidth = "Expand to page edge"
resetWidth = "Reset width"
resizeHandle = "Adjust text width"
[pdfTextEditor.disclaimer]
heading = "Preview Limitations"
textFocus = "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."
previewVariance = "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."
alpha = "This alpha viewer is still evolving—certain fonts, colours, transparency effects, and layout details may shift slightly. Please double-check the generated PDF before sharing."
[pdfTextEditor.empty]
title = "No document loaded"
subtitle = "Load a PDF or JSON file to begin editing text content."
dropzone = "Drag and drop a PDF here, or click to browse"
dropzoneWithFiles = "Select a file from the Files tab, or drag and drop a PDF here, or click to browse"
[pdfTextEditor.welcomeBanner]
title = "Welcome to PDF Text Editor (Early Access)"
experimental = "This is an experimental feature in active development. Expect some instability and issues during use."
howItWorks = "This tool converts your PDF to an editable format where you can modify text content and reposition images. Changes are saved back as a new PDF."
bestFor = "Works Best With:"
bestFor1 = "Simple PDFs containing primarily text and images"
bestFor2 = "Documents with standard paragraph formatting"
bestFor3 = "Letters, essays, reports, and basic documents"
notIdealFor = "Not Ideal For:"
notIdealFor1 = "PDFs with special formatting like bullet points, tables, or multi-column layouts"
notIdealFor2 = "Magazines, brochures, or heavily designed documents"
notIdealFor3 = "Instruction manuals with complex layouts"
limitations = "Current Limitations:"
limitation1 = "Font rendering may differ slightly from the original PDF"
limitation2 = "Complex graphics, form fields, and annotations are preserved but not editable"
limitation3 = "Large files may take time to convert and process"
knownIssues = "Known Issues (Being Fixed):"
issue1 = "Text colour is not currently preserved (will be added soon)"
issue2 = "Paragraph mode has more alignment and spacing issues - Single Line mode recommended"
issue3 = "The preview display differs from the exported PDF - exported PDFs are closer to the original"
issue4 = "Rotated text alignment may need manual adjustment"
issue5 = "Transparency and layering effects may vary from original"
feedback = "This is an early access feature. Please report any issues you encounter to help us improve!"
gotIt = "Got it"
dontShowAgain = "Don't show again"
[pdfTextEditor.modeChange]
title = "Confirm Mode Change"
warning = "Changing the text grouping mode will reset all unsaved changes. Are you sure you want to continue?"
cancel = "Cancel"
confirm = "Reset and Change Mode"
[pdfTextEditor.fontAnalysis]
details = "Font Details"
embedded = "Embedded"
type = "Type"
webFormat = "Web Format"
warnings = "Warnings"
suggestions = "Notes"
currentPageFonts = "Fonts on this page"
allFonts = "All fonts"
fallback = "fallback"
missing = "missing"
perfectMessage = "All fonts can be reproduced perfectly."
warningMessage = "Some fonts may not render correctly."
infoMessage = "Font reproduction information available."
perfect = "perfect"
subset = "subset"
[pdfTextEditor.errors]
invalidJson = "Unable to read the JSON file. Ensure it was generated by the PDF to JSON tool."
pdfConversion = "Unable to convert the edited JSON back into a PDF."
[auth]
sessionExpired = "Session Expired"
pleaseLoginAgain = "Please login again."
accessDenied = "Access Denied"
insufficientPermissions = "You do not have permission to perform this action."
[addText]
title = "Add Text"
header = "Add text to PDFs"
tags = "text,annotation,label"
applySignatures = "Apply Text"
[addText.text]
name = "Text content"
placeholder = "Enter the text you want to add"
fontLabel = "Font"
fontSizeLabel = "Font size"
fontSizePlaceholder = "Type or select font size (8-200)"
colorLabel = "Text colour"
[addText.steps]
configure = "Configure Text"
[addText.step]
createDesc = "Enter the text you want to add"
place = "Place text"
placeDesc = "Click on the PDF to add your text"
[addText.instructions]
title = "How to add text"
text = "After entering your text above, click anywhere on the PDF to place it."
paused = "Placement paused"
resumeHint = "Resume placement to click and add your text."
noSignature = "Enter text above to enable placement."
[addText.mode]
move = "Move Text"
place = "Place Text"
pause = "Pause placement"
resume = "Resume placement"
[addText.results]
title = "Add Text Results"
[addText.error]
failed = "An error occurred while adding text to the PDF."
[mobileUpload]
title = "Upload from Mobile"
description = "Scan to upload photos. Images auto-convert to PDF."
descriptionNoConvert = "Scan to upload photos from your mobile device."
error = "Connection Error"
pollingError = "Error checking for files"
sessionId = "Session ID"
sessionCreateError = "Failed to create session"
expiryWarning = "Session Expiring Soon"
expiryWarningMessage = "This QR code will expire in {{seconds}} seconds. A new code will be generated automatically."
filesReceived = "{{count}} file(s) received"
connected = "Mobile device connected"
instructions = "Scan with your phone camera. Images convert to PDF automatically."
instructionsNoConvert = "Scan with your phone camera to upload files."
[mobileScanner]
title = "Mobile Scanner"
noSession = "Invalid Session"
noSessionMessage = "Please scan a valid QR code to access this page."
validating = "Validating session..."
sessionInvalid = "Session Error"
sessionExpired = "This session has expired. Please refresh and try again."
sessionNotFound = "Session not found. Please refresh and try again."
sessionValidationError = "Unable to verify session. Please try again."
uploadSuccess = "Upload Successful!"
uploadSuccessMessage = "Your images have been transferred."
httpsRequired = "Camera access requires HTTPS or localhost. Please use HTTPS or access via localhost."
uploadFailed = "Upload failed. Please try again."
uploading = "Uploading..."
connected = "Connected"
connecting = "Connecting..."
chooseMethod = "Choose Upload Method"
chooseMethodDescription = "Select how you want to scan and upload documents"
camera = "Camera"
cameraDescription = "Scan documents using your device camera with automatic edge detection"
fileUpload = "File Upload"
fileDescription = "Upload existing photos or documents from your device"
cameraAccessDenied = "Camera access denied. Please enable camera access."
back = "Back"
settings = "Settings"
edgeDetection = "Edge Detection"
flashlight = "Flashlight"
flash = "Flash"
processing = "Processing..."
capture = "Capture Photo"
selectFilesPrompt = "Select files to upload"
selectImage = "Select Image"
preview = "Preview"
retake = "Retake"
addToBatch = "Add to Batch"
upload = "Upload"
batchImages = "Batch"
clearBatch = "Clear"
uploadAll = "Upload All"