Add server-side folders and files page UI (#6383)

This commit is contained in:
Anthony Stirling
2026-05-27 12:52:46 +01:00
committed by GitHub
parent 4564ed5bec
commit d42b779644
90 changed files with 14720 additions and 663 deletions
@@ -1467,7 +1467,7 @@ settingsOverview = "This is the <strong>Settings Panel</strong>. Admin settings
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."
teamsAndUsers = "Manage <strong>Teams</strong> and individual users here. You can invite new users via email, shareable links, or create custom accounts for them yourself."
welcome = "Welcome to the <strong>Admin Tour</strong>! Let's explore the powerful enterprise features and settings available to system administrators."
wrapUp = "That's the admin tour! You've seen the enterprise features that make Stirling PDF a powerful, customisable solution for organisations. You can replay it anytime just open <strong>Settings</strong> and find it here in the <strong>Tours</strong> section under Help."
wrapUp = "That's the admin tour! You've seen the enterprise features that make Stirling PDF a powerful, customisable solution for organisations. You can replay it anytime - just open <strong>Settings</strong> and find it here in the <strong>Tours</strong> section under Help."
[adminUserSettings]
actions = "Actions"
@@ -1525,7 +1525,7 @@ comment = "Comment"
comments = "Comments"
contents = "Text"
delete = "Delete"
desc = "Use highlight, pen, text, and notes. Changes stay liveno flattening required."
desc = "Use highlight, pen, text, and notes. Changes stay live-no flattening required."
drawing = "Drawing"
duplicate = "Duplicate"
editCircle = "Edit Circle"
@@ -1851,6 +1851,13 @@ label = "Open menu for {{title}}"
[automate.files]
placeholder = "Select files to process with this automation"
[automate.folderScanWarning]
advice = "You can still download the file (e.g. to inspect or hand-edit it), but the unsupported steps will need to be removed before the backend can run it."
cancel = "Cancel"
confirm = "Export anyway"
intro = "Folder scanning runs on the backend, so it can only execute tools that have a backend endpoint. The following step(s) in this automation do not, and will fail when the pipeline runs:"
title = "Some steps cannot run in folder scanning"
[automate.importModal]
cancel = "Cancel"
confirm = "Import"
@@ -2082,9 +2089,9 @@ placeholder = "Number of pages"
title = "Last N Pages"
[bulkSelection.operators]
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)"
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)"
text = "AND has higher precedence than comma. NOT applies within the document range."
title = "Operators"
@@ -2780,8 +2787,8 @@ title = "These PDFs look highly different"
[compare.edited]
label = "Edited PDF"
selectBaseFirst = "Select original PDF first"
placeholder = "Select the edited PDF"
selectBaseFirst = "Select original PDF first"
[compare.error]
filesMissing = "Unable to locate the selected files. Please re-select them."
@@ -2862,9 +2869,9 @@ pageLabel = "Page"
[compare.swap]
confirm = "Swap and Re-run"
label = "Swap"
confirmBody = "This will rerun the tool. Are you sure you want to swap the order of Original and Edited?"
confirmTitle = "Re-run comparison?"
label = "Swap"
[compare.toasts]
unlinkedBody = "Tip: Arrow Up/Down scroll both panes; panning only moves the active pane."
@@ -3184,7 +3191,7 @@ showPreferencesBtn = "Manage preferences"
title = "How we use Cookies"
[cookieBanner.popUp.description]
1 = "We use cookies and other technologies to make Stirling PDF work better for youhelping us improve our tools and keep building features you'll love."
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]
@@ -3197,16 +3204,16 @@ subtitle = "Cookie Usage"
title = "Consent Preferences Center"
[cookieBanner.preferencesModal.analytics]
description = "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assuredStirling PDF cannot and will never track the content of the documents you work with."
description = "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured-Stirling PDF cannot and will never track the content of the documents you work with."
title = "Analytics"
[cookieBanner.preferencesModal.description]
1 = "Stirling PDF uses cookies and similar technologies to enhance your experience and understand how our tools are used. This helps us improve performance, develop the features you care about, and provide ongoing support to our users."
2 = "Stirling PDF cannotand will nevertrack or access the content of the documents you use."
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 formswhich is why they can't be turned off."
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"
@@ -3759,13 +3766,209 @@ expand = "Expand sidebar"
files = "Files"
googleDrive = "Google Drive"
googleDriveDisabled = "Google Drive is not configured"
leaveMyFiles = "Leave My Files"
myFiles = "My Files"
noFiles = "No files yet"
openFileManager = "Open file manager"
openFileManager = "Browse all files & folders"
openFromComputer = "Open from computer"
openSettings = "Open settings"
search = "Search"
searchPlaceholder = "Search files..."
[filesPage]
addToWorkspace = "Add to workspace"
addToWorkspaceCount = "Add {{count}} to workspace"
allFiles = "All files"
back = "Back"
backToFolder = "Back to {{folder}}"
backToMyFiles = "Back to My Files"
breadcrumbs = "Folder path"
cancel = "Cancel"
clearSearch = "Clear search"
clearSelection = "Clear selection"
closeDetails = "Close details"
create = "Create"
cycleBlocked = "Can't move a folder into one of its own subfolders."
delete = "Delete"
deleteFolder = "Delete folder"
deleteFolderBody = "Delete folder \"{{name}}\"?"
deleteFolderConfirm = "Delete folder \"{{name}}\"? Files inside will be moved to All files. {{count}} file(s) affected."
deleteFolderContents = "Also delete {{count}} file(s) inside the folder"
deleteFolderContentsWarning = "Files will be permanently removed and cannot be recovered."
deleteFolderError = "Could not delete the folder. Try again."
deleteFolderKeepHint = "Files inside will be moved to All files."
deleteFolderTitle = "Delete folder?"
deselectAll = "Clear selection"
details = "Details"
detailsCount = "{{count}} files selected"
dismissError = "Dismiss"
download = "Download"
downloadAll = "Download all"
downloadVersion = "Download this version"
dropOverlay = "Drop files to upload"
dropOverlaySub = "Files start in Local. Use 'Move to' or 'Save to cloud' to organise them into a folder."
file = "File"
fileMenu = "File actions"
folder = "Folder"
folderItems = "{{count}} items"
folderMenu = "Folder actions"
inPath = "in {{path}}"
inWorkspace = "Open"
inWorkspaceAria = "Already in workspace"
loading = "Loading…"
localFoldersUnavailable = "Folders are cloud-only - save a file to the cloud to organise it."
moreActions = "More folder actions"
moveLocalToCloudBlocked = "Local-only files can't be moved into cloud folders. Save them to the cloud first."
moveSkippedRemote = "{{count}} file(s) couldn't be moved on the server (no permission or already deleted)."
moveTo = "Move to…"
myFiles = "My Files"
newFolder = "New folder"
newFolderStorageDisabled = "Server folder storage isn't enabled. Ask your admin to turn it on."
newFolderTabUnavailable = "Switch to All or Cloud to create folders."
newRootFolder = "New folder at root"
offlineNoFolderEdits = "Server folder sync unavailable - folder changes are disabled. Check sign-in and storage configuration."
open = "Open"
openInWorkbench = "Open in workbench"
openVersionInWorkspace = "Open in workspace"
originFilter = "Filter by source"
quickView = "Quick view"
refresh = "Refresh from server"
remove = "Delete"
removeConfirm = "Delete {{count}} file(s)? This cannot be undone."
removeVersion = "Remove this version"
rename = "Rename"
renameFolder = "Rename folder"
resizeFolderTree = "Resize folder tree (arrow keys, Shift for bigger steps; double-click to auto-fit)"
save = "Save"
saveToServer = "Save to server"
search = "Search"
searchPlaceholder = "Search this folder & subfolders"
selectAll = "Select all"
selectAllHint = "Click to select all. Tip: hold Ctrl (or Cmd) to add files one at a time, Shift to select a range."
selectedCount = "{{count}} selected"
selectFile = "Select file {{name}}"
shareDisabledHint = "File sharing isn't enabled on this server. Ask your admin to set storage.sharing.enabled=true to turn on share links and per-user access."
shareManage = "Manage sharing"
showDetails = "Show details"
summary = "{{count}} items"
syncFailed = "Folder sync failed: {{message}}"
syncPartial = "Folder sync partial: {{failed}} of {{total}} folders could not be merged."
tree = "Folders"
upload = "Upload"
uploadedToLocal = "Uploaded files start in Local. Use 'Save to cloud' to put them in a folder."
versionActions = "Version actions"
versionCollapse = "Collapse middle versions"
versionOrigin = "Original upload"
versionsCount = "{{count}} versions"
versionShowHidden = "Show {{count}} earlier versions"
viewVersion = "View this version"
appearance.colour = "Colour"
appearance.icon = "Icon"
appearance.title = "Appearance"
appearance.useColour = "Use colour {{c}}"
column.modified = "Modified"
column.name = "Name"
column.size = "Size"
column.type = "Type"
empty.hint = "Drop PDFs anywhere on this page to upload, or use the New folder button to organise your files."
empty.newFolderCta = "Create folder"
empty.title = "This folder is empty"
empty.uploadCta = "Upload files"
empty.cloud.hint = "Upload a file to start, or create a folder to organise."
empty.cloud.offlineHint = "Reconnect to load your cloud library."
empty.cloud.offlineTitle = "No cached cloud files"
empty.cloud.title = "No cloud files yet"
empty.imSharing.hint = "Invite a teammate to one of your files to see it listed here."
empty.imSharing.title = "Not sharing with anyone yet"
empty.local.hint = "Files saved without uploading stay here. Drop a file to add one."
empty.local.title = "No local-only files"
empty.recent.hint = "Files you open or edit will appear here."
empty.recent.title = "Nothing modified yet"
empty.shared.hint = "When someone shares a file via link, it appears here."
empty.shared.title = "Nothing shared with you"
empty.sharedByMe.hint = "Create a share link on any of your files to surface it here."
empty.sharedByMe.title = "No share links yet"
error.actionFailed = "Could not {{action}}."
error.actionFailedDetail = "Could not {{action}}: {{message}}"
error.deleteFolderFailed = "Could not delete folder."
error.deleteFolderFailedDetail = "Could not delete folder: {{message}}"
error.folderAppearanceFailed = "Could not update folder appearance."
error.folderAppearanceFailedDetail = "Could not update folder appearance: {{message}}"
error.moveFilesFailed = "Could not move files."
error.moveFilesFailedDetail = "Could not move files: {{message}}"
error.moveFolderFailed = "Could not move folder."
error.moveFolderFailedDetail = "Could not move folder: {{message}}"
error.removeFilesFailed = "Could not remove files."
error.removeFilesFailedDetail = "Could not remove files: {{message}}"
error.uploadFilesFailed = "Could not upload files."
error.uploadFilesFailedDetail = "Could not upload files: {{message}}"
field.added = "Added"
field.count = "Files"
field.folder = "Folder"
field.modified = "Modified"
field.name = "Name"
field.size = "Size"
field.toolHistory = "Tool history"
field.toolHistoryAtVersion = "Cumulative tool chain"
field.totalSize = "Total size"
field.type = "Type"
field.versionHistory = "Version journey"
folderName.cancel = "Cancel"
folderName.error = "Could not save folder. Try again."
folderName.label = "Folder name"
folderName.placeholder = "Folder name"
moveDialog.cancel = "Cancel"
moveDialog.confirm = "Move here"
moveDialog.error = "Could not move. Try again."
moveDialog.hint = "Pick a destination folder. Tip: you can also drag and drop files onto folders in the tree on the left."
moveDialog.newFolderCancel = "Discard"
moveDialog.newFolderCreate = "Create"
moveDialog.newFolderError = "Could not create folder. Try again."
moveDialog.newFolderLabel = "New folder name"
moveDialog.newFolderPlaceholder = "Folder name"
moveDialog.newFolderToggle = "Create new folder…"
moveDialog.title = "Move to folder"
origin.all = "All sources"
origin.cloud = "Cloud"
origin.cloudHint = "Stored on the Stirling server"
origin.local = "Local"
origin.localHint = "Only stored in this browser"
origin.shared = "Shared"
origin.sharedHint = "Shared with you via link"
sort.modifiedAsc = "Oldest first"
sort.modifiedDesc = "Recent first"
sort.nameAsc = "Name A→Z"
sort.nameDesc = "Name Z→A"
sort.sizeAsc = "Smallest first"
sort.sizeDesc = "Largest first"
syncError.client = "Folder sync failed."
syncError.network = "Could not reach the server."
syncError.server = "Server error during folder sync."
tabName.imSharing = "I'm sharing"
tabName.local = "Local"
tabName.recent = "Recent"
tabName.shared = "Shared with me"
tabName.sharedByMe = "Shared by me"
tabs.all = "All"
tabs.ariaLabel = "File views"
tabs.cloud = "Cloud"
tabs.imSharing = "I'm sharing"
tabs.local = "Local"
tabs.recent = "Recent"
tabs.shared = "Shared with me"
tabs.sharedByMe = "Shared by me"
treeMenu.actions = "Folder actions for {{name}}"
treeMenu.collapse = "Collapse folder"
treeMenu.delete = "Delete folder"
treeMenu.expand = "Expand folder"
treeMenu.newSubfolder = "New subfolder"
treeMenu.rename = "Rename"
typeFilter.allTypes = "All types"
typeFilter.label = "Filter by type"
viewMode.grid = "Grid view"
viewMode.label = "View mode"
viewMode.list = "List view"
[fileToPDF]
credit = "This service uses LibreOffice and Unoconv for file conversion."
header = "Convert any file to PDF"
@@ -4904,7 +5107,7 @@ toolInterface = "This is the <strong>Crop</strong> tool interface. As you can se
viewer = "The <strong>Viewer</strong> lets you read and annotate your PDFs."
viewSwitcher = "Use these controls to select how you want to view your PDFs."
workbench = "This is the <strong>Workbench</strong> - the main area where you view and edit your PDFs."
wrapUp = "You're all set! You can replay this tour anytime just open <strong>Settings</strong> and find it here in the <strong>Tours</strong> section under Help."
wrapUp = "You're all set! You can replay this tour anytime - just open <strong>Settings</strong> and find it here in the <strong>Tours</strong> section under Help."
[onboarding.buttons]
back = "Back"
@@ -5244,9 +5447,9 @@ description = "Use n in formulas for patterns."
title = "Mathematical Functions"
[pageSelection.tooltip.operators]
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)"
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)"
text = "AND has higher precedence than comma. NOT applies within the document range."
title = "Operators"
@@ -5434,7 +5637,7 @@ modified = "Edited"
unsaved = "Edited"
[pdfTextEditor.disclaimer]
alpha = "This alpha viewer is still evolvingcertain fonts, colours, transparency effects, and layout details may shift slightly. Please double-check the generated PDF before sharing."
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."
heading = "Preview Limitations"
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."
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."
@@ -5512,7 +5715,7 @@ paragraph = "Paragraph page"
sparse = "Sparse text"
[pdfTextEditor.tooltip.alpha]
text = "This alpha viewer is still evolvingcertain fonts, colours, transparency effects, and layout details may shift slightly. Please double-check the generated PDF before sharing."
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."
title = "Alpha Viewer"
[pdfTextEditor.tooltip.header]
@@ -6569,51 +6772,6 @@ title = "High Contrast"
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."
title = "Invert All Colours"
[workbenchBar]
annotations = "Annotations"
applyRedactionsFirst = "Apply redactions first"
closeAll = "Close All Files"
closePdf = "Close PDF"
closeSelected = "Close Selected Files"
deleteSelected = "Delete Selected Pages"
deselectAll = "Deselect All"
downloadAll = "Download All"
downloadSelected = "Download Selected Files"
draw = "Draw"
exitRedaction = "Exit Redaction Mode"
exportAll = "Export PDF"
exportSelected = "Export Selected Pages"
formFill = "Fill Form"
language = "Language"
panMode = "Pan Mode"
print = "Print PDF"
readAloud = "Read Aloud"
readAloudLanguage = "Language"
readAloudSpeed = "Speed"
redact = "Redact"
rotateLeft = "Rotate Left"
rotateRight = "Rotate Right"
ruler = "Ruler / Measure"
save = "Save"
saveAll = "Save All"
saveAs = "Save As"
saveChanges = "Save Changes"
search = "Search PDF"
selectAll = "Select All"
selectByNumber = "Select by Page Numbers"
selectLanguage = "Select language"
share = "Share"
toggleAnnotations = "Toggle Annotations Visibility"
toggleAttachments = "Toggle Attachments"
toggleBookmarks = "Toggle Bookmarks"
toggleComments = "Comments"
toggleLayers = "Toggle Layers"
toggleSidebar = "Toggle Sidebar"
toggleTheme = "Toggle Theme"
activeFiles = "Active Files"
multiTool = "Multi-Tool"
viewer = "Viewer"
[rotate]
rotateLeft = "Rotate Anticlockwise"
rotateRight = "Rotate Clockwise"
@@ -6752,7 +6910,7 @@ useCase2 = "Split flatbed batches into separate files"
useCase3 = "Break collages into individual photos"
useCase4 = "Pull photos from documents"
whatThisDoes = "What this does"
whatThisDoesDesc = "Automatically finds and extracts each photo from a scanned page or composite imageno manual cropping."
whatThisDoesDesc = "Automatically finds and extracts each photo from a scanned page or composite image-no manual cropping."
whenToUse = "When to use"
[search]
@@ -6907,6 +7065,20 @@ auto = "Auto"
fitPage = "Fit page"
fitWidth = "Fit width"
[settings.help]
label = "Tours"
title = "Help"
[settings.help.adminTour]
description = "Explore team management, system settings, and enterprise features."
start = "Start"
title = "Admin Tour"
[settings.help.toolsTour]
description = "Walk through uploading files, picking a tool, and reviewing results."
start = "Start"
title = "Tools Tour"
[settings.hotkeys]
capturing = "Press keys… (Esc to cancel)"
change = "Change shortcut"
@@ -7038,20 +7210,6 @@ title = "Team"
enableLoginFirst = "Enable login mode first"
requiresEnterprise = "Requires Enterprise license"
[settings.help]
label = "Tours"
title = "Help"
[settings.help.adminTour]
description = "Explore team management, system settings, and enterprise features."
start = "Start"
title = "Admin Tour"
[settings.help.toolsTour]
description = "Walk through uploading files, picking a tool, and reviewing results."
start = "Start"
title = "Tools Tour"
[settings.workspace]
people = "People"
teams = "Teams"
@@ -8249,8 +8407,8 @@ csvStats = "{{rows}} rows · {{columns}} columns · {{size}}"
emptyFile = "Empty file"
fileTypeBadge = "{{type}} File"
htmlPreview = "HTML preview"
htmlPreviewWarning = "HTML preview external resources may not load · {{size}}"
invalidJson = "Invalid JSON showing raw content"
htmlPreviewWarning = "HTML preview - external resources may not load · {{size}}"
invalidJson = "Invalid JSON - showing raw content"
lineNumbers = "Line numbers"
loading = "Loading..."
renderMarkdown = "Render markdown"
@@ -8460,6 +8618,50 @@ bullet3 = "Image will be resized to fit signature area"
description = "Upload a pre-created signature image. Ideal if you have a scanned signature or company logo."
title = "Upload Signature Image"
[workbenchBar]
activeFiles = "Active Files"
annotations = "Annotations"
applyRedactionsFirst = "Apply redactions first"
closeAll = "Close All Files"
closePdf = "Close PDF"
closeSelected = "Close Selected Files"
deleteSelected = "Delete Selected Pages"
deselectAll = "Deselect All"
downloadAll = "Download All"
downloadSelected = "Download Selected Files"
draw = "Draw"
exitRedaction = "Exit Redaction Mode"
exportAll = "Export PDF"
exportSelected = "Export Selected Pages"
formFill = "Fill Form"
language = "Language"
multiTool = "Multi-Tool"
panMode = "Pan Mode"
print = "Print PDF"
readAloud = "Read Aloud"
readAloudLanguage = "Language"
readAloudSpeed = "Speed"
redact = "Redact"
rotateLeft = "Rotate Left"
rotateRight = "Rotate Right"
ruler = "Ruler / Measure"
save = "Save"
saveAll = "Save All"
saveAs = "Save As"
saveChanges = "Save Changes"
search = "Search PDF"
selectAll = "Select All"
selectByNumber = "Select by Page Numbers"
selectLanguage = "Select language"
share = "Share"
toggleAnnotations = "Toggle Annotations Visibility"
toggleAttachments = "Toggle Attachments"
toggleBookmarks = "Toggle Bookmarks"
toggleComments = "Comments"
toggleLayers = "Toggle Layers"
toggleSidebar = "Toggle Sidebar"
toggleTheme = "Toggle Theme"
viewer = "Viewer"
[workspace]
title = "Workspace"