mirror of
https://github.com/arsvendg/Stirling-PDF.git
synced 2026-07-16 19:33:11 +02:00
Merge remote-tracking branch 'origin/main' into feature/react-overhaul
This commit is contained in:
@@ -62,7 +62,7 @@ dependencies {
|
||||
exclude group: 'com.google.code.gson', module: 'gson'
|
||||
}
|
||||
implementation 'org.apache.pdfbox:jbig2-imageio:3.0.4'
|
||||
implementation 'com.opencsv:opencsv:5.11.1' // https://mvnrepository.com/artifact/com.opencsv/opencsv
|
||||
implementation 'com.opencsv:opencsv:5.11.2' // https://mvnrepository.com/artifact/com.opencsv/opencsv
|
||||
|
||||
// Batik
|
||||
implementation 'org.apache.xmlgraphics:batik-all:1.19'
|
||||
@@ -146,5 +146,10 @@ bootJar {
|
||||
}
|
||||
}
|
||||
|
||||
// Configure main class for Spring Boot
|
||||
springBoot {
|
||||
mainClass = 'stirling.software.SPDF.SPDFApplication'
|
||||
}
|
||||
|
||||
bootJar.dependsOn ':common:jar'
|
||||
bootJar.dependsOn ':proprietary:jar'
|
||||
|
||||
+225
-33
@@ -21,6 +21,8 @@ public class EndpointConfiguration {
|
||||
private final ApplicationProperties applicationProperties;
|
||||
private Map<String, Boolean> endpointStatuses = new ConcurrentHashMap<>();
|
||||
private Map<String, Set<String>> endpointGroups = new ConcurrentHashMap<>();
|
||||
private Set<String> disabledGroups = new HashSet<>();
|
||||
private Map<String, Set<String>> endpointAlternatives = new ConcurrentHashMap<>();
|
||||
private final boolean runningProOrHigher;
|
||||
|
||||
public EndpointConfiguration(
|
||||
@@ -34,13 +36,14 @@ public class EndpointConfiguration {
|
||||
|
||||
public void enableEndpoint(String endpoint) {
|
||||
endpointStatuses.put(endpoint, true);
|
||||
log.debug("Enabled endpoint: {}", endpoint);
|
||||
}
|
||||
|
||||
public void disableEndpoint(String endpoint) {
|
||||
if (!endpointStatuses.containsKey(endpoint) || endpointStatuses.get(endpoint) != false) {
|
||||
log.debug("Disabling {}", endpoint);
|
||||
endpointStatuses.put(endpoint, false);
|
||||
if (!Boolean.FALSE.equals(endpointStatuses.get(endpoint))) {
|
||||
log.debug("Disabling endpoint: {}", endpoint);
|
||||
}
|
||||
endpointStatuses.put(endpoint, false);
|
||||
}
|
||||
|
||||
public Map<String, Boolean> getEndpointStatuses() {
|
||||
@@ -48,25 +51,96 @@ public class EndpointConfiguration {
|
||||
}
|
||||
|
||||
public boolean isEndpointEnabled(String endpoint) {
|
||||
String original = endpoint;
|
||||
if (endpoint.startsWith("/")) {
|
||||
endpoint = endpoint.substring(1);
|
||||
}
|
||||
return endpointStatuses.getOrDefault(endpoint, true);
|
||||
}
|
||||
|
||||
public boolean isGroupEnabled(String group) {
|
||||
Set<String> endpoints = endpointGroups.get(group);
|
||||
if (endpoints == null || endpoints.isEmpty()) {
|
||||
log.debug("Group '{}' does not exist or has no endpoints", group);
|
||||
// Rule 1: Explicit flag wins - if disabled via disableEndpoint(), stay disabled
|
||||
Boolean explicitStatus = endpointStatuses.get(endpoint);
|
||||
if (Boolean.FALSE.equals(explicitStatus)) {
|
||||
log.debug("isEndpointEnabled('{}') -> false (explicitly disabled)", original);
|
||||
return false;
|
||||
}
|
||||
|
||||
for (String endpoint : endpoints) {
|
||||
if (!isEndpointEnabled(endpoint)) {
|
||||
// Rule 2: Functional-group override - check if endpoint belongs to any disabled functional
|
||||
// group
|
||||
for (String group : endpointGroups.keySet()) {
|
||||
if (disabledGroups.contains(group) && endpointGroups.get(group).contains(endpoint)) {
|
||||
// Skip tool groups (qpdf, OCRmyPDF, Ghostscript, LibreOffice, etc.)
|
||||
if (!isToolGroup(group)) {
|
||||
log.debug(
|
||||
"isEndpointEnabled('{}') -> false (functional group '{}' disabled)",
|
||||
original,
|
||||
group);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Rule 3: Tool-group fallback - check if at least one alternative tool group is enabled
|
||||
Set<String> alternatives = endpointAlternatives.get(endpoint);
|
||||
if (alternatives != null && !alternatives.isEmpty()) {
|
||||
boolean hasEnabledToolGroup =
|
||||
alternatives.stream()
|
||||
.anyMatch(toolGroup -> !disabledGroups.contains(toolGroup));
|
||||
log.debug(
|
||||
"isEndpointEnabled('{}') -> {} (tool groups check)",
|
||||
original,
|
||||
hasEnabledToolGroup);
|
||||
return hasEnabledToolGroup;
|
||||
}
|
||||
|
||||
// Rule 4: Single-dependency check - if no alternatives defined, check if endpoint belongs
|
||||
// to any disabled tool groups
|
||||
for (String group : endpointGroups.keySet()) {
|
||||
if (isToolGroup(group)
|
||||
&& disabledGroups.contains(group)
|
||||
&& endpointGroups.get(group).contains(endpoint)) {
|
||||
log.debug(
|
||||
"isEndpointEnabled('{}') -> false (single tool group '{}' disabled, no alternatives)",
|
||||
original,
|
||||
group);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Default: enabled if not explicitly disabled
|
||||
boolean enabled = !Boolean.FALSE.equals(explicitStatus);
|
||||
log.debug("isEndpointEnabled('{}') -> {} (default)", original, enabled);
|
||||
return enabled;
|
||||
}
|
||||
|
||||
public boolean isGroupEnabled(String group) {
|
||||
// Rule 1: If group is explicitly disabled, it stays disabled
|
||||
if (disabledGroups.contains(group)) {
|
||||
log.debug("isGroupEnabled('{}') -> false (explicitly disabled)", group);
|
||||
return false;
|
||||
}
|
||||
|
||||
Set<String> endpoints = endpointGroups.get(group);
|
||||
if (endpoints == null || endpoints.isEmpty()) {
|
||||
log.debug("isGroupEnabled('{}') -> false (no endpoints)", group);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Rule 2: For functional groups, check if all endpoints are enabled
|
||||
// Rule 3: For tool groups, they're enabled unless explicitly disabled (handled above)
|
||||
if (isToolGroup(group)) {
|
||||
log.debug("isGroupEnabled('{}') -> true (tool group not disabled)", group);
|
||||
return true;
|
||||
}
|
||||
|
||||
// For functional groups, check each endpoint individually
|
||||
for (String endpoint : endpoints) {
|
||||
if (!isEndpointEnabledDirectly(endpoint)) {
|
||||
log.debug(
|
||||
"isGroupEnabled('{}') -> false (endpoint '{}' disabled)", group, endpoint);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
log.debug("isGroupEnabled('{}') -> true (all endpoints enabled)", group);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -74,38 +148,84 @@ public class EndpointConfiguration {
|
||||
endpointGroups.computeIfAbsent(group, k -> new HashSet<>()).add(endpoint);
|
||||
}
|
||||
|
||||
public void enableGroup(String group) {
|
||||
Set<String> endpoints = endpointGroups.get(group);
|
||||
if (endpoints != null) {
|
||||
for (String endpoint : endpoints) {
|
||||
enableEndpoint(endpoint);
|
||||
}
|
||||
}
|
||||
public void addEndpointAlternative(String endpoint, String toolGroup) {
|
||||
endpointAlternatives.computeIfAbsent(endpoint, k -> new HashSet<>()).add(toolGroup);
|
||||
}
|
||||
|
||||
public void disableGroup(String group) {
|
||||
Set<String> endpoints = endpointGroups.get(group);
|
||||
if (endpoints != null) {
|
||||
for (String endpoint : endpoints) {
|
||||
disableEndpoint(endpoint);
|
||||
if (disabledGroups.add(group)) {
|
||||
if (isToolGroup(group)) {
|
||||
log.debug(
|
||||
"Disabling tool group: {} (endpoints with alternatives remain available)",
|
||||
group);
|
||||
} else {
|
||||
log.debug(
|
||||
"Disabling functional group: {} (will disable all endpoints in group)",
|
||||
group);
|
||||
}
|
||||
}
|
||||
// Only cascade to endpoints for *functional* groups
|
||||
if (!isToolGroup(group)) {
|
||||
Set<String> endpoints = endpointGroups.get(group);
|
||||
if (endpoints != null) {
|
||||
endpoints.forEach(this::disableEndpoint);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void enableGroup(String group) {
|
||||
if (disabledGroups.remove(group)) {
|
||||
log.debug("Enabling group: {}", group);
|
||||
}
|
||||
Set<String> endpoints = endpointGroups.get(group);
|
||||
if (endpoints != null) {
|
||||
endpoints.forEach(this::enableEndpoint);
|
||||
}
|
||||
}
|
||||
|
||||
public Set<String> getDisabledGroups() {
|
||||
return new HashSet<>(disabledGroups);
|
||||
}
|
||||
|
||||
public void logDisabledEndpointsSummary() {
|
||||
List<String> disabledList =
|
||||
endpointStatuses.entrySet().stream()
|
||||
.filter(entry -> !entry.getValue()) // only get disabled endpoints (value
|
||||
// is false)
|
||||
.map(Map.Entry::getKey)
|
||||
// Get all unique endpoints across all groups
|
||||
Set<String> allEndpoints =
|
||||
endpointGroups.values().stream()
|
||||
.flatMap(Set::stream)
|
||||
.collect(java.util.stream.Collectors.toSet());
|
||||
|
||||
// Check which endpoints are actually disabled (functionally unavailable)
|
||||
List<String> functionallyDisabledEndpoints =
|
||||
allEndpoints.stream()
|
||||
.filter(endpoint -> !isEndpointEnabled(endpoint))
|
||||
.sorted()
|
||||
.toList();
|
||||
|
||||
if (!disabledList.isEmpty()) {
|
||||
// Separate tool groups from functional groups
|
||||
List<String> disabledToolGroups =
|
||||
disabledGroups.stream().filter(this::isToolGroup).sorted().toList();
|
||||
|
||||
List<String> disabledFunctionalGroups =
|
||||
disabledGroups.stream().filter(group -> !isToolGroup(group)).sorted().toList();
|
||||
|
||||
if (!disabledToolGroups.isEmpty()) {
|
||||
log.info(
|
||||
"Disabled tool groups: {} (endpoints may have alternative implementations)",
|
||||
String.join(", ", disabledToolGroups));
|
||||
}
|
||||
|
||||
if (!disabledFunctionalGroups.isEmpty()) {
|
||||
log.info("Disabled functional groups: {}", String.join(", ", disabledFunctionalGroups));
|
||||
}
|
||||
|
||||
if (!functionallyDisabledEndpoints.isEmpty()) {
|
||||
log.info(
|
||||
"Total disabled endpoints: {}. Disabled endpoints: {}",
|
||||
disabledList.size(),
|
||||
String.join(", ", disabledList));
|
||||
functionallyDisabledEndpoints.size(),
|
||||
String.join(", ", functionallyDisabledEndpoints));
|
||||
} else if (!disabledToolGroups.isEmpty()) {
|
||||
log.info(
|
||||
"No endpoints disabled despite missing tools - fallback implementations available");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -212,8 +332,6 @@ public class EndpointConfiguration {
|
||||
// Unoconvert
|
||||
addEndpointToGroup("Unoconvert", "file-to-pdf");
|
||||
|
||||
addEndpointToGroup("tesseract", "ocr-pdf");
|
||||
|
||||
// Java
|
||||
addEndpointToGroup("Java", "merge-pdfs");
|
||||
addEndpointToGroup("Java", "remove-pages");
|
||||
@@ -254,6 +372,7 @@ public class EndpointConfiguration {
|
||||
addEndpointToGroup("Java", "remove-image-pdf");
|
||||
addEndpointToGroup("Java", "pdf-to-markdown");
|
||||
addEndpointToGroup("Java", "add-attachments");
|
||||
addEndpointToGroup("Java", "compress-pdf");
|
||||
|
||||
// Javascript
|
||||
addEndpointToGroup("Javascript", "pdf-organizer");
|
||||
@@ -261,8 +380,42 @@ public class EndpointConfiguration {
|
||||
addEndpointToGroup("Javascript", "compare");
|
||||
addEndpointToGroup("Javascript", "adjust-contrast");
|
||||
|
||||
// qpdf dependent endpoints
|
||||
/* qpdf */
|
||||
addEndpointToGroup("qpdf", "repair");
|
||||
addEndpointToGroup("qpdf", "compress-pdf");
|
||||
|
||||
/* Ghostscript */
|
||||
addEndpointToGroup("Ghostscript", "repair");
|
||||
addEndpointToGroup("Ghostscript", "compress-pdf");
|
||||
|
||||
/* tesseract */
|
||||
addEndpointToGroup("tesseract", "ocr-pdf");
|
||||
|
||||
/* OCRmyPDF */
|
||||
addEndpointToGroup("OCRmyPDF", "ocr-pdf");
|
||||
|
||||
// Multi-tool endpoints - endpoints that can be handled by multiple tools
|
||||
addEndpointAlternative("repair", "qpdf");
|
||||
addEndpointAlternative("repair", "Ghostscript");
|
||||
addEndpointAlternative("compress-pdf", "qpdf");
|
||||
addEndpointAlternative("compress-pdf", "Ghostscript");
|
||||
addEndpointAlternative("compress-pdf", "Java");
|
||||
addEndpointAlternative("ocr-pdf", "tesseract");
|
||||
addEndpointAlternative("ocr-pdf", "OCRmyPDF");
|
||||
|
||||
// file-to-pdf has multiple implementations
|
||||
addEndpointAlternative("file-to-pdf", "LibreOffice");
|
||||
addEndpointAlternative("file-to-pdf", "Python");
|
||||
addEndpointAlternative("file-to-pdf", "Unoconvert");
|
||||
|
||||
// pdf-to-html and pdf-to-markdown can use either LibreOffice or Pdftohtml
|
||||
addEndpointAlternative("pdf-to-html", "LibreOffice");
|
||||
addEndpointAlternative("pdf-to-html", "Pdftohtml");
|
||||
addEndpointAlternative("pdf-to-markdown", "Pdftohtml");
|
||||
|
||||
// markdown-to-pdf can use either Weasyprint or Java
|
||||
addEndpointAlternative("markdown-to-pdf", "Weasyprint");
|
||||
addEndpointAlternative("markdown-to-pdf", "Java");
|
||||
|
||||
// Weasyprint dependent endpoints
|
||||
addEndpointToGroup("Weasyprint", "html-to-pdf");
|
||||
@@ -304,4 +457,43 @@ public class EndpointConfiguration {
|
||||
public Set<String> getEndpointsForGroup(String group) {
|
||||
return endpointGroups.getOrDefault(group, new HashSet<>());
|
||||
}
|
||||
|
||||
private boolean isToolGroup(String group) {
|
||||
return "qpdf".equals(group)
|
||||
|| "OCRmyPDF".equals(group)
|
||||
|| "Ghostscript".equals(group)
|
||||
|| "LibreOffice".equals(group)
|
||||
|| "tesseract".equals(group)
|
||||
|| "CLI".equals(group)
|
||||
|| "Python".equals(group)
|
||||
|| "OpenCV".equals(group)
|
||||
|| "Unoconvert".equals(group)
|
||||
|| "Java".equals(group)
|
||||
|| "Javascript".equals(group)
|
||||
|| "Weasyprint".equals(group)
|
||||
|| "Pdftohtml".equals(group);
|
||||
}
|
||||
|
||||
private boolean isEndpointEnabledDirectly(String endpoint) {
|
||||
if (endpoint.startsWith("/")) {
|
||||
endpoint = endpoint.substring(1);
|
||||
}
|
||||
|
||||
// Check explicit disable flag
|
||||
Boolean explicitStatus = endpointStatuses.get(endpoint);
|
||||
if (Boolean.FALSE.equals(explicitStatus)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if endpoint belongs to any disabled functional group
|
||||
for (String group : endpointGroups.keySet()) {
|
||||
if (disabledGroups.contains(group) && endpointGroups.get(group).contains(endpoint)) {
|
||||
if (!isToolGroup(group)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,8 @@ public class ExternalAppDepConfig {
|
||||
new HashMap<>() {
|
||||
|
||||
{
|
||||
put("gs", List.of("Ghostscript"));
|
||||
put("ocrmypdf", List.of("OCRmyPDF"));
|
||||
put("soffice", List.of("LibreOffice"));
|
||||
put(weasyprintPath, List.of("Weasyprint"));
|
||||
put("pdftohtml", List.of("Pdftohtml"));
|
||||
@@ -109,6 +111,8 @@ public class ExternalAppDepConfig {
|
||||
@PostConstruct
|
||||
public void checkDependencies() {
|
||||
// Check core dependencies
|
||||
checkDependencyAndDisableGroup("gs");
|
||||
checkDependencyAndDisableGroup("ocrmypdf");
|
||||
checkDependencyAndDisableGroup("tesseract");
|
||||
checkDependencyAndDisableGroup("soffice");
|
||||
checkDependencyAndDisableGroup("qpdf");
|
||||
|
||||
@@ -26,8 +26,6 @@ public class WebMvcConfig implements WebMvcConfigurer {
|
||||
registry.addResourceHandler("/**")
|
||||
.addResourceLocations(
|
||||
"file:" + InstallationPathConfig.getStaticPath(), "classpath:/static/");
|
||||
registry.addResourceHandler("/js/**").addResourceLocations("classpath:/static/js/");
|
||||
registry.addResourceHandler("/css/**").addResourceLocations("classpath:/static/css/");
|
||||
// .setCachePeriod(0); // Optional: disable caching
|
||||
}
|
||||
}
|
||||
|
||||
+19
-4
@@ -35,7 +35,9 @@ import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.SPDF.model.api.general.MergePdfsRequest;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.GeneralUtils;
|
||||
import stirling.software.common.util.PdfErrorUtils;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
|
||||
@RestController
|
||||
@@ -146,7 +148,7 @@ public class MergeController {
|
||||
try (PDDocument doc = pdfDocumentFactory.load(file)) {
|
||||
pageIndex += doc.getNumberOfPages();
|
||||
} catch (IOException e) {
|
||||
log.error("Error loading document for TOC generation", e);
|
||||
ExceptionUtils.logException("document loading for TOC generation", e);
|
||||
pageIndex++; // Increment by at least one if we can't determine page count
|
||||
}
|
||||
}
|
||||
@@ -189,8 +191,17 @@ public class MergeController {
|
||||
mergedTempFile = Files.createTempFile("merged-", ".pdf").toFile();
|
||||
mergerUtility.setDestinationFileName(mergedTempFile.getAbsolutePath());
|
||||
|
||||
mergerUtility.mergeDocuments(
|
||||
pdfDocumentFactory.getStreamCacheFunction(totalSize)); // Merge the documents
|
||||
try {
|
||||
mergerUtility.mergeDocuments(
|
||||
pdfDocumentFactory.getStreamCacheFunction(
|
||||
totalSize)); // Merge the documents
|
||||
} catch (IOException e) {
|
||||
ExceptionUtils.logException("PDF merge", e);
|
||||
if (PdfErrorUtils.isCorruptedPdfError(e)) {
|
||||
throw ExceptionUtils.createMultiplePdfCorruptedException(e);
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
|
||||
// Load the merged PDF document
|
||||
mergedDocument = pdfDocumentFactory.load(mergedTempFile);
|
||||
@@ -229,7 +240,11 @@ public class MergeController {
|
||||
baos, mergedFileName); // Return the modified PDF
|
||||
|
||||
} catch (Exception ex) {
|
||||
log.error("Error in merge pdf process", ex);
|
||||
if (ex instanceof IOException && PdfErrorUtils.isCorruptedPdfError((IOException) ex)) {
|
||||
log.warn("Corrupted PDF detected in merge pdf process: {}", ex.getMessage());
|
||||
} else {
|
||||
log.error("Error in merge pdf process", ex);
|
||||
}
|
||||
throw ex;
|
||||
} finally {
|
||||
if (mergedDocument != null) {
|
||||
|
||||
+3
-2
@@ -25,6 +25,7 @@ import stirling.software.SPDF.model.SortTypes;
|
||||
import stirling.software.SPDF.model.api.PDFWithPageNums;
|
||||
import stirling.software.SPDF.model.api.general.RearrangePagesRequest;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.GeneralUtils;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
|
||||
@@ -288,8 +289,8 @@ public class RearrangePagesPDFController {
|
||||
.replaceFirst("[.][^.]+$", "")
|
||||
+ "_rearranged.pdf");
|
||||
} catch (IOException e) {
|
||||
log.error("Failed rearranging documents", e);
|
||||
return null;
|
||||
ExceptionUtils.logException("document rearrangement", e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-1
@@ -20,6 +20,7 @@ import lombok.RequiredArgsConstructor;
|
||||
|
||||
import stirling.software.SPDF.model.api.general.RotatePDFRequest;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
|
||||
@RestController
|
||||
@@ -43,7 +44,8 @@ public class RotationController {
|
||||
|
||||
// Validate the angle is a multiple of 90
|
||||
if (angle % 90 != 0) {
|
||||
throw new IllegalArgumentException("Angle must be a multiple of 90");
|
||||
throw ExceptionUtils.createIllegalArgumentException(
|
||||
"error.angleNotMultipleOf90", "Angle must be a multiple of 90");
|
||||
}
|
||||
|
||||
// Load the PDF document
|
||||
|
||||
+2
-3
@@ -27,6 +27,7 @@ import lombok.RequiredArgsConstructor;
|
||||
|
||||
import stirling.software.SPDF.model.api.general.ScalePagesRequest;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
|
||||
@RestController
|
||||
@@ -120,9 +121,7 @@ public class ScalePagesController {
|
||||
return sizeMap.get(targetPDRectangle);
|
||||
}
|
||||
|
||||
throw new IllegalArgumentException(
|
||||
"Invalid PDRectangle. It must be one of the following: A0, A1, A2, A3, A4, A5, A6,"
|
||||
+ " LETTER, LEGAL, KEEP");
|
||||
throw ExceptionUtils.createInvalidPageSizeException(targetPDRectangle);
|
||||
}
|
||||
|
||||
private Map<String, PDRectangle> getSizeMap() {
|
||||
|
||||
+6
-5
@@ -29,6 +29,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.SPDF.model.api.PDFWithPageNums;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
|
||||
@RestController
|
||||
@@ -71,7 +72,7 @@ public class SplitPDFController {
|
||||
pageNumbers.add(totalPages - 1);
|
||||
}
|
||||
|
||||
log.info(
|
||||
log.debug(
|
||||
"Splitting PDF into pages: {}",
|
||||
pageNumbers.stream().map(String::valueOf).collect(Collectors.joining(",")));
|
||||
|
||||
@@ -84,7 +85,7 @@ public class SplitPDFController {
|
||||
for (int i = previousPageNumber; i <= splitPoint; i++) {
|
||||
PDPage page = document.getPage(i);
|
||||
splitDocument.addPage(page);
|
||||
log.info("Adding page {} to split document", i);
|
||||
log.debug("Adding page {} to split document", i);
|
||||
}
|
||||
previousPageNumber = splitPoint + 1;
|
||||
|
||||
@@ -96,7 +97,7 @@ public class SplitPDFController {
|
||||
|
||||
splitDocumentsBoas.add(baos);
|
||||
} catch (Exception e) {
|
||||
log.error("Failed splitting documents and saving them", e);
|
||||
ExceptionUtils.logException("document splitting and saving", e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
@@ -122,14 +123,14 @@ public class SplitPDFController {
|
||||
zipOut.write(pdf);
|
||||
zipOut.closeEntry();
|
||||
|
||||
log.info("Wrote split document {} to zip file", fileName);
|
||||
log.debug("Wrote split document {} to zip file", fileName);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("Failed writing to zip", e);
|
||||
throw e;
|
||||
}
|
||||
|
||||
log.info("Successfully created zip file with split documents: {}", zipFile.toString());
|
||||
log.debug("Successfully created zip file with split documents: {}", zipFile.toString());
|
||||
byte[] data = Files.readAllBytes(zipFile);
|
||||
Files.deleteIfExists(zipFile);
|
||||
|
||||
|
||||
+9
-6
@@ -35,6 +35,7 @@ import stirling.software.SPDF.model.api.SplitPdfByChaptersRequest;
|
||||
import stirling.software.common.model.PdfMetadata;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.service.PdfMetadataService;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
|
||||
@RestController
|
||||
@@ -131,7 +132,8 @@ public class SplitPdfByChaptersController {
|
||||
Integer bookmarkLevel =
|
||||
request.getBookmarkLevel(); // levels start from 0 (top most bookmarks)
|
||||
if (bookmarkLevel < 0) {
|
||||
throw new IllegalArgumentException("Invalid bookmark level");
|
||||
throw ExceptionUtils.createIllegalArgumentException(
|
||||
"error.invalidArgument", "Invalid argument: {0}", "bookmark level");
|
||||
}
|
||||
sourceDocument = pdfDocumentFactory.load(file);
|
||||
|
||||
@@ -139,7 +141,8 @@ public class SplitPdfByChaptersController {
|
||||
|
||||
if (outline == null) {
|
||||
log.warn("No outline found for {}", file.getOriginalFilename());
|
||||
throw new IllegalArgumentException("No outline found");
|
||||
throw ExceptionUtils.createIllegalArgumentException(
|
||||
"error.pdfBookmarksNotFound", "No PDF bookmarks/outline found in document");
|
||||
}
|
||||
List<Bookmark> bookmarks = new ArrayList<>();
|
||||
try {
|
||||
@@ -156,7 +159,7 @@ public class SplitPdfByChaptersController {
|
||||
Bookmark lastBookmark = bookmarks.get(bookmarks.size() - 1);
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("Unable to extract outline items", e);
|
||||
ExceptionUtils.logException("outline extraction", e);
|
||||
return ResponseEntity.internalServerError()
|
||||
.body("Unable to extract outline items".getBytes());
|
||||
}
|
||||
@@ -252,7 +255,7 @@ public class SplitPdfByChaptersController {
|
||||
zipOut.write(pdf);
|
||||
zipOut.closeEntry();
|
||||
|
||||
log.info("Wrote split document {} to zip file", fileName);
|
||||
log.debug("Wrote split document {} to zip file", fileName);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("Failed writing to zip", e);
|
||||
@@ -280,7 +283,7 @@ public class SplitPdfByChaptersController {
|
||||
i++) {
|
||||
PDPage page = sourceDocument.getPage(i);
|
||||
splitDocument.addPage(page);
|
||||
log.info("Adding page {} to split document", i);
|
||||
log.debug("Adding page {} to split document", i);
|
||||
}
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
if (includeMetadata) {
|
||||
@@ -291,7 +294,7 @@ public class SplitPdfByChaptersController {
|
||||
|
||||
splitDocumentsBoas.add(baos);
|
||||
} catch (Exception e) {
|
||||
log.error("Failed splitting documents and saving them", e);
|
||||
ExceptionUtils.logException("document splitting and saving", e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
+17
-14
@@ -26,6 +26,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.SPDF.model.api.general.SplitPdfBySizeOrCountRequest;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.GeneralUtils;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
|
||||
@@ -96,13 +97,15 @@ public class SplitPdfBySizeController {
|
||||
handleSplitByDocCount(sourceDocument, documentCount, zipOut, filename);
|
||||
} else {
|
||||
log.error("Invalid split type: {}", type);
|
||||
throw new IllegalArgumentException(
|
||||
"Invalid argument for split type: " + type);
|
||||
throw ExceptionUtils.createIllegalArgumentException(
|
||||
"error.invalidArgument",
|
||||
"Invalid argument: {0}",
|
||||
"split type: " + type);
|
||||
}
|
||||
|
||||
log.debug("PDF splitting completed successfully");
|
||||
} catch (Exception e) {
|
||||
log.error("Error loading or processing PDF document", e);
|
||||
ExceptionUtils.logException("PDF document loading or processing", e);
|
||||
throw e;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
@@ -111,7 +114,7 @@ public class SplitPdfBySizeController {
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("Exception during PDF splitting process", e);
|
||||
ExceptionUtils.logException("PDF splitting process", e);
|
||||
throw e; // Re-throw to ensure proper error response
|
||||
} finally {
|
||||
try {
|
||||
@@ -275,8 +278,8 @@ public class SplitPdfBySizeController {
|
||||
currentDoc = pdfDocumentFactory.createNewDocumentBasedOnOldDocument(sourceDocument);
|
||||
log.debug("Successfully created initial output document");
|
||||
} catch (Exception e) {
|
||||
log.error("Error creating initial output document", e);
|
||||
throw new IOException("Failed to create initial output document", e);
|
||||
ExceptionUtils.logException("initial output document creation", e);
|
||||
throw ExceptionUtils.createFileProcessingException("split", e);
|
||||
}
|
||||
|
||||
int fileIndex = 1;
|
||||
@@ -295,7 +298,7 @@ public class SplitPdfBySizeController {
|
||||
log.debug("Successfully added page {} to current document", pageIndex);
|
||||
} catch (Exception e) {
|
||||
log.error("Error adding page {} to current document", pageIndex, e);
|
||||
throw new IOException("Failed to add page to document", e);
|
||||
throw ExceptionUtils.createFileProcessingException("split", e);
|
||||
}
|
||||
|
||||
currentPageCount++;
|
||||
@@ -320,7 +323,7 @@ public class SplitPdfBySizeController {
|
||||
log.debug("Successfully created new document");
|
||||
} catch (Exception e) {
|
||||
log.error("Error creating new document for next part", e);
|
||||
throw new IOException("Failed to create new document", e);
|
||||
throw ExceptionUtils.createFileProcessingException("split", e);
|
||||
}
|
||||
|
||||
currentPageCount = 0;
|
||||
@@ -329,7 +332,7 @@ public class SplitPdfBySizeController {
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("Error iterating through pages", e);
|
||||
throw new IOException("Failed to iterate through pages", e);
|
||||
throw ExceptionUtils.createFileProcessingException("split", e);
|
||||
}
|
||||
|
||||
// Add the last document if it contains any pages
|
||||
@@ -351,7 +354,7 @@ public class SplitPdfBySizeController {
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("Error checking or saving final document", e);
|
||||
throw new IOException("Failed to process final document", e);
|
||||
throw ExceptionUtils.createFileProcessingException("split", e);
|
||||
} finally {
|
||||
try {
|
||||
log.debug("Closing final document");
|
||||
@@ -390,7 +393,7 @@ public class SplitPdfBySizeController {
|
||||
log.debug("Successfully created document {} of {}", i + 1, documentCount);
|
||||
} catch (Exception e) {
|
||||
log.error("Error creating document {} of {}", i + 1, documentCount, e);
|
||||
throw new IOException("Failed to create document", e);
|
||||
throw ExceptionUtils.createFileProcessingException("split", e);
|
||||
}
|
||||
|
||||
int pagesToAdd = pagesPerDocument + (i < extraPages ? 1 : 0);
|
||||
@@ -408,7 +411,7 @@ public class SplitPdfBySizeController {
|
||||
currentPageIndex++;
|
||||
} catch (Exception e) {
|
||||
log.error("Error adding page {} to document {}", j + 1, i + 1, e);
|
||||
throw new IOException("Failed to add page to document", e);
|
||||
throw ExceptionUtils.createFileProcessingException("split", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -437,7 +440,7 @@ public class SplitPdfBySizeController {
|
||||
log.debug("Successfully saved document part {} ({} bytes)", index, outStream.size());
|
||||
} catch (Exception e) {
|
||||
log.error("Error saving document part {} to byte array", index, e);
|
||||
throw new IOException("Failed to save document to byte array", e);
|
||||
throw ExceptionUtils.createFileProcessingException("split", e);
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -465,7 +468,7 @@ public class SplitPdfBySizeController {
|
||||
log.debug("Successfully added document part {} to ZIP", index);
|
||||
} catch (Exception e) {
|
||||
log.error("Error adding document part {} to ZIP", index, e);
|
||||
throw new IOException("Failed to add document to ZIP file", e);
|
||||
throw ExceptionUtils.createFileProcessingException("split", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -70,17 +70,17 @@ public class ToSinglePageController {
|
||||
float yOffset = totalHeight;
|
||||
|
||||
// For each page, copy its content to the new page at the correct offset
|
||||
int pageIndex = 0;
|
||||
for (PDPage page : sourceDocument.getPages()) {
|
||||
PDFormXObject form =
|
||||
layerUtility.importPageAsForm(
|
||||
sourceDocument, sourceDocument.getPages().indexOf(page));
|
||||
PDFormXObject form = layerUtility.importPageAsForm(sourceDocument, pageIndex);
|
||||
AffineTransform af =
|
||||
AffineTransform.getTranslateInstance(
|
||||
0, yOffset - page.getMediaBox().getHeight());
|
||||
layerUtility.wrapInSaveRestore(newPage);
|
||||
String defaultLayerName = "Layer" + sourceDocument.getPages().indexOf(page);
|
||||
String defaultLayerName = "Layer" + pageIndex;
|
||||
layerUtility.appendFormAsLayer(newPage, form, af, defaultLayerName);
|
||||
yOffset -= page.getMediaBox().getHeight();
|
||||
pageIndex++;
|
||||
}
|
||||
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
|
||||
+4
-3
@@ -17,6 +17,7 @@ import stirling.software.common.configuration.RuntimePathConfig;
|
||||
import stirling.software.common.model.ApplicationProperties;
|
||||
import stirling.software.common.model.api.converters.HTMLToPdfRequest;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.FileToPdf;
|
||||
import stirling.software.common.util.TempFileManager;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
@@ -46,14 +47,14 @@ public class ConvertHtmlToPDF {
|
||||
MultipartFile fileInput = request.getFileInput();
|
||||
|
||||
if (fileInput == null) {
|
||||
throw new IllegalArgumentException(
|
||||
"Please provide an HTML or ZIP file for conversion.");
|
||||
throw ExceptionUtils.createHtmlFileRequiredException();
|
||||
}
|
||||
|
||||
String originalFilename = Filenames.toSimpleFileName(fileInput.getOriginalFilename());
|
||||
if (originalFilename == null
|
||||
|| (!originalFilename.endsWith(".html") && !originalFilename.endsWith(".zip"))) {
|
||||
throw new IllegalArgumentException("File must be either .html or .zip format.");
|
||||
throw ExceptionUtils.createIllegalArgumentException(
|
||||
"error.fileFormatRequired", "File must be in {0} format", ".html or .zip");
|
||||
}
|
||||
|
||||
boolean disableSanitize =
|
||||
|
||||
+2
-1
@@ -34,6 +34,7 @@ import stirling.software.SPDF.model.api.converters.ConvertToImageRequest;
|
||||
import stirling.software.SPDF.model.api.converters.ConvertToPdfRequest;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.CheckProgramInstall;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.GeneralUtils;
|
||||
import stirling.software.common.util.PdfUtils;
|
||||
import stirling.software.common.util.ProcessExecutor;
|
||||
@@ -104,7 +105,7 @@ public class ConvertImgPDFController {
|
||||
log.error("resultant bytes for {} is null, error converting ", filename);
|
||||
}
|
||||
if ("webp".equalsIgnoreCase(imageFormat) && !CheckProgramInstall.isPythonAvailable()) {
|
||||
throw new IOException("Python is not installed. Required for WebP conversion.");
|
||||
throw ExceptionUtils.createPythonRequiredForWebpException();
|
||||
} else if ("webp".equalsIgnoreCase(imageFormat)
|
||||
&& CheckProgramInstall.isPythonAvailable()) {
|
||||
// Write the output stream to a temp file
|
||||
|
||||
+5
-2
@@ -27,6 +27,7 @@ import stirling.software.common.configuration.RuntimePathConfig;
|
||||
import stirling.software.common.model.ApplicationProperties;
|
||||
import stirling.software.common.model.api.GeneralFile;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.FileToPdf;
|
||||
import stirling.software.common.util.TempFileManager;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
@@ -55,12 +56,14 @@ public class ConvertMarkdownToPdf {
|
||||
MultipartFile fileInput = generalFile.getFileInput();
|
||||
|
||||
if (fileInput == null) {
|
||||
throw new IllegalArgumentException("Please provide a Markdown file for conversion.");
|
||||
throw ExceptionUtils.createIllegalArgumentException(
|
||||
"error.fileFormatRequired", "File must be in {0} format", "Markdown");
|
||||
}
|
||||
|
||||
String originalFilename = Filenames.toSimpleFileName(fileInput.getOriginalFilename());
|
||||
if (originalFilename == null || !originalFilename.endsWith(".md")) {
|
||||
throw new IllegalArgumentException("File must be in .md format.");
|
||||
throw ExceptionUtils.createIllegalArgumentException(
|
||||
"error.fileFormatRequired", "File must be in {0} format", ".md");
|
||||
}
|
||||
|
||||
// Convert Markdown to HTML using CommonMark
|
||||
|
||||
+4
-5
@@ -67,6 +67,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.SPDF.model.api.converters.PdfToPdfARequest;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.ProcessExecutor;
|
||||
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
@@ -90,7 +91,7 @@ public class ConvertPDFToPDFA {
|
||||
// Validate input file type
|
||||
if (!"application/pdf".equals(inputFile.getContentType())) {
|
||||
log.error("Invalid input file type: {}", inputFile.getContentType());
|
||||
throw new IllegalArgumentException("Input file must be a PDF");
|
||||
throw ExceptionUtils.createPdfFileRequiredException();
|
||||
}
|
||||
|
||||
// Get the original filename without extension
|
||||
@@ -241,15 +242,13 @@ public class ConvertPDFToPDFA {
|
||||
|
||||
if (returnCode.getRc() != 0) {
|
||||
log.error("PDF/A conversion failed with return code: {}", returnCode.getRc());
|
||||
throw new RuntimeException("PDF/A conversion failed");
|
||||
throw ExceptionUtils.createPdfaConversionFailedException();
|
||||
}
|
||||
|
||||
// Get the output file
|
||||
File[] outputFiles = tempOutputDir.toFile().listFiles();
|
||||
if (outputFiles == null || outputFiles.length != 1) {
|
||||
throw new RuntimeException(
|
||||
"Expected one output PDF, found "
|
||||
+ (outputFiles == null ? "none" : outputFiles.length));
|
||||
throw ExceptionUtils.createPdfaConversionFailedException();
|
||||
}
|
||||
return outputFiles[0].toPath();
|
||||
}
|
||||
|
||||
+7
-3
@@ -23,6 +23,7 @@ import stirling.software.SPDF.model.api.converters.UrlToPdfRequest;
|
||||
import stirling.software.common.configuration.RuntimePathConfig;
|
||||
import stirling.software.common.model.ApplicationProperties;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.GeneralUtils;
|
||||
import stirling.software.common.util.ProcessExecutor;
|
||||
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
|
||||
@@ -50,16 +51,19 @@ public class ConvertWebsiteToPDF {
|
||||
String URL = request.getUrlInput();
|
||||
|
||||
if (!applicationProperties.getSystem().getEnableUrlToPDF()) {
|
||||
throw new IllegalArgumentException("This endpoint has been disabled by the admin.");
|
||||
throw ExceptionUtils.createIllegalArgumentException(
|
||||
"error.endpointDisabled", "This endpoint has been disabled by the admin");
|
||||
}
|
||||
// Validate the URL format
|
||||
if (!URL.matches("^https?://.*") || !GeneralUtils.isValidURL(URL)) {
|
||||
throw new IllegalArgumentException("Invalid URL format provided.");
|
||||
throw ExceptionUtils.createInvalidArgumentException(
|
||||
"URL", "provided format is invalid");
|
||||
}
|
||||
|
||||
// validate the URL is reachable
|
||||
if (!GeneralUtils.isURLReachable(URL)) {
|
||||
throw new IllegalArgumentException("URL is not reachable, please provide a valid URL.");
|
||||
throw ExceptionUtils.createIllegalArgumentException(
|
||||
"error.urlNotReachable", "URL is not reachable, please provide a valid URL");
|
||||
}
|
||||
|
||||
Path tempOutputFile = null;
|
||||
|
||||
+5
-4
@@ -25,6 +25,7 @@ import stirling.software.SPDF.model.api.filter.FileSizeRequest;
|
||||
import stirling.software.SPDF.model.api.filter.PageRotationRequest;
|
||||
import stirling.software.SPDF.model.api.filter.PageSizeRequest;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.PdfUtils;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
|
||||
@@ -96,7 +97,7 @@ public class FilterController {
|
||||
valid = actualPageCount < pageCount;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Invalid comparator: " + comparator);
|
||||
throw ExceptionUtils.createInvalidArgumentException("comparator", comparator);
|
||||
}
|
||||
|
||||
if (valid) return WebResponseUtils.multiPartFileToWebResponse(inputFile);
|
||||
@@ -139,7 +140,7 @@ public class FilterController {
|
||||
valid = actualArea < standardArea;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Invalid comparator: " + comparator);
|
||||
throw ExceptionUtils.createInvalidArgumentException("comparator", comparator);
|
||||
}
|
||||
|
||||
if (valid) return WebResponseUtils.multiPartFileToWebResponse(inputFile);
|
||||
@@ -172,7 +173,7 @@ public class FilterController {
|
||||
valid = actualFileSize < fileSize;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Invalid comparator: " + comparator);
|
||||
throw ExceptionUtils.createInvalidArgumentException("comparator", comparator);
|
||||
}
|
||||
|
||||
if (valid) return WebResponseUtils.multiPartFileToWebResponse(inputFile);
|
||||
@@ -208,7 +209,7 @@ public class FilterController {
|
||||
valid = actualRotation < rotation;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Invalid comparator: " + comparator);
|
||||
throw ExceptionUtils.createInvalidArgumentException("comparator", comparator);
|
||||
}
|
||||
|
||||
if (valid) return WebResponseUtils.multiPartFileToWebResponse(inputFile);
|
||||
|
||||
+161
-35
@@ -47,11 +47,13 @@ import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.SPDF.config.EndpointConfiguration;
|
||||
import stirling.software.SPDF.model.api.misc.OptimizePdfRequest;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.GeneralUtils;
|
||||
import stirling.software.common.util.ProcessExecutor;
|
||||
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
|
||||
@@ -61,16 +63,18 @@ import stirling.software.common.util.WebResponseUtils;
|
||||
@RequestMapping("/api/v1/misc")
|
||||
@Slf4j
|
||||
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||
@RequiredArgsConstructor
|
||||
public class CompressController {
|
||||
|
||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||
private final boolean qpdfEnabled;
|
||||
private final EndpointConfiguration endpointConfiguration;
|
||||
|
||||
public CompressController(
|
||||
CustomPDFDocumentFactory pdfDocumentFactory,
|
||||
EndpointConfiguration endpointConfiguration) {
|
||||
this.pdfDocumentFactory = pdfDocumentFactory;
|
||||
this.qpdfEnabled = endpointConfiguration.isGroupEnabled("qpdf");
|
||||
private boolean isQpdfEnabled() {
|
||||
return endpointConfiguration.isGroupEnabled("qpdf");
|
||||
}
|
||||
|
||||
private boolean isGhostscriptEnabled() {
|
||||
return endpointConfiguration.isGroupEnabled("Ghostscript");
|
||||
}
|
||||
|
||||
@Data
|
||||
@@ -597,12 +601,12 @@ public class CompressController {
|
||||
if (bytesRead > 0) {
|
||||
byte[] dataToHash =
|
||||
bytesRead == buffer.length ? buffer : Arrays.copyOf(buffer, bytesRead);
|
||||
return bytesToHexString(generatMD5(dataToHash));
|
||||
return bytesToHexString(generateMD5(dataToHash));
|
||||
}
|
||||
return "empty-stream";
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("Error generating image hash", e);
|
||||
ExceptionUtils.logException("image hash generation", e);
|
||||
return "fallback-" + System.identityHashCode(image);
|
||||
}
|
||||
}
|
||||
@@ -615,12 +619,12 @@ public class CompressController {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private byte[] generatMD5(byte[] data) throws IOException {
|
||||
private byte[] generateMD5(byte[] data) throws IOException {
|
||||
try {
|
||||
MessageDigest md = MessageDigest.getInstance("MD5");
|
||||
return md.digest(data); // Get the MD5 hash of the image bytes
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
throw new RuntimeException("MD5 algorithm not available", e);
|
||||
throw ExceptionUtils.createMd5AlgorithmException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -697,25 +701,69 @@ public class CompressController {
|
||||
|
||||
boolean sizeMet = false;
|
||||
boolean imageCompressionApplied = false;
|
||||
boolean qpdfCompressionApplied = false;
|
||||
|
||||
if (qpdfEnabled && optimizeLevel <= 3) {
|
||||
optimizeLevel = 4;
|
||||
}
|
||||
boolean externalCompressionApplied = false;
|
||||
|
||||
while (!sizeMet && optimizeLevel <= 9) {
|
||||
// Apply image compression for levels 4-9
|
||||
if ((optimizeLevel >= 3 || Boolean.TRUE.equals(convertToGrayscale))
|
||||
&& !imageCompressionApplied) {
|
||||
double scaleFactor = getScaleFactorForLevel(optimizeLevel);
|
||||
float jpegQuality = getJpegQualityForLevel(optimizeLevel);
|
||||
// Apply external compression first
|
||||
if (!externalCompressionApplied) {
|
||||
boolean ghostscriptSuccess = false;
|
||||
|
||||
// Compress images
|
||||
// Try Ghostscript first if available - for ANY compression level
|
||||
if (isGhostscriptEnabled()) {
|
||||
try {
|
||||
applyGhostscriptCompression(
|
||||
request, optimizeLevel, currentFile, tempFiles);
|
||||
log.info("Ghostscript compression applied successfully");
|
||||
ghostscriptSuccess = true;
|
||||
} catch (IOException e) {
|
||||
log.warn("Ghostscript compression failed, trying fallback methods");
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback to QPDF if Ghostscript failed or not available (levels 1-3 only)
|
||||
if (!ghostscriptSuccess && isQpdfEnabled() && optimizeLevel <= 3) {
|
||||
try {
|
||||
applyQpdfCompression(request, optimizeLevel, currentFile, tempFiles);
|
||||
log.info("QPDF compression applied successfully");
|
||||
} catch (IOException e) {
|
||||
log.warn("QPDF compression also failed");
|
||||
}
|
||||
}
|
||||
|
||||
if (!ghostscriptSuccess && !isQpdfEnabled()) {
|
||||
log.info(
|
||||
"No external compression tools available, using image compression only");
|
||||
}
|
||||
|
||||
externalCompressionApplied = true;
|
||||
|
||||
// Skip image compression if Ghostscript succeeded
|
||||
if (ghostscriptSuccess) {
|
||||
imageCompressionApplied = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply image compression for levels 4+ only if Ghostscript didn't run
|
||||
if ((optimizeLevel >= 4 || Boolean.TRUE.equals(convertToGrayscale))
|
||||
&& !imageCompressionApplied) {
|
||||
// Use different scale factors based on level
|
||||
double scaleFactor =
|
||||
switch (optimizeLevel) {
|
||||
case 4 -> 0.95; // 95% of original size
|
||||
case 5 -> 0.9; // 90% of original size
|
||||
case 6 -> 0.8; // 80% of original size
|
||||
case 7 -> 0.7; // 70% of original size
|
||||
case 8 -> 0.65; // 65% of original size
|
||||
case 9 -> 0.5; // 50% of original size
|
||||
default -> 1.0;
|
||||
};
|
||||
|
||||
log.info("Applying image compression with scale factor: {}", scaleFactor);
|
||||
Path compressedImageFile =
|
||||
compressImagesInPDF(
|
||||
currentFile,
|
||||
scaleFactor,
|
||||
jpegQuality,
|
||||
0.7f, // Default JPEG quality
|
||||
Boolean.TRUE.equals(convertToGrayscale));
|
||||
|
||||
tempFiles.add(compressedImageFile);
|
||||
@@ -723,18 +771,6 @@ public class CompressController {
|
||||
imageCompressionApplied = true;
|
||||
}
|
||||
|
||||
// Apply QPDF compression for all levels
|
||||
if (!qpdfCompressionApplied && qpdfEnabled) {
|
||||
applyQpdfCompression(request, optimizeLevel, currentFile, tempFiles);
|
||||
qpdfCompressionApplied = true;
|
||||
} else if (!qpdfCompressionApplied) {
|
||||
// If QPDF is disabled, mark as applied and log
|
||||
if (!qpdfEnabled) {
|
||||
log.info("Skipping QPDF compression as QPDF group is disabled");
|
||||
}
|
||||
qpdfCompressionApplied = true;
|
||||
}
|
||||
|
||||
// Check if target size reached or not in auto mode
|
||||
long outputFileSize = Files.size(currentFile);
|
||||
if (outputFileSize <= expectedOutputSize || !autoMode) {
|
||||
@@ -754,7 +790,7 @@ public class CompressController {
|
||||
} else {
|
||||
// Reset flags for next iteration with higher optimization level
|
||||
imageCompressionApplied = false;
|
||||
qpdfCompressionApplied = false;
|
||||
externalCompressionApplied = false;
|
||||
optimizeLevel = newOptimizeLevel;
|
||||
}
|
||||
}
|
||||
@@ -788,6 +824,96 @@ public class CompressController {
|
||||
}
|
||||
}
|
||||
|
||||
// Run Ghostscript compression
|
||||
private void applyGhostscriptCompression(
|
||||
OptimizePdfRequest request, int optimizeLevel, Path currentFile, List<Path> tempFiles)
|
||||
throws IOException {
|
||||
|
||||
long preGsSize = Files.size(currentFile);
|
||||
log.info("Pre-Ghostscript file size: {}", GeneralUtils.formatBytes(preGsSize));
|
||||
|
||||
// Create output file for Ghostscript
|
||||
Path gsOutputFile = Files.createTempFile("gs_output_", ".pdf");
|
||||
tempFiles.add(gsOutputFile);
|
||||
|
||||
// Build Ghostscript command based on optimization level
|
||||
List<String> command = new ArrayList<>();
|
||||
command.add("gs");
|
||||
command.add("-sDEVICE=pdfwrite");
|
||||
command.add("-dCompatibilityLevel=1.5");
|
||||
command.add("-dNOPAUSE");
|
||||
command.add("-dQUIET");
|
||||
command.add("-dBATCH");
|
||||
|
||||
// Map optimization levels to Ghostscript settings
|
||||
switch (optimizeLevel) {
|
||||
case 1:
|
||||
command.add("-dPDFSETTINGS=/prepress");
|
||||
break;
|
||||
case 2:
|
||||
command.add("-dPDFSETTINGS=/printer");
|
||||
break;
|
||||
case 3:
|
||||
command.add("-dPDFSETTINGS=/ebook");
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
command.add("-dPDFSETTINGS=/screen");
|
||||
break;
|
||||
case 6:
|
||||
case 7:
|
||||
command.add("-dPDFSETTINGS=/screen");
|
||||
command.add("-dColorImageResolution=150");
|
||||
command.add("-dGrayImageResolution=150");
|
||||
command.add("-dMonoImageResolution=300");
|
||||
break;
|
||||
case 8:
|
||||
case 9:
|
||||
command.add("-dPDFSETTINGS=/screen");
|
||||
command.add("-dColorImageResolution=100");
|
||||
command.add("-dGrayImageResolution=100");
|
||||
command.add("-dMonoImageResolution=200");
|
||||
break;
|
||||
case 10:
|
||||
command.add("-dPDFSETTINGS=/screen");
|
||||
command.add("-dColorImageResolution=72");
|
||||
command.add("-dGrayImageResolution=72");
|
||||
command.add("-dMonoImageResolution=150");
|
||||
break;
|
||||
default:
|
||||
command.add("-dPDFSETTINGS=/screen");
|
||||
break;
|
||||
}
|
||||
|
||||
command.add("-sOutputFile=" + gsOutputFile.toString());
|
||||
command.add(currentFile.toString());
|
||||
|
||||
ProcessExecutorResult returnCode = null;
|
||||
try {
|
||||
returnCode =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.GHOSTSCRIPT)
|
||||
.runCommandWithOutputHandling(command);
|
||||
|
||||
if (returnCode.getRc() == 0) {
|
||||
// Update current file to the Ghostscript output
|
||||
Files.copy(gsOutputFile, currentFile, StandardCopyOption.REPLACE_EXISTING);
|
||||
|
||||
long postGsSize = Files.size(currentFile);
|
||||
double gsReduction = 100.0 - ((postGsSize * 100.0) / preGsSize);
|
||||
log.info(
|
||||
"Post-Ghostscript file size: {} (reduced by {}%)",
|
||||
GeneralUtils.formatBytes(postGsSize), String.format("%.1f", gsReduction));
|
||||
} else {
|
||||
log.warn("Ghostscript compression failed with return code: {}", returnCode.getRc());
|
||||
throw new IOException("Ghostscript compression failed");
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
log.warn("Ghostscript compression failed, will fallback to other methods", e);
|
||||
throw new IOException("Ghostscript compression failed", e);
|
||||
}
|
||||
}
|
||||
|
||||
// Run QPDF compression
|
||||
private void applyQpdfCompression(
|
||||
OptimizePdfRequest request, int optimizeLevel, Path currentFile, List<Path> tempFiles)
|
||||
|
||||
+2
-1
@@ -26,6 +26,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.common.model.api.PDFFile;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
|
||||
@RestController
|
||||
@@ -134,7 +135,7 @@ public class DecompressPdfController {
|
||||
stream.setInt(COSName.LENGTH, decompressedBytes.length);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log.error("Error decompressing stream", e);
|
||||
ExceptionUtils.logException("stream decompression", e);
|
||||
// Continue processing other streams even if this one fails
|
||||
}
|
||||
}
|
||||
|
||||
+3
-1
@@ -33,6 +33,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import stirling.software.SPDF.model.api.misc.ExtractImageScansRequest;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.CheckProgramInstall;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.ProcessExecutor;
|
||||
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
@@ -72,7 +73,8 @@ public class ExtractImageScansController {
|
||||
List<Path> tempDirs = new ArrayList<>();
|
||||
|
||||
if (!CheckProgramInstall.isPythonAvailable()) {
|
||||
throw new IOException("Python is not installed.");
|
||||
throw ExceptionUtils.createIOException(
|
||||
"error.toolNotInstalled", "{0} is not installed", null, "Python");
|
||||
}
|
||||
|
||||
String pythonVersion = CheckProgramInstall.getAvailablePythonCommand();
|
||||
|
||||
+79
-55
@@ -41,6 +41,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.SPDF.model.api.PDFExtractImagesRequest;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.ImageProcessingUtils;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
|
||||
@@ -90,39 +91,57 @@ public class ExtractImagesController {
|
||||
Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
|
||||
Set<Future<Void>> futures = new HashSet<>();
|
||||
|
||||
// Iterate over each page
|
||||
for (int pgNum = 0; pgNum < document.getPages().getCount(); pgNum++) {
|
||||
PDPage page = document.getPage(pgNum);
|
||||
Future<Void> future =
|
||||
executor.submit(
|
||||
() -> {
|
||||
// Use the page number directly from the iterator, so no need to
|
||||
// calculate manually
|
||||
int pageNum = document.getPages().indexOf(page) + 1;
|
||||
// Safely iterate over each page, handling corrupt PDFs where page count might be wrong
|
||||
try {
|
||||
int pageCount = document.getPages().getCount();
|
||||
log.debug("Document reports {} pages", pageCount);
|
||||
|
||||
try {
|
||||
// Call the image extraction method for each page
|
||||
extractImagesFromPage(
|
||||
page,
|
||||
format,
|
||||
filename,
|
||||
pageNum,
|
||||
processedImages,
|
||||
zos,
|
||||
allowDuplicates);
|
||||
} catch (IOException e) {
|
||||
// Log the error and continue processing other pages
|
||||
log.error(
|
||||
"Error extracting images from page {}: {}",
|
||||
pageNum,
|
||||
e.getMessage());
|
||||
}
|
||||
int consecutiveFailures = 0;
|
||||
|
||||
return null; // Callable requires a return type
|
||||
});
|
||||
for (int pgNum = 0; pgNum < pageCount; pgNum++) {
|
||||
try {
|
||||
PDPage page = document.getPage(pgNum);
|
||||
consecutiveFailures = 0; // Reset on success
|
||||
final int currentPageNum = pgNum + 1; // Convert to 1-based page numbering
|
||||
Future<Void> future =
|
||||
executor.submit(
|
||||
() -> {
|
||||
try {
|
||||
// Call the image extraction method for each page
|
||||
extractImagesFromPage(
|
||||
page,
|
||||
format,
|
||||
filename,
|
||||
currentPageNum,
|
||||
processedImages,
|
||||
zos,
|
||||
allowDuplicates);
|
||||
} catch (Exception e) {
|
||||
// Log the error and continue processing other pages
|
||||
ExceptionUtils.logException(
|
||||
"image extraction from page "
|
||||
+ currentPageNum,
|
||||
e);
|
||||
}
|
||||
|
||||
// Add the Future object to the list to track completion
|
||||
futures.add(future);
|
||||
return null; // Callable requires a return type
|
||||
});
|
||||
|
||||
// Add the Future object to the list to track completion
|
||||
futures.add(future);
|
||||
} catch (Exception e) {
|
||||
consecutiveFailures++;
|
||||
ExceptionUtils.logException("page access for page " + (pgNum + 1), e);
|
||||
|
||||
if (consecutiveFailures >= 3) {
|
||||
log.warn("Stopping page iteration after 3 consecutive failures");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
ExceptionUtils.logException("page count determination", e);
|
||||
throw e;
|
||||
}
|
||||
|
||||
// Wait for all tasks to complete
|
||||
@@ -180,34 +199,39 @@ public class ExtractImagesController {
|
||||
}
|
||||
int count = 1;
|
||||
for (COSName name : page.getResources().getXObjectNames()) {
|
||||
if (page.getResources().isImageXObject(name)) {
|
||||
PDImageXObject image = (PDImageXObject) page.getResources().getXObject(name);
|
||||
if (!allowDuplicates) {
|
||||
byte[] data = ImageProcessingUtils.getImageData(image.getImage());
|
||||
byte[] imageHash = md.digest(data);
|
||||
synchronized (processedImages) {
|
||||
if (processedImages.stream()
|
||||
.anyMatch(hash -> Arrays.equals(hash, imageHash))) {
|
||||
continue; // Skip already processed images
|
||||
try {
|
||||
if (page.getResources().isImageXObject(name)) {
|
||||
PDImageXObject image = (PDImageXObject) page.getResources().getXObject(name);
|
||||
if (!allowDuplicates) {
|
||||
byte[] data = ImageProcessingUtils.getImageData(image.getImage());
|
||||
byte[] imageHash = md.digest(data);
|
||||
synchronized (processedImages) {
|
||||
if (processedImages.stream()
|
||||
.anyMatch(hash -> Arrays.equals(hash, imageHash))) {
|
||||
continue; // Skip already processed images
|
||||
}
|
||||
processedImages.add(imageHash);
|
||||
}
|
||||
processedImages.add(imageHash);
|
||||
}
|
||||
|
||||
RenderedImage renderedImage = image.getImage();
|
||||
|
||||
// Convert to standard RGB colorspace if needed
|
||||
BufferedImage bufferedImage = convertToRGB(renderedImage, format);
|
||||
|
||||
// Write image to zip file
|
||||
String imageName = filename + "_page_" + pageNum + "_" + count++ + "." + format;
|
||||
synchronized (zos) {
|
||||
zos.putNextEntry(new ZipEntry(imageName));
|
||||
ByteArrayOutputStream imageBaos = new ByteArrayOutputStream();
|
||||
ImageIO.write(bufferedImage, format, imageBaos);
|
||||
zos.write(imageBaos.toByteArray());
|
||||
zos.closeEntry();
|
||||
}
|
||||
}
|
||||
|
||||
RenderedImage renderedImage = image.getImage();
|
||||
|
||||
// Convert to standard RGB colorspace if needed
|
||||
BufferedImage bufferedImage = convertToRGB(renderedImage, format);
|
||||
|
||||
// Write image to zip file
|
||||
String imageName = filename + "_page_" + pageNum + "_" + count++ + "." + format;
|
||||
synchronized (zos) {
|
||||
zos.putNextEntry(new ZipEntry(imageName));
|
||||
ByteArrayOutputStream imageBaos = new ByteArrayOutputStream();
|
||||
ImageIO.write(bufferedImage, format, imageBaos);
|
||||
zos.write(imageBaos.toByteArray());
|
||||
zos.closeEntry();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
ExceptionUtils.logException("image extraction", e);
|
||||
throw ExceptionUtils.handlePdfException(e, "during image extraction");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+45
-2
@@ -47,6 +47,11 @@ public class FakeScanController {
|
||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||
private static final Random RANDOM = new Random();
|
||||
|
||||
// Size limits to prevent OutOfMemoryError
|
||||
private static final int MAX_IMAGE_WIDTH = 8192;
|
||||
private static final int MAX_IMAGE_HEIGHT = 8192;
|
||||
private static final long MAX_IMAGE_PIXELS = 16_777_216; // 4096x4096
|
||||
|
||||
@PostMapping(value = "/fake-scan", consumes = "multipart/form-data")
|
||||
@Operation(
|
||||
summary = "Convert PDF to look like a scanned document",
|
||||
@@ -82,8 +87,46 @@ public class FakeScanController {
|
||||
PDFRenderer pdfRenderer = new PDFRenderer(document);
|
||||
|
||||
for (int i = 0; i < document.getNumberOfPages(); i++) {
|
||||
// Render page to image with specified resolution
|
||||
BufferedImage image = pdfRenderer.renderImageWithDPI(i, resolution);
|
||||
// Get page dimensions to calculate safe resolution
|
||||
PDRectangle pageSize = document.getPage(i).getMediaBox();
|
||||
float pageWidthPts = pageSize.getWidth();
|
||||
float pageHeightPts = pageSize.getHeight();
|
||||
|
||||
// Calculate what the image dimensions would be at the requested resolution
|
||||
int projectedWidth = (int) Math.ceil(pageWidthPts * resolution / 72.0);
|
||||
int projectedHeight = (int) Math.ceil(pageHeightPts * resolution / 72.0);
|
||||
long projectedPixels = (long) projectedWidth * projectedHeight;
|
||||
|
||||
// Calculate safe resolution that stays within limits
|
||||
int safeResolution = resolution;
|
||||
if (projectedWidth > MAX_IMAGE_WIDTH
|
||||
|| projectedHeight > MAX_IMAGE_HEIGHT
|
||||
|| projectedPixels > MAX_IMAGE_PIXELS) {
|
||||
double widthScale = (double) MAX_IMAGE_WIDTH / projectedWidth;
|
||||
double heightScale = (double) MAX_IMAGE_HEIGHT / projectedHeight;
|
||||
double pixelScale = Math.sqrt((double) MAX_IMAGE_PIXELS / projectedPixels);
|
||||
double minScale = Math.min(Math.min(widthScale, heightScale), pixelScale);
|
||||
safeResolution = (int) Math.max(72, resolution * minScale);
|
||||
|
||||
log.warn(
|
||||
"Page {} would be too large at {}dpi ({}x{} pixels). Reducing to {}dpi",
|
||||
i + 1,
|
||||
resolution,
|
||||
projectedWidth,
|
||||
projectedHeight,
|
||||
safeResolution);
|
||||
}
|
||||
|
||||
// Render page to image with safe resolution
|
||||
BufferedImage image = pdfRenderer.renderImageWithDPI(i, safeResolution);
|
||||
|
||||
log.debug(
|
||||
"Processing page {} with dimensions {}x{} ({} pixels) at {}dpi",
|
||||
i + 1,
|
||||
image.getWidth(),
|
||||
image.getHeight(),
|
||||
(long) image.getWidth() * image.getHeight(),
|
||||
safeResolution);
|
||||
|
||||
// 1. Convert to grayscale or keep color
|
||||
BufferedImage processed;
|
||||
|
||||
+273
-76
@@ -2,6 +2,7 @@ package stirling.software.SPDF.controller.api.misc;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.*;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.*;
|
||||
import java.util.zip.ZipEntry;
|
||||
@@ -29,12 +30,17 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.SPDF.config.EndpointConfiguration;
|
||||
import stirling.software.SPDF.model.api.misc.ProcessPdfWithOcrRequest;
|
||||
import stirling.software.common.model.ApplicationProperties;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.ProcessExecutor;
|
||||
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
|
||||
import stirling.software.common.util.TempDirectory;
|
||||
import stirling.software.common.util.TempFile;
|
||||
import stirling.software.common.util.TempFileManager;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/misc")
|
||||
@@ -46,6 +52,15 @@ public class OCRController {
|
||||
private final ApplicationProperties applicationProperties;
|
||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||
private final TempFileManager tempFileManager;
|
||||
private final EndpointConfiguration endpointConfiguration;
|
||||
|
||||
private boolean isOcrMyPdfEnabled() {
|
||||
return endpointConfiguration.isGroupEnabled("OCRmyPDF");
|
||||
}
|
||||
|
||||
private boolean isTesseractEnabled() {
|
||||
return endpointConfiguration.isGroupEnabled("tesseract");
|
||||
}
|
||||
|
||||
/** Gets the list of available Tesseract languages from the tessdata directory */
|
||||
public List<String> getAvailableTesseractLanguages() {
|
||||
@@ -63,39 +78,261 @@ public class OCRController {
|
||||
|
||||
@PostMapping(consumes = "multipart/form-data", value = "/ocr-pdf")
|
||||
@Operation(
|
||||
summary = "Process PDF files with OCR using Tesseract",
|
||||
summary = "Process a PDF file with OCR",
|
||||
description =
|
||||
"Takes a PDF file as input, performs OCR using specified languages and OCR type"
|
||||
+ " (skip-text/force-ocr), and returns the processed PDF. Input:PDF"
|
||||
+ " Output:PDF Type:SISO")
|
||||
"This endpoint processes a PDF file using OCR (Optical Character Recognition). "
|
||||
+ "Users can specify languages, sidecar, deskew, clean, cleanFinal, ocrType, ocrRenderType, and removeImagesAfter options. "
|
||||
+ "Uses OCRmyPDF if available, falls back to Tesseract. Input:PDF Output:PDF Type:SI-Conditional")
|
||||
public ResponseEntity<byte[]> processPdfWithOCR(
|
||||
@ModelAttribute ProcessPdfWithOcrRequest request)
|
||||
throws IOException, InterruptedException {
|
||||
MultipartFile inputFile = request.getFileInput();
|
||||
List<String> languages = request.getLanguages();
|
||||
List<String> selectedLanguages = request.getLanguages();
|
||||
Boolean sidecar = request.isSidecar();
|
||||
Boolean deskew = request.isDeskew();
|
||||
Boolean clean = request.isClean();
|
||||
Boolean cleanFinal = request.isCleanFinal();
|
||||
String ocrType = request.getOcrType();
|
||||
String ocrRenderType = request.getOcrRenderType();
|
||||
Boolean removeImagesAfter = request.isRemoveImagesAfter();
|
||||
|
||||
// Create a temp directory using TempFileManager directly
|
||||
Path tempDirPath = tempFileManager.createTempDirectory();
|
||||
File tempDir = tempDirPath.toFile();
|
||||
if (selectedLanguages == null || selectedLanguages.isEmpty()) {
|
||||
throw ExceptionUtils.createOcrLanguageRequiredException();
|
||||
}
|
||||
|
||||
try {
|
||||
File tempInputFile = new File(tempDir, "input.pdf");
|
||||
File tempOutputDir = new File(tempDir, "output");
|
||||
File tempImagesDir = new File(tempDir, "images");
|
||||
File finalOutputFile = new File(tempDir, "final_output.pdf");
|
||||
if (!"hocr".equals(ocrRenderType) && !"sandwich".equals(ocrRenderType)) {
|
||||
throw new IOException("ocrRenderType wrong");
|
||||
}
|
||||
|
||||
// Get available Tesseract languages
|
||||
List<String> availableLanguages = getAvailableTesseractLanguages();
|
||||
|
||||
// Validate selected languages
|
||||
selectedLanguages =
|
||||
selectedLanguages.stream().filter(availableLanguages::contains).toList();
|
||||
|
||||
if (selectedLanguages.isEmpty()) {
|
||||
throw ExceptionUtils.createOcrInvalidLanguagesException();
|
||||
}
|
||||
|
||||
// Use try-with-resources for proper temp file management
|
||||
try (TempFile tempInputFile = new TempFile(tempFileManager, ".pdf");
|
||||
TempFile tempOutputFile = new TempFile(tempFileManager, ".pdf")) {
|
||||
|
||||
inputFile.transferTo(tempInputFile.getFile());
|
||||
|
||||
TempFile sidecarTextFile = null;
|
||||
|
||||
try {
|
||||
// Use OCRmyPDF if available (no fallback - error if it fails)
|
||||
if (isOcrMyPdfEnabled()) {
|
||||
if (sidecar != null && sidecar) {
|
||||
sidecarTextFile = new TempFile(tempFileManager, ".txt");
|
||||
}
|
||||
|
||||
processWithOcrMyPdf(
|
||||
selectedLanguages,
|
||||
sidecar,
|
||||
deskew,
|
||||
clean,
|
||||
cleanFinal,
|
||||
ocrType,
|
||||
ocrRenderType,
|
||||
removeImagesAfter,
|
||||
tempInputFile.getPath(),
|
||||
tempOutputFile.getPath(),
|
||||
sidecarTextFile != null ? sidecarTextFile.getPath() : null);
|
||||
log.info("OCRmyPDF processing completed successfully");
|
||||
}
|
||||
// Use Tesseract only if OCRmyPDF is not available
|
||||
else if (isTesseractEnabled()) {
|
||||
processWithTesseract(
|
||||
selectedLanguages,
|
||||
ocrType,
|
||||
tempInputFile.getPath(),
|
||||
tempOutputFile.getPath());
|
||||
log.info("Tesseract processing completed successfully");
|
||||
} else {
|
||||
throw ExceptionUtils.createOcrToolsUnavailableException();
|
||||
}
|
||||
|
||||
// Read the processed PDF file
|
||||
byte[] pdfBytes = Files.readAllBytes(tempOutputFile.getPath());
|
||||
|
||||
// Return the OCR processed PDF as a response
|
||||
String outputFilename =
|
||||
Filenames.toSimpleFileName(inputFile.getOriginalFilename())
|
||||
.replaceFirst("[.][^.]+$", "")
|
||||
+ "_OCR.pdf";
|
||||
|
||||
if (sidecar != null && sidecar && sidecarTextFile != null) {
|
||||
// Create a zip file containing both the PDF and the text file
|
||||
String outputZipFilename =
|
||||
Filenames.toSimpleFileName(inputFile.getOriginalFilename())
|
||||
.replaceFirst("[.][^.]+$", "")
|
||||
+ "_OCR.zip";
|
||||
|
||||
try (TempFile tempZipFile = new TempFile(tempFileManager, ".zip");
|
||||
ZipOutputStream zipOut =
|
||||
new ZipOutputStream(
|
||||
Files.newOutputStream(tempZipFile.getPath()))) {
|
||||
|
||||
// Add PDF file to the zip
|
||||
ZipEntry pdfEntry = new ZipEntry(outputFilename);
|
||||
zipOut.putNextEntry(pdfEntry);
|
||||
zipOut.write(pdfBytes);
|
||||
zipOut.closeEntry();
|
||||
|
||||
// Add text file to the zip
|
||||
ZipEntry txtEntry = new ZipEntry(outputFilename.replace(".pdf", ".txt"));
|
||||
zipOut.putNextEntry(txtEntry);
|
||||
Files.copy(sidecarTextFile.getPath(), zipOut);
|
||||
zipOut.closeEntry();
|
||||
|
||||
zipOut.finish();
|
||||
|
||||
byte[] zipBytes = Files.readAllBytes(tempZipFile.getPath());
|
||||
|
||||
// Return the zip file containing both the PDF and the text file
|
||||
return WebResponseUtils.bytesToWebResponse(
|
||||
zipBytes, outputZipFilename, MediaType.APPLICATION_OCTET_STREAM);
|
||||
}
|
||||
} else {
|
||||
// Return the OCR processed PDF as a response
|
||||
return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename);
|
||||
}
|
||||
|
||||
} finally {
|
||||
// Clean up sidecar temp file if created
|
||||
if (sidecarTextFile != null) {
|
||||
try {
|
||||
sidecarTextFile.close();
|
||||
} catch (Exception e) {
|
||||
log.warn("Failed to close sidecar temp file", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processWithOcrMyPdf(
|
||||
List<String> selectedLanguages,
|
||||
Boolean sidecar,
|
||||
Boolean deskew,
|
||||
Boolean clean,
|
||||
Boolean cleanFinal,
|
||||
String ocrType,
|
||||
String ocrRenderType,
|
||||
Boolean removeImagesAfter,
|
||||
Path tempInputFile,
|
||||
Path tempOutputFile,
|
||||
Path sidecarTextPath)
|
||||
throws IOException, InterruptedException {
|
||||
|
||||
// Build OCRmyPDF command
|
||||
String languageOption = String.join("+", selectedLanguages);
|
||||
|
||||
List<String> command =
|
||||
new ArrayList<>(
|
||||
Arrays.asList(
|
||||
"ocrmypdf",
|
||||
"--verbose",
|
||||
"2",
|
||||
"--output-type",
|
||||
"pdf",
|
||||
"--pdf-renderer",
|
||||
ocrRenderType));
|
||||
|
||||
if (sidecar != null && sidecar && sidecarTextPath != null) {
|
||||
command.add("--sidecar");
|
||||
command.add(sidecarTextPath.toString());
|
||||
}
|
||||
|
||||
if (deskew != null && deskew) {
|
||||
command.add("--deskew");
|
||||
}
|
||||
if (clean != null && clean) {
|
||||
command.add("--clean");
|
||||
}
|
||||
if (cleanFinal != null && cleanFinal) {
|
||||
command.add("--clean-final");
|
||||
}
|
||||
if (ocrType != null && !"".equals(ocrType)) {
|
||||
if ("skip-text".equals(ocrType)) {
|
||||
command.add("--skip-text");
|
||||
} else if ("force-ocr".equals(ocrType)) {
|
||||
command.add("--force-ocr");
|
||||
}
|
||||
}
|
||||
|
||||
command.addAll(
|
||||
Arrays.asList(
|
||||
"--language",
|
||||
languageOption,
|
||||
tempInputFile.toString(),
|
||||
tempOutputFile.toString()));
|
||||
|
||||
// Run CLI command
|
||||
ProcessExecutorResult result =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.OCR_MY_PDF)
|
||||
.runCommandWithOutputHandling(command);
|
||||
|
||||
if (result.getRc() != 0
|
||||
&& result.getMessages().contains("multiprocessing/synchronize.py")
|
||||
&& result.getMessages().contains("OSError: [Errno 38] Function not implemented")) {
|
||||
command.add("--jobs");
|
||||
command.add("1");
|
||||
result =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.OCR_MY_PDF)
|
||||
.runCommandWithOutputHandling(command);
|
||||
}
|
||||
|
||||
if (result.getRc() != 0) {
|
||||
throw new IOException("OCRmyPDF failed with return code: " + result.getRc());
|
||||
}
|
||||
|
||||
// Remove images from the OCR processed PDF if the flag is set to true
|
||||
if (removeImagesAfter != null && removeImagesAfter) {
|
||||
try (TempFile tempPdfWithoutImages = new TempFile(tempFileManager, "_no_images.pdf")) {
|
||||
List<String> gsCommand =
|
||||
Arrays.asList(
|
||||
"gs",
|
||||
"-sDEVICE=pdfwrite",
|
||||
"-dFILTERIMAGE",
|
||||
"-o",
|
||||
tempPdfWithoutImages.getPath().toString(),
|
||||
tempOutputFile.toString());
|
||||
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.GHOSTSCRIPT)
|
||||
.runCommandWithOutputHandling(gsCommand);
|
||||
|
||||
// Replace output file with version without images
|
||||
Files.copy(
|
||||
tempPdfWithoutImages.getPath(),
|
||||
tempOutputFile,
|
||||
java.nio.file.StandardCopyOption.REPLACE_EXISTING);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processWithTesseract(
|
||||
List<String> selectedLanguages, String ocrType, Path tempInputFile, Path tempOutputFile)
|
||||
throws IOException, InterruptedException {
|
||||
|
||||
// Create temp directory for Tesseract processing
|
||||
try (TempDirectory tempDir = new TempDirectory(tempFileManager)) {
|
||||
File tempOutputDir = new File(tempDir.getPath().toFile(), "output");
|
||||
File tempImagesDir = new File(tempDir.getPath().toFile(), "images");
|
||||
File finalOutputFile = new File(tempDir.getPath().toFile(), "final_output.pdf");
|
||||
|
||||
// Create directories
|
||||
tempOutputDir.mkdirs();
|
||||
tempImagesDir.mkdirs();
|
||||
|
||||
// Save input file
|
||||
inputFile.transferTo(tempInputFile);
|
||||
|
||||
PDFMergerUtility merger = new PDFMergerUtility();
|
||||
merger.setDestinationFileName(finalOutputFile.toString());
|
||||
|
||||
try (PDDocument document = pdfDocumentFactory.load(tempInputFile)) {
|
||||
try (PDDocument document = pdfDocumentFactory.load(tempInputFile.toFile())) {
|
||||
PDFRenderer pdfRenderer = new PDFRenderer(document);
|
||||
int pageCount = document.getNumberOfPages();
|
||||
|
||||
@@ -135,35 +372,24 @@ public class OCRController {
|
||||
new File(tempOutputDir, String.format("page_%d", pageNum))
|
||||
.toString());
|
||||
command.add("-l");
|
||||
command.add(String.join("+", languages));
|
||||
// Always output PDF
|
||||
command.add("pdf");
|
||||
command.add(String.join("+", selectedLanguages));
|
||||
command.add("pdf"); // Always output PDF
|
||||
|
||||
// Use ProcessExecutor to run tesseract command
|
||||
try {
|
||||
ProcessExecutorResult result =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.TESSERACT)
|
||||
.runCommandWithOutputHandling(command);
|
||||
ProcessExecutorResult result =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.TESSERACT)
|
||||
.runCommandWithOutputHandling(command);
|
||||
|
||||
log.debug(
|
||||
"Tesseract OCR completed for page {} with exit code {}",
|
||||
pageNum,
|
||||
if (result.getRc() != 0) {
|
||||
throw ExceptionUtils.createRuntimeException(
|
||||
"error.commandFailed",
|
||||
"{0} command failed with exit code: {1}",
|
||||
null,
|
||||
"Tesseract",
|
||||
result.getRc());
|
||||
|
||||
// Add OCR'd PDF to merger
|
||||
merger.addSource(pageOutputPath);
|
||||
} catch (IOException | InterruptedException e) {
|
||||
log.error(
|
||||
"Error processing page {} with tesseract: {}",
|
||||
pageNum,
|
||||
e.getMessage());
|
||||
// If OCR fails, fall back to the original page
|
||||
try (PDDocument pageDoc = new PDDocument()) {
|
||||
pageDoc.addPage(page);
|
||||
pageDoc.save(pageOutputPath);
|
||||
merger.addSource(pageOutputPath);
|
||||
}
|
||||
}
|
||||
|
||||
// Add OCR'd PDF to merger
|
||||
merger.addSource(pageOutputPath);
|
||||
} else {
|
||||
// Save original page without OCR
|
||||
try (PDDocument pageDoc = new PDDocument()) {
|
||||
@@ -178,40 +404,11 @@ public class OCRController {
|
||||
// Merge all pages into final PDF
|
||||
merger.mergeDocuments(null);
|
||||
|
||||
// Read the final PDF file
|
||||
byte[] pdfContent = java.nio.file.Files.readAllBytes(finalOutputFile.toPath());
|
||||
String outputFilename =
|
||||
Filenames.toSimpleFileName(inputFile.getOriginalFilename())
|
||||
.replaceFirst("[.][^.]+$", "")
|
||||
+ "_OCR.pdf";
|
||||
|
||||
return ResponseEntity.ok()
|
||||
.header(
|
||||
"Content-Disposition",
|
||||
"attachment; filename=\"" + outputFilename + "\"")
|
||||
.contentType(MediaType.APPLICATION_PDF)
|
||||
.body(pdfContent);
|
||||
} finally {
|
||||
// Clean up the temp directory and all its contents
|
||||
tempFileManager.deleteTempDirectory(tempDirPath);
|
||||
}
|
||||
}
|
||||
|
||||
private void addFileToZip(File file, String filename, ZipOutputStream zipOut)
|
||||
throws IOException {
|
||||
if (!file.exists()) {
|
||||
log.warn("File {} does not exist, skipping", file);
|
||||
return;
|
||||
}
|
||||
try (FileInputStream fis = new FileInputStream(file)) {
|
||||
ZipEntry zipEntry = new ZipEntry(filename);
|
||||
zipOut.putNextEntry(zipEntry);
|
||||
byte[] buffer = new byte[1024];
|
||||
int length;
|
||||
while ((length = fis.read(buffer)) >= 0) {
|
||||
zipOut.write(buffer, 0, length);
|
||||
}
|
||||
zipOut.closeEntry();
|
||||
// Copy final output to the expected location
|
||||
Files.copy(
|
||||
finalOutputFile.toPath(),
|
||||
tempOutputFile,
|
||||
java.nio.file.StandardCopyOption.REPLACE_EXISTING);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+73
-15
@@ -16,7 +16,9 @@ import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.SPDF.config.EndpointConfiguration;
|
||||
import stirling.software.common.model.api.PDFFile;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ProcessExecutor;
|
||||
@@ -28,17 +30,27 @@ import stirling.software.common.util.WebResponseUtils;
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/misc")
|
||||
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
public class RepairController {
|
||||
|
||||
private final CustomPDFDocumentFactory pdfDocumentFactory;
|
||||
private final TempFileManager tempFileManager;
|
||||
private final EndpointConfiguration endpointConfiguration;
|
||||
|
||||
private boolean isGhostscriptEnabled() {
|
||||
return endpointConfiguration.isGroupEnabled("Ghostscript");
|
||||
}
|
||||
|
||||
private boolean isQpdfEnabled() {
|
||||
return endpointConfiguration.isGroupEnabled("qpdf");
|
||||
}
|
||||
|
||||
@PostMapping(consumes = "multipart/form-data", value = "/repair")
|
||||
@Operation(
|
||||
summary = "Repair a PDF file",
|
||||
description =
|
||||
"This endpoint repairs a given PDF file by running qpdf command. The PDF is"
|
||||
"This endpoint repairs a given PDF file by running Ghostscript (primary), qpdf (fallback), or PDFBox (if no external tools available). The PDF is"
|
||||
+ " first saved to a temporary location, repaired, read back, and then"
|
||||
+ " returned as a response. Input:PDF Output:PDF Type:SISO")
|
||||
public ResponseEntity<byte[]> repairPdf(@ModelAttribute PDFFile file)
|
||||
@@ -46,25 +58,71 @@ public class RepairController {
|
||||
MultipartFile inputFile = file.getFileInput();
|
||||
|
||||
// Use TempFile with try-with-resources for automatic cleanup
|
||||
try (TempFile tempFile = new TempFile(tempFileManager, ".pdf")) {
|
||||
try (TempFile tempInputFile = new TempFile(tempFileManager, ".pdf");
|
||||
TempFile tempOutputFile = new TempFile(tempFileManager, ".pdf")) {
|
||||
|
||||
// Save the uploaded file to the temporary location
|
||||
inputFile.transferTo(tempFile.getFile());
|
||||
inputFile.transferTo(tempInputFile.getFile());
|
||||
|
||||
List<String> command = new ArrayList<>();
|
||||
command.add("qpdf");
|
||||
command.add("--replace-input"); // Automatically fixes problems it can
|
||||
command.add("--qdf"); // Linearizes and normalizes PDF structure
|
||||
command.add("--object-streams=disable"); // Can help with some corruptions
|
||||
command.add(tempFile.getFile().getAbsolutePath());
|
||||
boolean repairSuccess = false;
|
||||
|
||||
ProcessExecutorResult returnCode =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.QPDF)
|
||||
.runCommandWithOutputHandling(command);
|
||||
// Try Ghostscript first if available
|
||||
if (isGhostscriptEnabled()) {
|
||||
try {
|
||||
List<String> gsCommand = new ArrayList<>();
|
||||
gsCommand.add("gs");
|
||||
gsCommand.add("-o");
|
||||
gsCommand.add(tempOutputFile.getPath().toString());
|
||||
gsCommand.add("-sDEVICE=pdfwrite");
|
||||
gsCommand.add(tempInputFile.getPath().toString());
|
||||
|
||||
// Read the optimized PDF file
|
||||
byte[] pdfBytes = pdfDocumentFactory.loadToBytes(tempFile.getFile());
|
||||
ProcessExecutorResult gsResult =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.GHOSTSCRIPT)
|
||||
.runCommandWithOutputHandling(gsCommand);
|
||||
|
||||
// Return the optimized PDF as a response
|
||||
if (gsResult.getRc() == 0) {
|
||||
repairSuccess = true;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// Log and continue to QPDF fallback
|
||||
log.warn("Ghostscript repair failed, trying QPDF fallback: ", e);
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback to QPDF if Ghostscript failed or not available
|
||||
if (!repairSuccess && isQpdfEnabled()) {
|
||||
List<String> qpdfCommand = new ArrayList<>();
|
||||
qpdfCommand.add("qpdf");
|
||||
qpdfCommand.add("--replace-input"); // Automatically fixes problems it can
|
||||
qpdfCommand.add("--qdf"); // Linearizes and normalizes PDF structure
|
||||
qpdfCommand.add("--object-streams=disable"); // Can help with some corruptions
|
||||
qpdfCommand.add(tempInputFile.getPath().toString());
|
||||
qpdfCommand.add(tempOutputFile.getPath().toString());
|
||||
|
||||
ProcessExecutorResult qpdfResult =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.QPDF)
|
||||
.runCommandWithOutputHandling(qpdfCommand);
|
||||
|
||||
repairSuccess = true;
|
||||
}
|
||||
|
||||
// Use PDFBox as last resort if no external tools are available
|
||||
if (!repairSuccess) {
|
||||
if (!isGhostscriptEnabled() && !isQpdfEnabled()) {
|
||||
// Basic PDFBox repair - load and save to fix structural issues
|
||||
try (var document = pdfDocumentFactory.load(tempInputFile.getFile())) {
|
||||
document.save(tempOutputFile.getFile());
|
||||
repairSuccess = true;
|
||||
}
|
||||
} else {
|
||||
throw new IOException("PDF repair failed with available tools");
|
||||
}
|
||||
}
|
||||
|
||||
// Read the repaired PDF file
|
||||
byte[] pdfBytes = pdfDocumentFactory.loadToBytes(tempOutputFile.getFile());
|
||||
|
||||
// Return the repaired PDF as a response
|
||||
String outputFilename =
|
||||
Filenames.toSimpleFileName(inputFile.getOriginalFilename())
|
||||
.replaceFirst("[.][^.]+$", "")
|
||||
|
||||
+34
-2
@@ -150,11 +150,22 @@ public class PipelineProcessor {
|
||||
}
|
||||
}
|
||||
if (!hasInputFileType) {
|
||||
String filename = file.getFilename();
|
||||
String providedExtension = "no extension";
|
||||
if (filename != null && filename.contains(".")) {
|
||||
providedExtension =
|
||||
filename.substring(filename.lastIndexOf(".")).toLowerCase();
|
||||
}
|
||||
|
||||
logPrintStream.println(
|
||||
"No files with extension "
|
||||
+ String.join(", ", inputFileTypes)
|
||||
+ " found for operation "
|
||||
+ operation);
|
||||
+ operation
|
||||
+ ". Provided file '"
|
||||
+ filename
|
||||
+ "' has extension: "
|
||||
+ providedExtension);
|
||||
hasErrors = true;
|
||||
}
|
||||
}
|
||||
@@ -203,11 +214,32 @@ public class PipelineProcessor {
|
||||
hasErrors = true;
|
||||
}
|
||||
} else {
|
||||
// Get details about what files were actually provided
|
||||
List<String> providedExtensions =
|
||||
outputFiles.stream()
|
||||
.map(
|
||||
file -> {
|
||||
String filename = file.getFilename();
|
||||
if (filename != null && filename.contains(".")) {
|
||||
return filename.substring(
|
||||
filename.lastIndexOf("."))
|
||||
.toLowerCase();
|
||||
}
|
||||
return "no extension";
|
||||
})
|
||||
.distinct()
|
||||
.toList();
|
||||
|
||||
logPrintStream.println(
|
||||
"No files with extension "
|
||||
+ String.join(", ", inputFileTypes)
|
||||
+ " found for multi-input operation "
|
||||
+ operation);
|
||||
+ operation
|
||||
+ ". Provided files have extensions: "
|
||||
+ String.join(", ", providedExtensions)
|
||||
+ " (total files: "
|
||||
+ outputFiles.size()
|
||||
+ ")");
|
||||
hasErrors = true;
|
||||
}
|
||||
}
|
||||
|
||||
+12
-4
@@ -65,6 +65,7 @@ import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import io.github.pixee.security.Filenames;
|
||||
import io.micrometer.common.util.StringUtils;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
@@ -73,6 +74,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.SPDF.model.api.security.SignPDFWithCertRequest;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
|
||||
@RestController
|
||||
@@ -132,7 +134,7 @@ public class CertSignController {
|
||||
}
|
||||
doc.saveIncremental(output);
|
||||
} catch (Exception e) {
|
||||
log.error("exception", e);
|
||||
ExceptionUtils.logException("PDF signing", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,8 +167,11 @@ public class CertSignController {
|
||||
Integer pageNumber = request.getPageNumber() != null ? (request.getPageNumber() - 1) : null;
|
||||
Boolean showLogo = request.getShowLogo();
|
||||
|
||||
if (certType == null) {
|
||||
throw new IllegalArgumentException("Cert type must be provided");
|
||||
if (StringUtils.isBlank(certType)) {
|
||||
throw ExceptionUtils.createIllegalArgumentException(
|
||||
"error.optionsNotSpecified",
|
||||
"{0} options are not specified",
|
||||
"certificate type");
|
||||
}
|
||||
|
||||
KeyStore ks = null;
|
||||
@@ -189,7 +194,10 @@ public class CertSignController {
|
||||
ks.load(jksfile.getInputStream(), password.toCharArray());
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Invalid cert type: " + certType);
|
||||
throw ExceptionUtils.createIllegalArgumentException(
|
||||
"error.invalidArgument",
|
||||
"Invalid argument: {0}",
|
||||
"certificate type: " + certType);
|
||||
}
|
||||
|
||||
CreateSignature createSignature = new CreateSignature(ks, password.toCharArray());
|
||||
|
||||
+45
-20
@@ -63,6 +63,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.common.model.api.PDFFile;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
|
||||
@RestController
|
||||
@@ -149,23 +150,39 @@ public class GetInfoOnPDF {
|
||||
try {
|
||||
PDMetadata pdMetadata = document.getDocumentCatalog().getMetadata();
|
||||
if (pdMetadata != null) {
|
||||
COSInputStream metaStream = pdMetadata.createInputStream();
|
||||
DomXmpParser domXmpParser = new DomXmpParser();
|
||||
XMPMetadata xmpMeta = domXmpParser.parse(metaStream);
|
||||
try (COSInputStream metaStream = pdMetadata.createInputStream()) {
|
||||
// First try to read raw metadata as string to check for standard keywords
|
||||
byte[] metadataBytes = metaStream.readAllBytes();
|
||||
String rawMetadata = new String(metadataBytes, StandardCharsets.UTF_8);
|
||||
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
new XmpSerializer().serialize(xmpMeta, baos, true);
|
||||
String xmpString = new String(baos.toByteArray(), StandardCharsets.UTF_8);
|
||||
if (rawMetadata.contains(standardKeyword)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (xmpString.contains(standardKeyword)) {
|
||||
return true;
|
||||
// If raw check doesn't find it, try parsing with XMP parser
|
||||
try (COSInputStream metaStream = pdMetadata.createInputStream()) {
|
||||
try {
|
||||
DomXmpParser domXmpParser = new DomXmpParser();
|
||||
XMPMetadata xmpMeta = domXmpParser.parse(metaStream);
|
||||
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
new XmpSerializer().serialize(xmpMeta, baos, true);
|
||||
String xmpString = new String(baos.toByteArray(), StandardCharsets.UTF_8);
|
||||
|
||||
if (xmpString.contains(standardKeyword)) {
|
||||
return true;
|
||||
}
|
||||
} catch (XmpParsingException e) {
|
||||
// XMP parsing failed, but we already checked raw metadata above
|
||||
log.debug(
|
||||
"XMP parsing failed for standard check, but raw metadata was already checked: {}",
|
||||
e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (
|
||||
Exception
|
||||
e) { // Catching general exception for brevity, ideally you'd catch specific
|
||||
// exceptions.
|
||||
log.error("exception", e);
|
||||
} catch (Exception e) {
|
||||
ExceptionUtils.logException("PDF standard checking", e);
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -391,14 +408,22 @@ public class GetInfoOnPDF {
|
||||
|
||||
if (pdMetadata != null) {
|
||||
try {
|
||||
COSInputStream is = pdMetadata.createInputStream();
|
||||
DomXmpParser domXmpParser = new DomXmpParser();
|
||||
XMPMetadata xmpMeta = domXmpParser.parse(is);
|
||||
try (COSInputStream is = pdMetadata.createInputStream()) {
|
||||
DomXmpParser domXmpParser = new DomXmpParser();
|
||||
XMPMetadata xmpMeta = domXmpParser.parse(is);
|
||||
|
||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||
new XmpSerializer().serialize(xmpMeta, os, true);
|
||||
xmpString = new String(os.toByteArray(), StandardCharsets.UTF_8);
|
||||
} catch (XmpParsingException | IOException e) {
|
||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||
new XmpSerializer().serialize(xmpMeta, os, true);
|
||||
xmpString = new String(os.toByteArray(), StandardCharsets.UTF_8);
|
||||
}
|
||||
} catch (XmpParsingException e) {
|
||||
// XMP parsing failed, try to read raw metadata instead
|
||||
log.debug("XMP parsing failed, reading raw metadata: {}", e.getMessage());
|
||||
try (COSInputStream is = pdMetadata.createInputStream()) {
|
||||
byte[] metadataBytes = is.readAllBytes();
|
||||
xmpString = new String(metadataBytes, StandardCharsets.UTF_8);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log.error("exception", e);
|
||||
}
|
||||
}
|
||||
|
||||
+14
-6
@@ -21,6 +21,7 @@ import lombok.RequiredArgsConstructor;
|
||||
import stirling.software.SPDF.model.api.security.AddPasswordRequest;
|
||||
import stirling.software.SPDF.model.api.security.PDFPasswordRequest;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.WebResponseUtils;
|
||||
|
||||
@RestController
|
||||
@@ -42,12 +43,19 @@ public class PasswordController {
|
||||
MultipartFile fileInput = request.getFileInput();
|
||||
String password = request.getPassword();
|
||||
PDDocument document = pdfDocumentFactory.load(fileInput, password);
|
||||
document.setAllSecurityToBeRemoved(true);
|
||||
return WebResponseUtils.pdfDocToWebResponse(
|
||||
document,
|
||||
Filenames.toSimpleFileName(fileInput.getOriginalFilename())
|
||||
.replaceFirst("[.][^.]+$", "")
|
||||
+ "_password_removed.pdf");
|
||||
|
||||
try {
|
||||
document.setAllSecurityToBeRemoved(true);
|
||||
return WebResponseUtils.pdfDocToWebResponse(
|
||||
document,
|
||||
Filenames.toSimpleFileName(fileInput.getOriginalFilename())
|
||||
.replaceFirst("[.][^.]+$", "")
|
||||
+ "_password_removed.pdf");
|
||||
} catch (IOException e) {
|
||||
document.close();
|
||||
ExceptionUtils.logException("password removal", e);
|
||||
throw ExceptionUtils.handlePdfException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@PostMapping(consumes = "multipart/form-data", value = "/add-password")
|
||||
|
||||
+7
-1
@@ -41,6 +41,7 @@ import stirling.software.SPDF.model.api.security.SignatureValidationRequest;
|
||||
import stirling.software.SPDF.model.api.security.SignatureValidationResult;
|
||||
import stirling.software.SPDF.service.CertificateValidationService;
|
||||
import stirling.software.common.service.CustomPDFDocumentFactory;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/security")
|
||||
@@ -82,7 +83,12 @@ public class ValidateSignatureController {
|
||||
CertificateFactory cf = CertificateFactory.getInstance("X.509");
|
||||
customCert = (X509Certificate) cf.generateCertificate(certStream);
|
||||
} catch (CertificateException e) {
|
||||
throw new RuntimeException("Invalid certificate file: " + e.getMessage());
|
||||
throw ExceptionUtils.createRuntimeException(
|
||||
"error.invalidFormat",
|
||||
"Invalid {0} format: {1}",
|
||||
e,
|
||||
"certificate file",
|
||||
e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+7
-2
@@ -29,6 +29,7 @@ import stirling.software.SPDF.service.SignatureService;
|
||||
import stirling.software.common.configuration.InstallationPathConfig;
|
||||
import stirling.software.common.configuration.RuntimePathConfig;
|
||||
import stirling.software.common.service.UserServiceInterface;
|
||||
import stirling.software.common.util.ExceptionUtils;
|
||||
import stirling.software.common.util.GeneralUtils;
|
||||
|
||||
@Controller
|
||||
@@ -263,13 +264,17 @@ public class GeneralWebController {
|
||||
}
|
||||
return null;
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Error processing filename", e);
|
||||
throw ExceptionUtils.createRuntimeException(
|
||||
"error.fontLoadingFailed",
|
||||
"Error processing font file",
|
||||
e);
|
||||
}
|
||||
})
|
||||
.filter(Objects::nonNull)
|
||||
.toList();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Failed to read font directory from " + locationPattern, e);
|
||||
throw ExceptionUtils.createRuntimeException(
|
||||
"error.fontDirectoryReadFailed", "Failed to read font directory", e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+15
@@ -19,6 +19,18 @@ public class ProcessPdfWithOcrRequest extends PDFFile {
|
||||
defaultValue = "[\"eng\"]")
|
||||
private List<String> languages;
|
||||
|
||||
@Schema(description = "Include OCR text in a sidecar text file if set to true")
|
||||
private boolean sidecar;
|
||||
|
||||
@Schema(description = "Deskew the input file if set to true")
|
||||
private boolean deskew;
|
||||
|
||||
@Schema(description = "Clean the input file if set to true")
|
||||
private boolean clean;
|
||||
|
||||
@Schema(description = "Clean the final output if set to true")
|
||||
private boolean cleanFinal;
|
||||
|
||||
@Schema(
|
||||
description = "Specify the OCR type, e.g., 'skip-text', 'force-ocr', or 'Normal'",
|
||||
requiredMode = Schema.RequiredMode.REQUIRED,
|
||||
@@ -31,4 +43,7 @@ public class ProcessPdfWithOcrRequest extends PDFFile {
|
||||
allowableValues = {"hocr", "sandwich"},
|
||||
defaultValue = "hocr")
|
||||
private String ocrRenderType = "hocr";
|
||||
|
||||
@Schema(description = "Remove images from the output PDF if set to true")
|
||||
private boolean removeImagesAfter;
|
||||
}
|
||||
|
||||
@@ -120,8 +120,8 @@ public class ApiDocService {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
apiDocsJsonRootNode = mapper.readTree(apiDocsJson);
|
||||
JsonNode paths = apiDocsJsonRootNode.path("paths");
|
||||
paths.fields()
|
||||
.forEachRemaining(
|
||||
paths.propertyStream()
|
||||
.forEach(
|
||||
entry -> {
|
||||
String path = entry.getKey();
|
||||
JsonNode pathNode = entry.getValue();
|
||||
|
||||
+1
-1
@@ -77,7 +77,7 @@ public class MetricsAggregatorService {
|
||||
double lastCount = lastSentMetrics.getOrDefault(key, 0.0);
|
||||
double difference = currentCount - lastCount;
|
||||
if (difference > 0) {
|
||||
logger.info("{}, {}", key, difference);
|
||||
logger.debug("{}, {}", key, difference);
|
||||
metrics.put(key, difference);
|
||||
lastSentMetrics.put(key, currentCount);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
package stirling.software.common.controller;
|
||||
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
@@ -14,6 +18,7 @@ import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import stirling.software.common.model.job.JobResult;
|
||||
import stirling.software.common.model.job.ResultFile;
|
||||
import stirling.software.common.service.FileStorage;
|
||||
import stirling.software.common.service.JobQueue;
|
||||
import stirling.software.common.service.TaskManager;
|
||||
@@ -78,16 +83,31 @@ public class JobController {
|
||||
return ResponseEntity.badRequest().body("Job failed: " + result.getError());
|
||||
}
|
||||
|
||||
if (result.getFileId() != null) {
|
||||
// Handle multiple files - return metadata for client to download individually
|
||||
if (result.hasMultipleFiles()) {
|
||||
return ResponseEntity.ok()
|
||||
.contentType(MediaType.APPLICATION_JSON)
|
||||
.body(
|
||||
Map.of(
|
||||
"jobId",
|
||||
jobId,
|
||||
"hasMultipleFiles",
|
||||
true,
|
||||
"files",
|
||||
result.getAllResultFiles()));
|
||||
}
|
||||
|
||||
// Handle single file (download directly)
|
||||
if (result.hasFiles() && !result.hasMultipleFiles()) {
|
||||
try {
|
||||
byte[] fileContent = fileStorage.retrieveBytes(result.getFileId());
|
||||
List<ResultFile> files = result.getAllResultFiles();
|
||||
ResultFile singleFile = files.get(0);
|
||||
byte[] fileContent = fileStorage.retrieveBytes(singleFile.getFileId());
|
||||
return ResponseEntity.ok()
|
||||
.header("Content-Type", result.getContentType())
|
||||
.header("Content-Type", singleFile.getContentType())
|
||||
.header(
|
||||
"Content-Disposition",
|
||||
"form-data; name=\"attachment\"; filename=\""
|
||||
+ result.getOriginalFileName()
|
||||
+ "\"")
|
||||
createContentDispositionHeader(singleFile.getFileName()))
|
||||
.body(fileContent);
|
||||
} catch (Exception e) {
|
||||
log.error("Error retrieving file for job {}: {}", jobId, e.getMessage(), e);
|
||||
@@ -170,4 +190,127 @@ public class JobController {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the list of files for a job
|
||||
*
|
||||
* @param jobId The job ID
|
||||
* @return List of files for the job
|
||||
*/
|
||||
@GetMapping("/api/v1/general/job/{jobId}/result/files")
|
||||
public ResponseEntity<?> getJobFiles(@PathVariable("jobId") String jobId) {
|
||||
JobResult result = taskManager.getJobResult(jobId);
|
||||
if (result == null) {
|
||||
return ResponseEntity.notFound().build();
|
||||
}
|
||||
|
||||
if (!result.isComplete()) {
|
||||
return ResponseEntity.badRequest().body("Job is not complete yet");
|
||||
}
|
||||
|
||||
if (result.getError() != null) {
|
||||
return ResponseEntity.badRequest().body("Job failed: " + result.getError());
|
||||
}
|
||||
|
||||
List<ResultFile> files = result.getAllResultFiles();
|
||||
return ResponseEntity.ok(
|
||||
Map.of(
|
||||
"jobId", jobId,
|
||||
"fileCount", files.size(),
|
||||
"files", files));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get metadata for an individual file by its file ID
|
||||
*
|
||||
* @param fileId The file ID
|
||||
* @return The file metadata
|
||||
*/
|
||||
@GetMapping("/api/v1/general/files/{fileId}/metadata")
|
||||
public ResponseEntity<?> getFileMetadata(@PathVariable("fileId") String fileId) {
|
||||
try {
|
||||
// Verify file exists
|
||||
if (!fileStorage.fileExists(fileId)) {
|
||||
return ResponseEntity.notFound().build();
|
||||
}
|
||||
|
||||
// Find the file metadata from any job that contains this file
|
||||
ResultFile resultFile = taskManager.findResultFileByFileId(fileId);
|
||||
|
||||
if (resultFile != null) {
|
||||
return ResponseEntity.ok(resultFile);
|
||||
} else {
|
||||
// File exists but no metadata found, get basic info efficiently
|
||||
long fileSize = fileStorage.getFileSize(fileId);
|
||||
return ResponseEntity.ok(
|
||||
Map.of(
|
||||
"fileId",
|
||||
fileId,
|
||||
"fileName",
|
||||
"unknown",
|
||||
"contentType",
|
||||
"application/octet-stream",
|
||||
"fileSize",
|
||||
fileSize));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("Error retrieving file metadata {}: {}", fileId, e.getMessage(), e);
|
||||
return ResponseEntity.internalServerError()
|
||||
.body("Error retrieving file metadata: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Download an individual file by its file ID
|
||||
*
|
||||
* @param fileId The file ID
|
||||
* @return The file content
|
||||
*/
|
||||
@GetMapping("/api/v1/general/files/{fileId}")
|
||||
public ResponseEntity<?> downloadFile(@PathVariable("fileId") String fileId) {
|
||||
try {
|
||||
// Verify file exists
|
||||
if (!fileStorage.fileExists(fileId)) {
|
||||
return ResponseEntity.notFound().build();
|
||||
}
|
||||
|
||||
// Retrieve file content
|
||||
byte[] fileContent = fileStorage.retrieveBytes(fileId);
|
||||
|
||||
// Find the file metadata from any job that contains this file
|
||||
// This is for getting the original filename and content type
|
||||
ResultFile resultFile = taskManager.findResultFileByFileId(fileId);
|
||||
|
||||
String fileName = resultFile != null ? resultFile.getFileName() : "download";
|
||||
String contentType =
|
||||
resultFile != null ? resultFile.getContentType() : "application/octet-stream";
|
||||
|
||||
return ResponseEntity.ok()
|
||||
.header("Content-Type", contentType)
|
||||
.header("Content-Disposition", createContentDispositionHeader(fileName))
|
||||
.body(fileContent);
|
||||
} catch (Exception e) {
|
||||
log.error("Error retrieving file {}: {}", fileId, e.getMessage(), e);
|
||||
return ResponseEntity.internalServerError()
|
||||
.body("Error retrieving file: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Content-Disposition header with UTF-8 filename support
|
||||
*
|
||||
* @param fileName The filename to encode
|
||||
* @return Content-Disposition header value
|
||||
*/
|
||||
private String createContentDispositionHeader(String fileName) {
|
||||
try {
|
||||
String encodedFileName =
|
||||
URLEncoder.encode(fileName, StandardCharsets.UTF_8)
|
||||
.replace("+", "%20"); // URLEncoder uses + for spaces, but we want %20
|
||||
return "attachment; filename=\"" + fileName + "\"; filename*=UTF-8''" + encodedFileName;
|
||||
} catch (Exception e) {
|
||||
// Fallback to basic filename if encoding fails
|
||||
return "attachment; filename=\"" + fileName + "\"";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=الأبجدية
|
||||
downloadPdf=تنزيل PDF
|
||||
text=نص
|
||||
font=الخط
|
||||
selectFillter=- حدد -
|
||||
selectFilter=- حدد -
|
||||
pageNum=رقم الصفحة
|
||||
sizes.small=صغير
|
||||
sizes.medium=وسط
|
||||
sizes.large=كبير
|
||||
sizes.x-large=كبير جدا
|
||||
error.pdfPassword=ملف PDF محمي بكلمة مرور ولم يتم تقديم كلمة المرور أو كانت غير صحيحة
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=حذف
|
||||
username=اسم المستخدم
|
||||
password=كلمة المرور
|
||||
@@ -181,7 +242,6 @@ red=أحمر
|
||||
green=أخضر
|
||||
blue=أزرق
|
||||
custom=مخصص...
|
||||
WorkInProgess=العمل قيد التقدم، قد لا يعمل أو يحتوي على أخطاء، يرجى الإبلاغ عن أي مشاكل!
|
||||
poweredBy=مدعوم بواسطة
|
||||
yes=نعم
|
||||
no=لا
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=إضافة صورة إلى ملف PDF
|
||||
home.addImage.desc=إضافة صورة إلى موقع معين في PDF (العمل قيد التقدم)
|
||||
addImage.tags=صورة,jpg,صورة,صورة فوتوغرافية
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=إضافة علامة مائية
|
||||
home.watermark.desc=أضف علامة مائية مخصصة إلى مستند PDF الخاص بك.
|
||||
watermark.tags=نص,تكرار,تسمية,خاص,حقوق النشر,علامة تجارية,صورة,jpg,صورة,صورة فوتوغرافية
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=كل صفحة؟
|
||||
addImage.upload=إضافة صورة
|
||||
addImage.submit=إضافة صورة
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=دمج
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=قم بسحب المفات وإفلاتها هنا
|
||||
fileChooser.extractPDF=جاري الاستخراج...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Əlifba
|
||||
downloadPdf=PDF Yüklə
|
||||
text=Yazı
|
||||
font=Şrift
|
||||
selectFillter=-- Seç --
|
||||
selectFilter=-- Seç --
|
||||
pageNum=Səhifə nömrəsi
|
||||
sizes.small=Kiçik
|
||||
sizes.medium=Orta
|
||||
sizes.large=Böyük
|
||||
sizes.x-large=Ekstra Böyük
|
||||
error.pdfPassword=PDF sənədi şifrlənmişdir və şifr təmin edilməmişdir və ya yanlışdır.
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Sil
|
||||
username=İstifadəçi Adı
|
||||
password=Şifr
|
||||
@@ -181,7 +242,6 @@ red=Qırmızı
|
||||
green=Yaşıl
|
||||
blue=Mavi
|
||||
custom=Xüsusi...
|
||||
WorkInProgess=İş davam edir, İşləməyə bilər və ya xətalarla üzləşə bilərsiniz, Zəhmət olmasa problemləri bildirin!
|
||||
poweredBy=Təchiz edilmişdir
|
||||
yes=Bəli
|
||||
no=Xeyr
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Şəkil əlavə et
|
||||
home.addImage.desc=PDF-də təyin edilmiş yerə şəkil əlavə edir
|
||||
addImage.tags=şəkil,jpg,fotoşəkil,foto
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Watermark əlavə et
|
||||
home.watermark.desc=PDF sənədinə fərdi watermark əlavə et.
|
||||
watermark.tags=Mətn,təkrarlanan,nişan,sahib olmaq,müəllif hüquqları,əmtəə nişanı,şəkil,jpg,fotoşəkil,foto
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Bütün Səhifələr?
|
||||
addImage.upload=Şəkli Əlavə Et
|
||||
addImage.submit=Şəkli Əlavə Et
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Birləşdirin
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Buraxılışlar
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Азбука
|
||||
downloadPdf=Изтеглете PDF
|
||||
text=Текст
|
||||
font=Шрифт
|
||||
selectFillter=-- Изберете --
|
||||
selectFilter=-- Изберете --
|
||||
pageNum=Брой страница
|
||||
sizes.small=Малък
|
||||
sizes.medium=Среден
|
||||
sizes.large=Голям
|
||||
sizes.x-large=X-Голям
|
||||
error.pdfPassword=PDF документът е с парола и или паролата не е предоставена, или е неправилна
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Изтрий
|
||||
username=Потребителско име
|
||||
password=Парола
|
||||
@@ -181,7 +242,6 @@ red=Червено
|
||||
green=Зелено
|
||||
blue=Синьо
|
||||
custom=Персонализиране...
|
||||
WorkInProgess=Работата е в ход, може да не работи или да има грешки, моля, докладвайте за проблеми!
|
||||
poweredBy=Задвижван чрез
|
||||
yes=Да
|
||||
no=Не
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Добавяне на изображение
|
||||
home.addImage.desc=Добавя изображение към зададено място към PDF файла
|
||||
addImage.tags=img,jpg,изображение,снимка
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Добавяне на воден знак
|
||||
home.watermark.desc=Добавете персонализиран воден знак към вашия PDF документ.
|
||||
watermark.tags=Текст,повтарящ се,етикет,собствено,авторско право,търговска марка,img,jpg,изображение,снимка
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Всяка страница?
|
||||
addImage.upload=Добавяне на изображение
|
||||
addImage.submit=Добавяне на изображение
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Обединяване
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Влачете и пуснете PDF файл
|
||||
fileChooser.dragAndDropImage=Влачете и пуснете изображение
|
||||
fileChooser.hoveredDragAndDrop=Влачете и пуснете файл(ове) тук
|
||||
fileChooser.extractPDF=Извличане...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Версии
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=གསལ་བྱེད།
|
||||
downloadPdf=PDF ཕབ་ལེན།
|
||||
text=ཡི་གེ
|
||||
font=ཡིག་གཟུགས་ཌྷ
|
||||
selectFillter=-- འདེམས་རོགས། --
|
||||
selectFilter=-- འདེམས་རོགས། --
|
||||
pageNum=ཤོག་གིངས།
|
||||
sizes.small=ཆུང་ཆང་།
|
||||
sizes.medium=འབྲིང་ཚད།
|
||||
sizes.large=ཆེན་པོ།
|
||||
sizes.x-large=ཧ་ཅང་ཆེན་པོ།
|
||||
error.pdfPassword=PDF ཡིག་ཆར་གསང་ཚིག་བཀོད་ཡོད་པ་དང་། གསང་ཚིག་མ་བཀོད་པའམ་ནོར་འདུག
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=སུབ་པ།
|
||||
username=སྤྱོད་མཁན་མིང་།
|
||||
password=གསང་ཚིག།
|
||||
@@ -181,7 +242,6 @@ red=དམར་པོ
|
||||
green=ལྗང་ཁུ།
|
||||
blue=སྔོན་པོ
|
||||
custom=མཚན་ཉིད་རང་སྒྲིག...
|
||||
WorkInProgess=ལས་ཀ་བྱེད་བཞིན་པ། ནོར་འཁྲུལ་ཡོང་སྲིད། དཀའ་ངལ་ཡོད་ཚེ་སྙན་སེང་གནང་རོགས།
|
||||
poweredBy=མཁོ་སྲོད་བྱེད་མཁན།
|
||||
yes=ཡིན།
|
||||
no=མིན།
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=པར་རིས་སྣོན་པ།
|
||||
home.addImage.desc=PDF ནང་གནས་ས་ངེས་ཅན་ཞིག་ཏུ་པར་རིས་སྣོན་པ།
|
||||
addImage.tags=པར་རིས།,jpg,པར།,འདྲ་པར།
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=ཆུ་རྟགས་སྣོན་པ།
|
||||
home.watermark.desc=PDF ཡིག་ཆར་རང་སྒྲིག་གི་ཆུ་རྟགས་སྣོན་པ།
|
||||
watermark.tags=ཡི་གེ,བསྐྱར་ཟློས།,ཁ་ཡིག,རང་དབང་།,པར་དབང་།,ཚོང་རྟགས།,པར་རིས།,jpg,པར།,འདྲ་པར།
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=ཤོག་ངོས་ཚང་མར་ཡིན་ནམ
|
||||
addImage.upload=པར་རིས་སྣོན་པ།
|
||||
addImage.submit=པར་རིས་སྣོན་པ།
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=སྡེབ་སྦྱོར།
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=PDF ཡིག་ཆ་འཐེན་ནས་འཇ
|
||||
fileChooser.dragAndDropImage=པར་རིས་ཡིག་ཆ་འཐེན་ནས་འཇོག་པ།
|
||||
fileChooser.hoveredDragAndDrop=ཡིག་ཆ་འདིར་འཐེན་ནས་འཇོག་པ།
|
||||
fileChooser.extractPDF=འདོན་རིས་འགྱུར་བའི་སྒྲིག་བཏང་བ།
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=པར་གཞི།
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Alfabet
|
||||
downloadPdf=Descarregueu PDF
|
||||
text=Text
|
||||
font=Tipus de lletra
|
||||
selectFillter=-- Selecciona --
|
||||
selectFilter=-- Selecciona --
|
||||
pageNum=Número de pàgina
|
||||
sizes.small=Petit
|
||||
sizes.medium=Mitjà
|
||||
sizes.large=Llarg
|
||||
sizes.x-large=X-Large
|
||||
error.pdfPassword=El PDF està protegit o bé el password és incorrecte
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Esborra
|
||||
username=Usuari
|
||||
password=Contrasenya
|
||||
@@ -181,7 +242,6 @@ red=Vermell
|
||||
green=Verd
|
||||
blue=Blau
|
||||
custom=Personalitzat...
|
||||
WorkInProgess=En desenvolupament, pot no funcionar o contenir errors. Si us plau, informa de qualsevol problema!
|
||||
poweredBy=Impulsat per
|
||||
yes=Si
|
||||
no=No
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Afegir imatge a PDF
|
||||
home.addImage.desc=Afegeix una imatge en un PDF (en progrés)
|
||||
addImage.tags=img,jpg,imatge,foto
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Afegir Marca d'aigua
|
||||
home.watermark.desc=Afegir una marca d'aigua personalitzada en un PDF
|
||||
watermark.tags=text,repetició,etiqueta,propia,copyright,marca registrada,img,jpg,imatge,foto
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Totes les pàgines?
|
||||
addImage.upload=Afegir Imatge
|
||||
addImage.submit=Afegir Imatge
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Fusiona
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Arrossega i deixa anar un fitxer PDF
|
||||
fileChooser.dragAndDropImage=Arrossega i deixa anar un fitxer d'imatge
|
||||
fileChooser.hoveredDragAndDrop=Arrossega i deixa anar fitxer(s) aquí
|
||||
fileChooser.extractPDF=Extracting...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Llançaments
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Abeceda
|
||||
downloadPdf=Stáhnout PDF
|
||||
text=Text
|
||||
font=Písmo
|
||||
selectFillter=-- Vybrat --
|
||||
selectFilter=-- Vybrat --
|
||||
pageNum=Číslo stránky
|
||||
sizes.small=Malé
|
||||
sizes.medium=Střední
|
||||
sizes.large=Velké
|
||||
sizes.x-large=Extra velké
|
||||
error.pdfPassword=PDF dokument je chráněn heslem a buď heslo nebylo zadáno, nebo bylo nesprávné
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Smazat
|
||||
username=Uživatelské jméno
|
||||
password=Heslo
|
||||
@@ -181,7 +242,6 @@ red=Červená
|
||||
green=Zelená
|
||||
blue=Modrá
|
||||
custom=Vlastní...
|
||||
WorkInProgess=Práce probíhá, nemusí fungovat nebo může obsahovat chyby. Prosím, nahlaste případné problémy!
|
||||
poweredBy=Využívá
|
||||
yes=Ano
|
||||
no=Ne
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Přidat obrázek
|
||||
home.addImage.desc=Přidá obrázek na určené místo v PDF
|
||||
addImage.tags=img,jpg,obrázek,fotka
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Přidat vodoznak
|
||||
home.watermark.desc=Přidat vlastní vodoznak do vašeho PDF dokumentu.
|
||||
watermark.tags=Text,opakující se,popisek,vlastní,copyright,ochranná známka,img,jpg,obrázek,fotka
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Každá stránka?
|
||||
addImage.upload=Přidat obrázek
|
||||
addImage.submit=Přidat obrázek
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Sloučit
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Přetáhnout PDF soubor
|
||||
fileChooser.dragAndDropImage=Přetáhnout obrázek
|
||||
fileChooser.hoveredDragAndDrop=Přetáhněte soubor(y) sem
|
||||
fileChooser.extractPDF=Extrahování...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Vydání
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Alfabet
|
||||
downloadPdf=Download PDF
|
||||
text=Tekst
|
||||
font=Skrifttype
|
||||
selectFillter=-- Vælg --
|
||||
selectFilter=-- Vælg --
|
||||
pageNum=Sidenummer
|
||||
sizes.small=Lille
|
||||
sizes.medium=Mellem
|
||||
sizes.large=Stor
|
||||
sizes.x-large=X-Stor
|
||||
error.pdfPassword=PDF-dokumentet er beskyttet med adgangskode, og enten blev adgangskoden ikke angivet eller var forkert
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Slet
|
||||
username=Brugernavn
|
||||
password=Adgangskode
|
||||
@@ -181,7 +242,6 @@ red=Rød
|
||||
green=Grøn
|
||||
blue=Blå
|
||||
custom=Brugerdefineret...
|
||||
WorkInProgess=Arbejde i gang, Kan muligvis ikke virke eller have fejl, Rapportér venligst eventuelle problemer!
|
||||
poweredBy=Drevet af
|
||||
yes=Ja
|
||||
no=Nej
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Tilføj billede
|
||||
home.addImage.desc=Tilføjer et billede på en bestemt placering på PDF'en
|
||||
addImage.tags=img,jpg,billede,foto
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Tilføj Vandmærke
|
||||
home.watermark.desc=Tilføj et brugerdefineret vandmærke til dit PDF-dokument.
|
||||
watermark.tags=Tekst,gentagne,etiket,egen,ophavsret,varemærke,img,jpg,billede,foto
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Hver Side?
|
||||
addImage.upload=Tilføj billede
|
||||
addImage.submit=Tilføj billede
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Flet
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
||||
@@ -138,7 +138,7 @@ lang.yor=Yoruba
|
||||
addPageNumbers.fontSize=Schriftgröße
|
||||
addPageNumbers.fontName=Schriftart
|
||||
pdfPrompt=PDF(s) auswählen
|
||||
multiPdfPrompt=PDFs auswählen(2+)
|
||||
multiPdfPrompt=PDFs auswählen (2+)
|
||||
multiPdfDropPrompt=Wählen Sie alle gewünschten PDFs aus (oder ziehen Sie sie per Drag & Drop hierhin)
|
||||
imgPrompt=Wählen Sie ein Bild
|
||||
genericSubmit=Absenden
|
||||
@@ -146,7 +146,7 @@ uploadLimit=Maximale Dateigröße:
|
||||
uploadLimitExceededSingular=ist zu groß. Die maximal zulässige Größe ist
|
||||
uploadLimitExceededPlural=sind zu groß. Die maximal zulässige Größe ist
|
||||
processTimeWarning=Achtung: Abhängig von der Dateigröße kann dieser Prozess bis zu einer Minute dauern
|
||||
pageOrderPrompt=Seitenreihenfolge (Geben Sie eine durch Komma getrennte Liste von Seitenzahlen ein):
|
||||
pageOrderPrompt=Seitenreihenfolge (Geben Sie eine durch Kommas getrennte Liste von Seitenzahlen ein):
|
||||
pageSelectionPrompt=Benutzerdefinierte Seitenauswahl (Geben Sie eine durch Kommas getrennte Liste von Seitenzahlen 1,5,6 oder Funktionen wie 2n+1 ein):
|
||||
goToPage=Los
|
||||
true=Wahr
|
||||
@@ -163,13 +163,74 @@ alphabet=Alphabet
|
||||
downloadPdf=PDF herunterladen
|
||||
text=Text
|
||||
font=Schriftart
|
||||
selectFillter=-- Auswählen --
|
||||
selectFilter=-- Auswählen --
|
||||
pageNum=Seitenzahl
|
||||
sizes.small=Klein
|
||||
sizes.medium=Mittel
|
||||
sizes.large=Groß
|
||||
sizes.x-large=Extra Groß
|
||||
error.pdfPassword=Das PDF-Dokument ist passwortgeschützt und das Passwort wurde entweder nicht angegeben oder war falsch
|
||||
error.pdfCorrupted=Die PDF-Datei scheint beschädigt zu sein. Bitte nutzen Sie zuerst die Funktion "PDFs reparieren", um die Datei zu beheben, bevor Sie fortfahren.
|
||||
error.pdfCorruptedMultiple=Eine oder mehrere PDF-Dateien scheinen beschädigt zu sein. Bitte versuchen Sie, jede Datei zunächst mit der Funktion "PDFs reparieren" zu korrigieren, bevor Sie sie zusammenführen.
|
||||
error.pdfCorruptedDuring=Fehler {0}: Die PDF-Datei scheint beschädigt zu sein. Bitte nutzen Sie zuerst die Funktion "PDFs reparieren", um die Datei zu beheben, bevor Sie fortfahren.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=Die PDF-Datei "{0}" scheint beschädigt oder ungültig zu sein. Bitte versuchen Sie, die Datei mit der Funktion "PDFs reparieren" zu beheben.
|
||||
error.tryRepair=Versuchen Sie, beschädigte Dateien mit der Funktion "PDFs reparieren" zu beheben.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=Die PDF-Datei enthält möglicherweise beschädigte Verschlüsselungsdaten. Dies kann auftreten, wenn sie mit inkompatiblen Methoden erstellt wurde. Bitte versuchen Sie zunächst die Funktion "PDFs reparieren" oder kontaktieren Sie den Ersteller für eine neue Kopie.
|
||||
error.fileProcessing=Beim Verarbeiten der Datei während des Vorgangs {0} ist ein Fehler aufgetreten: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} ist nicht installiert.
|
||||
error.toolRequired={0} wird für {1} benötigt.
|
||||
error.conversionFailed={0} Konvertierung fehlgeschlagen
|
||||
error.commandFailed={0} Befehl fehlgeschlagen
|
||||
error.algorithmNotAvailable={0}-Algorithmus nicht verfügbar
|
||||
error.optionsNotSpecified=Optionen für {0} wurden nicht angegeben.
|
||||
error.fileFormatRequired=Die Datei muss im Format {0} vorliegen.
|
||||
error.invalidFormat=Ungültiges {0}-Format: {1}
|
||||
error.endpointDisabled=Dieser Endpunkt wurde vom Administrator deaktiviert.
|
||||
error.urlNotReachable=Die URL ist nicht erreichbar, bitte geben Sie eine gültige URL an.
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=Der DPI-Wert {0} überschreitet das sichere Maximum von {1}. Hohe DPI-Werte können zu Speicherproblemen und Abstürzen führen. Bitte verwende einen niedrigeren DPI-Wert.
|
||||
error.pageTooBigForDpi=Die PDF-Seite {0} ist zu groß, um mit {1} DPI gerendert zu werden. Bitte versuche einen niedrigeren DPI-Wert (empfohlen: 150 oder weniger).
|
||||
error.pageTooBigExceedsArray=Die PDF-Seite {0} ist zu groß, um mit {1} DPI gerendert zu werden. Das Ergebnis überschreitet die zulässige Größe. Bitte versuche einen niedrigeren DPI-Wert (empfohlen: 150 oder weniger).
|
||||
error.pageTooBigFor300Dpi=Die PDF-Seite {0} ist zu groß, um mit 300 DPI gerendert zu werden. Das Ergebnis überschreitet die zulässige Größe. Bitte verwende für die PDF-zu-Bild-Konvertierung einen niedrigeren DPI-Wert.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API-Schlüssel ist ungültig.
|
||||
error.userNotFound=Benutzer nicht gefunden.
|
||||
error.passwordRequired=Passwort darf nicht leer sein.
|
||||
error.accountLocked=Ihr Konto wurde aufgrund zu vieler fehlgeschlagener Anmeldeversuche gesperrt.
|
||||
error.invalidEmail=Ungültige E-Mail-Adressen angegeben.
|
||||
error.emailAttachmentRequired=Für das Versenden der E-Mail ist ein Anhang erforderlich.
|
||||
error.signatureNotFound=Signaturdatei nicht gefunden.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=Datei mit der ID {0} nicht gefunden.
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=Keine Backup-Skripte gefunden.
|
||||
error.unsupportedProvider={0} wird derzeit nicht unterstützt.
|
||||
error.pathTraversalDetected=Pfad-Traversal aus Sicherheitsgründen erkannt.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Ungültiges Argument: {0}
|
||||
error.argumentRequired={0} darf nicht null sein.
|
||||
error.operationFailed=Vorgang fehlgeschlagen: {0}
|
||||
error.angleNotMultipleOf90=Der Winkel muss ein Vielfaches von 90 sein.
|
||||
error.pdfBookmarksNotFound=Keine PDF-Lesezeichen/Gliederung im Dokument gefunden.
|
||||
error.fontLoadingFailed=Fehler bei der Verarbeitung der Schriftdatei.
|
||||
error.fontDirectoryReadFailed=Konnte das Schriftverzeichnis nicht lesen.
|
||||
delete=Löschen
|
||||
username=Benutzername
|
||||
password=Passwort
|
||||
@@ -181,7 +242,6 @@ red=Rot
|
||||
green=Grün
|
||||
blue=Blau
|
||||
custom=benutzerdefiniert...
|
||||
WorkInProgess=In Arbeit, funktioniert möglicherweise nicht oder ist fehlerhaft. Bitte melden Sie alle Probleme!
|
||||
poweredBy=Unterstützt von
|
||||
yes=Ja
|
||||
no=Nein
|
||||
@@ -200,7 +260,7 @@ disabledCurrentUserMessage=Der aktuelle Benutzer kann nicht deaktiviert werden
|
||||
downgradeCurrentUserLongMessage=Die Rolle des aktuellen Benutzers kann nicht herabgestuft werden. Daher wird der aktuelle Benutzer nicht angezeigt.
|
||||
userAlreadyExistsOAuthMessage=Der Benutzer ist bereits als OAuth2-Benutzer vorhanden.
|
||||
userAlreadyExistsWebMessage=Der Benutzer ist bereits als Webbenutzer vorhanden.
|
||||
invalidRoleMessage=Invalid role.
|
||||
invalidRoleMessage=Ungültige Rolle.
|
||||
error=Fehler
|
||||
oops=Hoppla!
|
||||
help=Hilfe
|
||||
@@ -213,7 +273,7 @@ color=Farbe
|
||||
sponsor=Sponsor
|
||||
info=Informationen
|
||||
pro=Pro
|
||||
proFeatures=Pro Features
|
||||
proFeatures=Pro-Funktionen
|
||||
page=Seite
|
||||
pages=Seiten
|
||||
loading=Laden...
|
||||
@@ -244,7 +304,7 @@ pipeline.configureButton=Konfigurieren
|
||||
pipeline.defaultOption=Benutzerdefiniert
|
||||
pipeline.submitButton=Ausführen
|
||||
pipeline.help=Hilfe für Pipeline
|
||||
pipeline.scanHelp=Hilfe zum Ordnerscan
|
||||
pipeline.scanHelp=Hilfe zum Ordner-Scan
|
||||
pipeline.deletePrompt=Möchten Sie die Pipeline wirklich löschen?
|
||||
|
||||
######################
|
||||
@@ -275,7 +335,7 @@ enterpriseEdition.proTeamFeatureDisabled=Teammanagementfunktionen erfordern eine
|
||||
#################
|
||||
analytics.title=Möchten Sie Stirling-PDF verbessern?
|
||||
analytics.paragraph1=Stirling-PDF verfügt über Opt-in-Analytics, die uns helfen, das Produkt zu verbessern. Wir zeichnen keine persönlichen Informationen oder Dateiinhalte auf.
|
||||
analytics.paragraph2=Bitte erwägen Sie die Analytics zu aktivieren, um Stirling-PDF beim Wachsen zu helfen und um unsere User besser zu verstehen.
|
||||
analytics.paragraph2=Bitte erwägen Sie, Analytics zu aktivieren, um Stirling-PDF beim Wachstum zu unterstützen und um unsere Benutzer besser zu verstehen.
|
||||
analytics.enable=Analytics aktivieren
|
||||
analytics.disable=Analytics deaktivieren
|
||||
analytics.settings=Sie können die Einstellungen für die Analytics in der config/settings.yml Datei bearbeiten
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Bild einfügen
|
||||
home.addImage.desc=Fügt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit)
|
||||
addImage.tags=img,jpg,bild,foto
|
||||
|
||||
home.attachments.title=Anhänge hinzufügen
|
||||
home.attachments.desc=Eingebettete Dateien (Anhänge) zu einem PDF hinzufügen oder daraus entfernen
|
||||
attachments.tags=einbetten, anhängen, datei, anhang, anhänge
|
||||
|
||||
home.watermark.title=Wasserzeichen hinzufügen
|
||||
home.watermark.desc=Fügen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu
|
||||
watermark.tags=text,wiederholend,beschriftung,besitzen,urheberrecht,marke,img,jpg,bild,foto
|
||||
@@ -607,7 +671,7 @@ home.flatten.title=Abflachen
|
||||
home.flatten.desc=Alle interaktiven Elemente und Formulare aus einem PDF entfernen
|
||||
flatten.tags=statisch,deaktivieren,nicht interaktiv,optimieren
|
||||
|
||||
home.repair.title=Reparatur
|
||||
home.repair.title=PDFs reparieren
|
||||
home.repair.desc=Versucht, ein beschädigtes/kaputtes PDF zu reparieren
|
||||
repair.tags=reparieren,wiederherstellen,korrigieren,wiederherstellen
|
||||
|
||||
@@ -676,21 +740,21 @@ home.HTMLToPDF.desc=Konvertiert jede HTML-Datei oder Zip-Archiv zu PDF
|
||||
HTMLToPDF.tags=markup,webinhalt,transformation,konvertierung
|
||||
|
||||
#eml-to-pdf
|
||||
home.EMLToPDF.title=Email to PDF
|
||||
home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images
|
||||
EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail
|
||||
home.EMLToPDF.title=E-Mail zu PDF
|
||||
home.EMLToPDF.desc=Konvertiert E-Mail-(EML-)Dateien inklusive Kopfzeilen, Text und eingebetteten Bildern in das PDF-Format
|
||||
EMLToPDF.tags=e-mail,conversion,eml,nachricht,transformation,konvertieren,mail
|
||||
|
||||
EMLToPDF.title=Email To PDF
|
||||
EMLToPDF.header=Email To PDF
|
||||
EMLToPDF.submit=Convert
|
||||
EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF
|
||||
EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues
|
||||
EMLToPDF.includeAttachments=Include attachments in PDF
|
||||
EMLToPDF.maxAttachmentSize=Maximum attachment size (MB)
|
||||
EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images
|
||||
EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both
|
||||
EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code.
|
||||
EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs
|
||||
EMLToPDF.title=E-Mail zu PDF
|
||||
EMLToPDF.header=E-Mail zu PDF
|
||||
EMLToPDF.submit=Konvertieren
|
||||
EMLToPDF.downloadHtml=HTML-Zwischendatei statt PDF herunterladen
|
||||
EMLToPDF.downloadHtmlHelp=Damit können Sie die HTML-Version vor der PDF-Konvertierung ansehen und Formatierungsprobleme beheben
|
||||
EMLToPDF.includeAttachments=Anhänge in PDF einfügen
|
||||
EMLToPDF.maxAttachmentSize=Maximale Anhangsgröße (MB)
|
||||
EMLToPDF.help=Konvertiert E-Mail-(EML-)Dateien inklusive Kopfzeilen, Text und eingebetteten Bildern in das PDF-Format
|
||||
EMLToPDF.troubleshootingTip1=E-Mail zu HTML ist zuverlässiger, daher wird bei Stapelverarbeitung empfohlen, beide Versionen zu speichern
|
||||
EMLToPDF.troubleshootingTip2=Bei wenigen E-Mails können Sie bei fehlerhaftem PDF das HTML herunterladen und problematischen HTML/CSS-Code anpassen
|
||||
EMLToPDF.troubleshootingTip3=Einbettungen funktionieren jedoch nicht mit HTML-Dateien
|
||||
|
||||
home.MarkdownToPDF.title=Markdown zu PDF
|
||||
home.MarkdownToPDF.desc=Konvertiert jede Markdown-Datei zu PDF
|
||||
@@ -877,28 +941,28 @@ getPdfInfo.title=Alle Informationen anzeigen
|
||||
getPdfInfo.header=Alle Informationen anzeigen
|
||||
getPdfInfo.submit=Informationen anzeigen
|
||||
getPdfInfo.downloadJson=Als JSON herunterladen
|
||||
getPdfInfo.summary=PDF Summary
|
||||
getPdfInfo.summary.encrypted=This PDF is encrypted so may face issues with some applications
|
||||
getPdfInfo.summary.permissions=This PDF has {0} restricted permissions which may limit what you can do with it
|
||||
getPdfInfo.summary.compliance=This PDF complies with the {0} standard
|
||||
getPdfInfo.summary.basicInfo=Basic Information
|
||||
getPdfInfo.summary.docInfo=Document Information
|
||||
getPdfInfo.summary.encrypted.alert=Encrypted PDF - This document is password protected
|
||||
getPdfInfo.summary.not.encrypted.alert=Unencrypted PDF - No password protection
|
||||
getPdfInfo.summary.permissions.alert=Restricted Permissions - {0} actions are not allowed
|
||||
getPdfInfo.summary.all.permissions.alert=All Permissions Allowed
|
||||
getPdfInfo.summary.compliance.alert={0} Compliant
|
||||
getPdfInfo.summary.no.compliance.alert=No Compliance Standards
|
||||
getPdfInfo.summary.security.section=Security Status
|
||||
getPdfInfo.section.BasicInfo=Basic Information about the PDF document including file size, page count, and language
|
||||
getPdfInfo.section.Metadata=Document metadata including title, author, creation date and other document properties
|
||||
getPdfInfo.section.DocumentInfo=Technical details about the PDF document structure and version
|
||||
getPdfInfo.section.Compliancy=PDF standards compliance information (PDF/A, PDF/X, etc.)
|
||||
getPdfInfo.section.Encryption=Security and encryption details of the document
|
||||
getPdfInfo.section.Permissions=Document permission settings that control what actions can be performed
|
||||
getPdfInfo.section.Other=Additional document components like bookmarks, layers, and embedded files
|
||||
getPdfInfo.section.FormFields=Interactive form fields present in the document
|
||||
getPdfInfo.section.PerPageInfo=Detailed information about each page in the document
|
||||
getPdfInfo.summary=PDF-Zusammenfassung
|
||||
getPdfInfo.summary.encrypted=Dieses PDF ist verschlüsselt und kann in manchen Anwendungen Probleme verursachen.
|
||||
getPdfInfo.summary.permissions=Dieses PDF hat {0} eingeschränkte Berechtigungen, was Ihre Möglichkeiten einschränken kann.
|
||||
getPdfInfo.summary.compliance=Dieses PDF entspricht dem Standard {0}.
|
||||
getPdfInfo.summary.basicInfo=Grundlegende Informationen
|
||||
getPdfInfo.summary.docInfo=Dokumentinformationen
|
||||
getPdfInfo.summary.encrypted.alert=Verschlüsseltes PDF – Dieses Dokument ist passwortgeschützt.
|
||||
getPdfInfo.summary.not.encrypted.alert=Nicht verschlüsseltes PDF – Kein Passwortschutz.
|
||||
getPdfInfo.summary.permissions.alert=Eingeschränkte Berechtigungen – {0} Aktionen sind nicht erlaubt.
|
||||
getPdfInfo.summary.all.permissions.alert=Alle Berechtigungen erlaubt
|
||||
getPdfInfo.summary.compliance.alert={0}-konform
|
||||
getPdfInfo.summary.no.compliance.alert=Kein Konformitätsstandard
|
||||
getPdfInfo.summary.security.section=Sicherheitsstatus
|
||||
getPdfInfo.section.BasicInfo=Grundlegende Informationen über das PDF-Dokument inklusive Dateigröße, Seitenanzahl und Sprache.
|
||||
getPdfInfo.section.Metadata=Dokumentenmetadaten inklusive Titel, Autor, Erstellungsdatum und weiteren Eigenschaften.
|
||||
getPdfInfo.section.DocumentInfo=Technische Details zur Struktur und Version des PDF-Dokuments.
|
||||
getPdfInfo.section.Compliancy=Informationen zur Einhaltung von PDF-Standards (PDF/A, PDF/X, etc.).
|
||||
getPdfInfo.section.Encryption=Sicherheits- und Verschlüsselungsdetails des Dokuments.
|
||||
getPdfInfo.section.Permissions=Dokumentenberechtigungen, die festlegen, welche Aktionen erlaubt sind.
|
||||
getPdfInfo.section.Other=Zusätzliche Dokumentbestandteile wie Lesezeichen, Ebenen und eingebettete Dateien.
|
||||
getPdfInfo.section.FormFields=Interaktive Formularfelder im Dokument.
|
||||
getPdfInfo.section.PerPageInfo=Detaillierte Informationen zu jeder Seite im Dokument.
|
||||
|
||||
|
||||
#markdown-to-pdf
|
||||
@@ -948,7 +1012,7 @@ AddStampRequest.header=PDF Stempel
|
||||
AddStampRequest.title=PDF Stempel
|
||||
AddStampRequest.stampType=Stempeltyp
|
||||
AddStampRequest.stampText=Stempeltext
|
||||
AddStampRequest.stampImage=Stampelbild
|
||||
AddStampRequest.stampImage=Stempelbild
|
||||
AddStampRequest.alphabet=Alphabet
|
||||
AddStampRequest.fontSize=Schriftart/Bildgröße
|
||||
AddStampRequest.rotation=Drehung
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=In jede Seite einfügen?
|
||||
addImage.upload=Bild hinzufügen
|
||||
addImage.submit=Bild hinzufügen
|
||||
|
||||
#attachments
|
||||
attachments.title=Anhänge hinzufügen
|
||||
attachments.header=Anhänge hinzufügen
|
||||
attachments.description=Ermöglicht das Hinzufügen von Anhängen zum PDF
|
||||
attachments.descriptionPlaceholder=Beschreibung für die Anhänge eingeben...
|
||||
attachments.addButton=Anhänge hinzufügen
|
||||
|
||||
#merge
|
||||
merge.title=Zusammenführen
|
||||
@@ -1212,7 +1282,7 @@ merge.header=Mehrere PDFs zusammenführen (2+)
|
||||
merge.sortByName=Nach Namen sortieren
|
||||
merge.sortByDate=Nach Datum sortieren
|
||||
merge.removeCertSign=Digitale Signatur in der zusammengeführten Datei entfernen?
|
||||
merge.generateToc=Generate table of contents in the merged file?
|
||||
merge.generateToc=Inhaltsverzeichnis in der zusammengeführten Datei erstellen?
|
||||
merge.submit=Zusammenführen
|
||||
|
||||
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF-Datei
|
||||
fileChooser.dragAndDropImage=Drag & Drop Bilddatei
|
||||
fileChooser.hoveredDragAndDrop=Datei(en) hierhin Ziehen & Fallenlassen
|
||||
fileChooser.extractPDF=Extrahiere...
|
||||
fileChooser.addAttachments=Drag & Drop Anhänge
|
||||
|
||||
#release notes
|
||||
releases.footer=Veröffentlichungen
|
||||
@@ -1638,82 +1709,82 @@ validateSignature.cert.selfSigned=Selbstsigniert
|
||||
validateSignature.cert.bits=bits
|
||||
|
||||
# Audit Dashboard
|
||||
audit.dashboard.title=Audit Dashboard
|
||||
audit.dashboard.systemStatus=Audit System Status
|
||||
audit.dashboard.title=Audit-Dashboard
|
||||
audit.dashboard.systemStatus=Systemstatus prüfen
|
||||
audit.dashboard.status=Status
|
||||
audit.dashboard.enabled=Enabled
|
||||
audit.dashboard.disabled=Disabled
|
||||
audit.dashboard.currentLevel=Current Level
|
||||
audit.dashboard.retentionPeriod=Retention Period
|
||||
audit.dashboard.days=days
|
||||
audit.dashboard.totalEvents=Total Events
|
||||
audit.dashboard.enabled=Aktiviert
|
||||
audit.dashboard.disabled=Deaktiviert
|
||||
audit.dashboard.currentLevel=Aktuelle Ebene
|
||||
audit.dashboard.retentionPeriod=Aufbewahrungsdauer
|
||||
audit.dashboard.days=Tage
|
||||
audit.dashboard.totalEvents=Gesamtereignisse
|
||||
|
||||
# Audit Dashboard Tabs
|
||||
audit.dashboard.tab.dashboard=Dashboard
|
||||
audit.dashboard.tab.events=Audit Events
|
||||
audit.dashboard.tab.events=Überwachungsereignisse
|
||||
audit.dashboard.tab.export=Export
|
||||
# Dashboard Charts
|
||||
audit.dashboard.eventsByType=Events by Type
|
||||
audit.dashboard.eventsByUser=Events by User
|
||||
audit.dashboard.eventsOverTime=Events Over Time
|
||||
audit.dashboard.period.7days=7 Days
|
||||
audit.dashboard.period.30days=30 Days
|
||||
audit.dashboard.period.90days=90 Days
|
||||
audit.dashboard.eventsByType=Ereignisse nach Typ
|
||||
audit.dashboard.eventsByUser=Ereignisse nach Benutzer
|
||||
audit.dashboard.eventsOverTime=Ereignisse im Laufe der Zeit
|
||||
audit.dashboard.period.7days=7 Tage
|
||||
audit.dashboard.period.30days=30 Tage
|
||||
audit.dashboard.period.90days=90 Tage
|
||||
|
||||
# Events Tab
|
||||
audit.dashboard.auditEvents=Audit Events
|
||||
audit.dashboard.filter.eventType=Event Type
|
||||
audit.dashboard.filter.allEventTypes=All event types
|
||||
audit.dashboard.filter.user=User
|
||||
audit.dashboard.filter.userPlaceholder=Filter by user
|
||||
audit.dashboard.filter.startDate=Start Date
|
||||
audit.dashboard.filter.endDate=End Date
|
||||
audit.dashboard.filter.apply=Apply Filters
|
||||
audit.dashboard.filter.reset=Reset Filters
|
||||
audit.dashboard.auditEvents=Überwachungsereignisse
|
||||
audit.dashboard.filter.eventType=Ereignisart
|
||||
audit.dashboard.filter.allEventTypes=Alle Ereignisstypen
|
||||
audit.dashboard.filter.user=Benutzer
|
||||
audit.dashboard.filter.userPlaceholder=Nach Benutzer filtern
|
||||
audit.dashboard.filter.startDate=Startdatum
|
||||
audit.dashboard.filter.endDate=Enddatum
|
||||
audit.dashboard.filter.apply=Filter anwenden
|
||||
audit.dashboard.filter.reset=Filter zurücksetzen
|
||||
|
||||
# Table Headers
|
||||
audit.dashboard.table.id=ID
|
||||
audit.dashboard.table.time=Time
|
||||
audit.dashboard.table.user=User
|
||||
audit.dashboard.table.type=Type
|
||||
audit.dashboard.table.time=Zeit
|
||||
audit.dashboard.table.user=Benutzer
|
||||
audit.dashboard.table.type=Typ
|
||||
audit.dashboard.table.details=Details
|
||||
audit.dashboard.table.viewDetails=View Details
|
||||
audit.dashboard.table.viewDetails=Details anzeigen
|
||||
|
||||
# Pagination
|
||||
audit.dashboard.pagination.show=Show
|
||||
audit.dashboard.pagination.entries=entries
|
||||
audit.dashboard.pagination.pageInfo1=Page
|
||||
audit.dashboard.pagination.pageInfo2=of
|
||||
audit.dashboard.pagination.totalRecords=Total records:
|
||||
audit.dashboard.pagination.show=Zeigen
|
||||
audit.dashboard.pagination.entries=Einträge
|
||||
audit.dashboard.pagination.pageInfo1=Seite
|
||||
audit.dashboard.pagination.pageInfo2=von
|
||||
audit.dashboard.pagination.totalRecords=Gesamtdatensätze:
|
||||
|
||||
# Modal
|
||||
audit.dashboard.modal.eventDetails=Event Details
|
||||
audit.dashboard.modal.eventDetails=Ereignisdetails
|
||||
audit.dashboard.modal.id=ID
|
||||
audit.dashboard.modal.user=User
|
||||
audit.dashboard.modal.type=Type
|
||||
audit.dashboard.modal.time=Time
|
||||
audit.dashboard.modal.data=Data
|
||||
audit.dashboard.modal.user=Benutzer
|
||||
audit.dashboard.modal.type=Typ
|
||||
audit.dashboard.modal.time=Zeit
|
||||
audit.dashboard.modal.data=Daten
|
||||
|
||||
# Export Tab
|
||||
audit.dashboard.export.title=Export Audit Data
|
||||
audit.dashboard.export.format=Export Format
|
||||
audit.dashboard.export.csv=CSV (Comma Separated Values)
|
||||
audit.dashboard.export.json=JSON (JavaScript Object Notation)
|
||||
audit.dashboard.export.button=Export Data
|
||||
audit.dashboard.export.infoTitle=Export Information
|
||||
audit.dashboard.export.infoDesc1=The export will include all audit events matching the selected filters. For large datasets, the export may take a few moments to generate.
|
||||
audit.dashboard.export.infoDesc2=Exported data will include:
|
||||
audit.dashboard.export.infoItem1=Event ID
|
||||
audit.dashboard.export.infoItem2=User
|
||||
audit.dashboard.export.infoItem3=Event Type
|
||||
audit.dashboard.export.infoItem4=Timestamp
|
||||
audit.dashboard.export.infoItem5=Event Data
|
||||
audit.dashboard.export.title=Audit-Daten exportieren
|
||||
audit.dashboard.export.format=Exportformat
|
||||
audit.dashboard.export.csv=CSV (Kommagetrennte Werte)
|
||||
audit.dashboard.export.json=JSON (JavaScript-Objektnotation)
|
||||
audit.dashboard.export.button=Daten exportieren
|
||||
audit.dashboard.export.infoTitle=Informationen zum Export
|
||||
audit.dashboard.export.infoDesc1=Der Export umfasst alle Protokollereignisse, die den gewählten Filtern entsprechen. Bei großen Datenmengen kann die Erstellung einige Zeit dauern.
|
||||
audit.dashboard.export.infoDesc2=Exportierte Daten enthalten:
|
||||
audit.dashboard.export.infoItem1=Ereignis-ID
|
||||
audit.dashboard.export.infoItem2=Benutzer
|
||||
audit.dashboard.export.infoItem3=Ereignistyp
|
||||
audit.dashboard.export.infoItem4=Zeitstempel
|
||||
audit.dashboard.export.infoItem5=Ereignisdaten
|
||||
|
||||
# JavaScript i18n keys
|
||||
audit.dashboard.js.noEventsFound=No audit events found matching the current filters
|
||||
audit.dashboard.js.errorLoading=Error loading data:
|
||||
audit.dashboard.js.errorRendering=Error rendering table:
|
||||
audit.dashboard.js.loadingPage=Loading page
|
||||
audit.dashboard.js.noEventsFound=Keine Protokollereignisse mit den aktuellen Filtern gefunden
|
||||
audit.dashboard.js.errorLoading=Fehler beim Laden der Daten:
|
||||
audit.dashboard.js.errorRendering=Fehler beim Anzeigen der Tabelle:
|
||||
audit.dashboard.js.loadingPage=Seite wird geladen
|
||||
|
||||
####################
|
||||
# Cookie banner #
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Αλφάβητο
|
||||
downloadPdf=Λήψη PDF
|
||||
text=Κείμενο
|
||||
font=Γραμματοσειρά
|
||||
selectFillter=-- Επιλέξτε --
|
||||
selectFilter=-- Επιλέξτε --
|
||||
pageNum=Αριθμός σελίδας
|
||||
sizes.small=Μικρό
|
||||
sizes.medium=Μεσαίο
|
||||
sizes.large=Μεγάλο
|
||||
sizes.x-large=Πολύ μεγάλο
|
||||
error.pdfPassword=Το PDF έχει προστασία κωδικού και είτε δεν δόθηκε κωδικός ή ήταν λανθασμένος
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Διαγραφή
|
||||
username=Όνομα χρήστη
|
||||
password=Κωδικός
|
||||
@@ -181,7 +242,6 @@ red=Κόκκινο
|
||||
green=Πράσινο
|
||||
blue=Μπλε
|
||||
custom=Προσαρμογή...
|
||||
WorkInProgess=Εργασία σε εξέλιξη, μπορεί να μην λειτουργεί ή να έχει σφάλματα, παρακαλώ αναφέρετε τυχόν προβλήματα!
|
||||
poweredBy=Με την υποστήριξη του
|
||||
yes=Ναι
|
||||
no=Όχι
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Προσθήκη εικόνας
|
||||
home.addImage.desc=Προσθήκη εικόνας σε συγκεκριμένη θέση στο PDF
|
||||
addImage.tags=εικόνα,jpg,φωτογραφία
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Προσθήκη υδατογραφήματος
|
||||
home.watermark.desc=Προσθήκη προσαρμοσμένου υδατογραφήματος στο έγγραφο PDF.
|
||||
watermark.tags=κείμενο,επαναλαμβανόμενο,ετικέτα,ιδιοκτησία,πνευματικά δικαιώματα,εμπορικό σήμα,εικόνα,jpg,φωτογραφία
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Κάθε σελίδα;
|
||||
addImage.upload=Προσθήκη εικόνας
|
||||
addImage.submit=Προσθήκη εικόνας
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Συγχώνευση
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Σύρετε & αφήστε αρχείο PDF
|
||||
fileChooser.dragAndDropImage=Σύρετε & αφήστε αρχείο εικόνας
|
||||
fileChooser.hoveredDragAndDrop=Σύρετε & αφήστε αρχείο(α) εδώ
|
||||
fileChooser.extractPDF=Εξαγωγή...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Εκδόσεις
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Alphabet
|
||||
downloadPdf=Download PDF
|
||||
text=Text
|
||||
font=Font
|
||||
selectFillter=-- Select --
|
||||
selectFilter=-- Select --
|
||||
pageNum=Page Number
|
||||
sizes.small=Small
|
||||
sizes.medium=Medium
|
||||
sizes.large=Large
|
||||
sizes.x-large=X-Large
|
||||
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Delete
|
||||
username=Username
|
||||
password=Password
|
||||
@@ -181,7 +242,6 @@ red=Red
|
||||
green=Green
|
||||
blue=Blue
|
||||
custom=Custom...
|
||||
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
|
||||
poweredBy=Powered by
|
||||
yes=Yes
|
||||
no=No
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Alphabet
|
||||
downloadPdf=Download PDF
|
||||
text=Text
|
||||
font=Font
|
||||
selectFillter=-- Select --
|
||||
selectFilter=-- Select --
|
||||
pageNum=Page Number
|
||||
sizes.small=Small
|
||||
sizes.medium=Medium
|
||||
sizes.large=Large
|
||||
sizes.x-large=X-Large
|
||||
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Delete
|
||||
username=Username
|
||||
password=Password
|
||||
@@ -181,7 +242,6 @@ red=Red
|
||||
green=Green
|
||||
blue=Blue
|
||||
custom=Custom...
|
||||
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
|
||||
poweredBy=Powered by
|
||||
yes=Yes
|
||||
no=No
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Add image
|
||||
home.addImage.desc=Adds a image onto a set location on the PDF
|
||||
addImage.tags=img,jpg,picture,photo
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Add Watermark
|
||||
home.watermark.desc=Add a custom watermark to your PDF document.
|
||||
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Every Page?
|
||||
addImage.upload=Add image
|
||||
addImage.submit=Add image
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Merge
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Alfabeto
|
||||
downloadPdf=Descargar PDF
|
||||
text=Texto
|
||||
font=Fuente
|
||||
selectFillter=-- Seleccionar --
|
||||
selectFilter=-- Seleccionar --
|
||||
pageNum=Número de página
|
||||
sizes.small=Pequeño
|
||||
sizes.medium=Mediano
|
||||
sizes.large=Grande
|
||||
sizes.x-large=Extra grande
|
||||
error.pdfPassword=El documento PDF está protegido con contraseña y no se ha proporcionado o es incorrecta
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Borrar
|
||||
username=Nombre de usuario
|
||||
password=Contraseña
|
||||
@@ -181,7 +242,6 @@ red=Rojo
|
||||
green=Verde
|
||||
blue=Azul
|
||||
custom=Personalizado...
|
||||
WorkInProgess=Tarea en progreso, puede no funcionar o ralentizarse; ¡por favor, informe de cualquier problema!
|
||||
poweredBy=Desarrollado por
|
||||
yes=Sí
|
||||
no=No
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Agregar imagen al PDF
|
||||
home.addImage.desc=Agregar una imagen en el PDF en una ubicación establecida (en desarrollo)
|
||||
addImage.tags=img,jpg,imagen,fotografía
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Añadir marca de agua
|
||||
home.watermark.desc=Añadir una marca de agua predefinida al documento PDF
|
||||
watermark.tags=Texto,repetir,etiquetar,propietario,copyright,marca comercial,img,jpg,imagen,fotografía
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=¿Todas las páginas?
|
||||
addImage.upload=Añadir imagen
|
||||
addImage.submit=Enviar imagen
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Unir
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Arrastrar & Soltar archivo PDF
|
||||
fileChooser.dragAndDropImage=Arrastrar & Soltar archivo de Imagen
|
||||
fileChooser.hoveredDragAndDrop=Arrastrar & Soltar archivos(s) aquí
|
||||
fileChooser.extractPDF=Extrayendo...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Versiones
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Alfabetoa
|
||||
downloadPdf=PDFa deskargatu
|
||||
text=Testua
|
||||
font=Letra-tipoa
|
||||
selectFillter=-- Aukeratu filtroa --
|
||||
selectFilter=-- Aukeratu filtroa --
|
||||
pageNum=Orrialde-zenbakia
|
||||
sizes.small=Txikia
|
||||
sizes.medium=Erdikoa
|
||||
sizes.large=Handia
|
||||
sizes.x-large=Oso handia
|
||||
error.pdfPassword=PDF dokumentua pasahitzarekin babestuta dago eta pasahitza ez da sartu edo okerra da
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=ezabatu
|
||||
username=Erabiltzaile izena
|
||||
password=Pasahitza
|
||||
@@ -181,7 +242,6 @@ red=Gorria
|
||||
green=Berdea
|
||||
blue=Urdina
|
||||
custom=Pertsonalizatu...
|
||||
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
|
||||
poweredBy=Powered by
|
||||
yes=Yes
|
||||
no=No
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Gehitu irudia PDFari
|
||||
home.addImage.desc=Gehitu irudi bat PDFan ezarritako kokaleku batean (lanean)
|
||||
addImage.tags=img,jpg,picture,photo
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Gehitu ur-marka
|
||||
home.watermark.desc=Gehitu aurrez zehaztutako ur-marka bat PFD dokumentuari
|
||||
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Orrialde guztiak?
|
||||
addImage.upload=Gehitu irudia
|
||||
addImage.submit=Gehitu irudia
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Elkartu
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=حروف الفبا
|
||||
downloadPdf=دانلود PDF
|
||||
text=متن
|
||||
font=فونت
|
||||
selectFillter=-- انتخاب کنید --
|
||||
selectFilter=-- انتخاب کنید --
|
||||
pageNum=شماره صفحه
|
||||
sizes.small=کوچک
|
||||
sizes.medium=متوسط
|
||||
sizes.large=بزرگ
|
||||
sizes.x-large=خیلی بزرگ
|
||||
error.pdfPassword=سند PDF دارای رمز عبور است و یا رمز عبور وارد نشده یا نادرست است
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=حذف
|
||||
username=نام کاربری
|
||||
password=رمز عبور
|
||||
@@ -181,7 +242,6 @@ red=قرمز
|
||||
green=سبز
|
||||
blue=آبی
|
||||
custom=سفارشی...
|
||||
WorkInProgess=کار در حال پیشرفت است، ممکن است کار نکند یا دارای اشکال باشد، لطفاً هر مشکلی را گزارش دهید!
|
||||
poweredBy=قدرت گرفته از
|
||||
yes=بله
|
||||
no=خیر
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=افزودن تصویر
|
||||
home.addImage.desc=افزودن یک تصویر به یک مکان مشخص در PDF
|
||||
addImage.tags=تصویر،jpg،عکس
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=افزودن واترمارک
|
||||
home.watermark.desc=افزودن یک واترمارک سفارشی به سند PDF.
|
||||
watermark.tags=متن،تکراری،برچسب،خود،کپیرایت،علامت تجاری،تصویر،jpg،عکس
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=هر صفحه؟
|
||||
addImage.upload=افزودن تصویر
|
||||
addImage.submit=افزودن تصویر
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=ادغام
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=فایل(های) خود را اینجا بکشید و رها کنید
|
||||
fileChooser.extractPDF=در حال استخراج...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=نسخهها
|
||||
|
||||
@@ -142,9 +142,9 @@ multiPdfPrompt=Sélectionnez les PDF
|
||||
multiPdfDropPrompt=Sélectionnez (ou glissez-déposez) tous les PDF dont vous avez besoin
|
||||
imgPrompt=Choisir une image
|
||||
genericSubmit=Envoyer
|
||||
uploadLimit=Maximum file size:
|
||||
uploadLimitExceededSingular=is too large. Maximum allowed size is
|
||||
uploadLimitExceededPlural=are too large. Maximum allowed size is
|
||||
uploadLimit=Taille maximale du fichier :
|
||||
uploadLimitExceededSingular=est trop grand. La taille maximale autorisée est de
|
||||
uploadLimitExceededPlural=sont trop grands. La taille maximale autorisée est de
|
||||
processTimeWarning=Attention, ce processus peut prendre jusqu'à une minute en fonction de la taille du fichier.
|
||||
pageOrderPrompt=Ordre des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1) :
|
||||
pageSelectionPrompt=Sélection des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1) :
|
||||
@@ -163,13 +163,74 @@ alphabet=Alphabet
|
||||
downloadPdf=Télécharger le PDF
|
||||
text=Texte
|
||||
font=Police
|
||||
selectFillter=-- Sélectionnez --
|
||||
selectFilter=-- Sélectionnez --
|
||||
pageNum=Numéro de page
|
||||
sizes.small=Petit
|
||||
sizes.medium=Moyen
|
||||
sizes.large=Grand
|
||||
sizes.x-large=Très grand
|
||||
error.pdfPassword=Le document PDF est protégé par un mot de passe qui n'a pas été fourni ou était incorrect
|
||||
error.pdfCorrupted=Le fichier PDF semble être corrompu ou endommagé. Veuillez d'abord utiliser la fonction « Réparer » pour corriger le fichier avant de poursuivre cette opération.
|
||||
error.pdfCorruptedMultiple=Un ou plusieurs fichiers PDF semblent être corrompus ou endommagés. Veuillez utiliser la fonction « Réparer » sur chaque fichier avant d'essayer de les fusionner.
|
||||
error.pdfCorruptedDuring=Erreur {0} : le fichier PDF semble être corrompu ou endommagé. Veuillez d'abord utiliser la fonction « Réparer » pour corriger le fichier avant de poursuivre cette opération.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=Le fichier PDF « {0} » semble être corrompu ou avoir une structure invalide. Veuillez utiliser la fonction « Réparer » pour corriger le fichier avant de continuer.
|
||||
error.tryRepair=Essayez d'utiliser la fonction « Réparer » pour corriger les fichiers corrompus.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=Le PDF semble contenir des données de chiffrement corrompues. Cela peut se produire si le PDF a été créé avec des méthodes de chiffrement incompatibles. Veuillez d'abord utiliser la fonction « Réparer », ou contactez le créateur du document pour obtenir une nouvelle copie.
|
||||
error.fileProcessing=Une erreur est survenue lors du traitement du fichier pendant l'opération {0} : {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} n'est pas installé
|
||||
error.toolRequired={0} est requis pour {1}
|
||||
error.conversionFailed=Échec de la conversion {0}
|
||||
error.commandFailed=Échec de la commande {0}
|
||||
error.algorithmNotAvailable=L'algorithme {0} n'est pas disponible
|
||||
error.optionsNotSpecified=Les options pour {0} ne sont pas spécifiées
|
||||
error.fileFormatRequired=Le fichier doit être au format {0}
|
||||
error.invalidFormat=Format {0} invalide : {1}
|
||||
error.endpointDisabled=Ce point de terminaison a été désactivé par l'administrateur
|
||||
error.urlNotReachable=L'URL est inaccessible, veuillez fournir une URL valide
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=La valeur DPI {0} dépasse la limite maximale sécurisée de {1}. Des valeurs DPI trop élevées peuvent provoquer des problèmes de mémoire et des plantages. Veuillez utiliser une valeur DPI plus faible.
|
||||
error.pageTooBigForDpi=La page PDF {0} est trop grande pour être rendue à {1} DPI. Veuillez essayer une valeur DPI plus faible (recommandé : 150 ou moins).
|
||||
error.pageTooBigExceedsArray=La page PDF {0} est trop grande pour être rendue à {1} DPI. L'image résultante dépasserait la taille maximale autorisée pour un tableau en Java. Veuillez essayer une valeur DPI plus faible (recommandé : 150 ou moins).
|
||||
error.pageTooBigFor300Dpi=La page PDF {0} est trop grande pour être rendue à 300 DPI. L'image résultante dépasserait la taille maximale autorisée pour un tableau en Java. Veuillez utiliser une valeur DPI plus faible pour la conversion PDF en image.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=La clé API n'est pas valide.
|
||||
error.userNotFound=Utilisateur non trouvé.
|
||||
error.passwordRequired=Le mot de passe ne doit pas être nul.
|
||||
error.accountLocked=Votre compte a été verrouillé après trop de tentatives de connexion échouées.
|
||||
error.invalidEmail=Adresses e-mail invalides fournies.
|
||||
error.emailAttachmentRequired=Une pièce jointe est requise pour envoyer l'e-mail.
|
||||
error.signatureNotFound=Fichier de signature introuvable.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=Fichier introuvable avec l'ID : {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=Aucun script de sauvegarde trouvé.
|
||||
error.unsupportedProvider={0} n'est pas actuellement pris en charge.
|
||||
error.pathTraversalDetected=Tentative de traversée de chemin détectée pour des raisons de sécurité.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Argument invalide : {0}
|
||||
error.argumentRequired={0} ne doit pas être nul
|
||||
error.operationFailed=Échec de l'opération : {0}
|
||||
error.angleNotMultipleOf90=L'angle doit être un multiple de 90
|
||||
error.pdfBookmarksNotFound=Aucun signet ou plan PDF trouvé dans le document
|
||||
error.fontLoadingFailed=Erreur lors du traitement du fichier de police
|
||||
error.fontDirectoryReadFailed=Échec de la lecture du répertoire de polices
|
||||
delete=Supprimer
|
||||
username=Nom d'utilisateur
|
||||
password=Mot de passe
|
||||
@@ -181,7 +242,6 @@ red=Rouge
|
||||
green=Vert
|
||||
blue=Bleu
|
||||
custom=Personnalisé…
|
||||
WorkInProgess=En cours de développement, merci de nous remonter les problèmes que vous pourriez constater!
|
||||
poweredBy=Propulsé par
|
||||
yes=Oui
|
||||
no=Non
|
||||
@@ -200,7 +260,7 @@ disabledCurrentUserMessage=L'utilisateur actuel ne peut pas être désactivé
|
||||
downgradeCurrentUserLongMessage=Impossible de rétrograder le rôle de l'utilisateur actuel. Par conséquent, l'utilisateur actuel ne sera pas affiché.
|
||||
userAlreadyExistsOAuthMessage=L'utilisateur existe déjà en tant qu'utilisateur OAuth2.
|
||||
userAlreadyExistsWebMessage=L'utilisateur existe déjà en tant qu'utilisateur Web.
|
||||
invalidRoleMessage=Invalid role.
|
||||
invalidRoleMessage=Rôle non valide.
|
||||
error=Erreur
|
||||
oops=Oups !
|
||||
help=Aide
|
||||
@@ -213,27 +273,27 @@ color=Couleur
|
||||
sponsor=Sponsoriser
|
||||
info=Informations
|
||||
pro=Pro
|
||||
proFeatures=Pro Features
|
||||
proFeatures=Fonctions pro
|
||||
page=Page
|
||||
pages=Pages
|
||||
loading=Chargement...
|
||||
addToDoc=Ajouter au Document
|
||||
reset=Réinitialiser
|
||||
apply=Appliquer
|
||||
noFileSelected=No file selected. Please upload one.
|
||||
view=View
|
||||
cancel=Cancel
|
||||
noFileSelected=Aucun fichier sélectionné. Veuillez en télécharger un.
|
||||
view=Voir
|
||||
cancel=Annuler
|
||||
|
||||
back.toSettings=Back to Settings
|
||||
back.toHome=Back to Home
|
||||
back.toAdmin=Back to Admin
|
||||
back.toSettings=Retour aux paramètres
|
||||
back.toHome=Retour à l'accueil
|
||||
back.toAdmin=Retour à l'administration
|
||||
|
||||
legal.privacy=Politique de Confidentialité
|
||||
legal.terms=Conditions Générales
|
||||
legal.accessibility=Accessibilité
|
||||
legal.cookie=Politique des Cookies
|
||||
legal.impressum=Mentions Légales
|
||||
legal.showCookieBanner=Cookie Preferences
|
||||
legal.showCookieBanner=Préférences pour les cookies
|
||||
|
||||
###############
|
||||
# Pipeline #
|
||||
@@ -267,7 +327,7 @@ enterpriseEdition.button=Passer à Pro
|
||||
enterpriseEdition.warning=Cette fonctionnalité est uniquement disponible pour les utilisateurs Pro.
|
||||
enterpriseEdition.yamlAdvert=Stirling PDF Pro prend en charge les fichiers de configuration YAML et d'autres fonctionnalités SSO.
|
||||
enterpriseEdition.ssoAdvert=Vous cherchez plus de fonctionnalités de gestion des utilisateurs ? Découvrez Stirling PDF Pro
|
||||
enterpriseEdition.proTeamFeatureDisabled=Team management features require a Pro licence or higher
|
||||
enterpriseEdition.proTeamFeatureDisabled=Les fonctions de gestion d'équipe nécessitent une licence Pro ou supérieure
|
||||
|
||||
|
||||
#################
|
||||
@@ -348,8 +408,8 @@ account.property=Propriété
|
||||
account.webBrowserSettings=Paramètres du navigateur
|
||||
account.syncToBrowser=Synchroniser : Compte → Navigateur
|
||||
account.syncToAccount=Synchroniser : Compte ← Navigateur
|
||||
account.adminTitle=Administrator Tools
|
||||
account.adminNotif=You have admin privileges. Access system settings and user management.
|
||||
account.adminTitle=Outils d'administrations
|
||||
account.adminNotif=Vous avez des privilèges d'administrateur. Accédez aux paramètres du système et à la gestion des utilisateurs.
|
||||
|
||||
|
||||
adminUserSettings.title=Administration des paramètres des utilisateurs
|
||||
@@ -379,75 +439,75 @@ adminUserSettings.activeUsers=Utilisateurs actifs :
|
||||
adminUserSettings.disabledUsers=Utilisateurs désactivés :
|
||||
adminUserSettings.totalUsers=Utilisateurs au total :
|
||||
adminUserSettings.lastRequest=Dernière requête
|
||||
adminUserSettings.usage=View Usage
|
||||
adminUserSettings.teams=View/Edit Teams
|
||||
adminUserSettings.team=Team
|
||||
adminUserSettings.manageTeams=Manage Teams
|
||||
adminUserSettings.createTeam=Create Team
|
||||
adminUserSettings.viewTeam=View Team
|
||||
adminUserSettings.deleteTeam=Delete Team
|
||||
adminUserSettings.teamName=Team Name
|
||||
adminUserSettings.teamExists=Team already exists
|
||||
adminUserSettings.teamCreated=Team created successfully
|
||||
adminUserSettings.teamChanged=User's team was updated
|
||||
adminUserSettings.teamHidden=Hidden
|
||||
adminUserSettings.totalMembers=Total Members
|
||||
adminUserSettings.confirmDeleteTeam=Are you sure you want to delete this team?
|
||||
adminUserSettings.usage=Voir l'utilisation
|
||||
adminUserSettings.teams=Voir/modifier les équipes
|
||||
adminUserSettings.team=Équipe
|
||||
adminUserSettings.manageTeams=Gérer les équipes
|
||||
adminUserSettings.createTeam=Créer une équipe
|
||||
adminUserSettings.viewTeam=Voir l'équipe
|
||||
adminUserSettings.deleteTeam=Supprimer l'équipe
|
||||
adminUserSettings.teamName=Nom de l'équipe
|
||||
adminUserSettings.teamExists=L'équipe existe déjà
|
||||
adminUserSettings.teamCreated=Création réussie d'une équipe
|
||||
adminUserSettings.teamChanged=Les membres de l'équipe de l'utilisateur ont été mis à jour.
|
||||
adminUserSettings.teamHidden=Caché
|
||||
adminUserSettings.totalMembers=Membres totaux
|
||||
adminUserSettings.confirmDeleteTeam=Êtes-vous sûr de vouloir supprimer cette équipe ?
|
||||
|
||||
teamCreated=Team created successfully
|
||||
teamExists=A team with that name already exists
|
||||
teamNameExists=Another team with that name already exists
|
||||
teamNotFound=Team not found
|
||||
teamDeleted=Team deleted
|
||||
teamHasUsers=Cannot delete a team with users assigned
|
||||
teamRenamed=Team renamed successfully
|
||||
teamCreated=Équipe créée avec succès
|
||||
teamExists=Une équipe portant ce nom existe déjà
|
||||
teamNameExists=Une autre équipe portant ce nom existe déjà
|
||||
teamNotFound=Équipe non trouvée
|
||||
teamDeleted=Équipe supprimée
|
||||
teamHasUsers=Impossible de supprimer une équipe à laquelle des membres ont été affectés
|
||||
teamRenamed=L'équipe a été renommée avec succès
|
||||
|
||||
# Team user management
|
||||
team.addUser=Add User to Team
|
||||
team.selectUser=Select User
|
||||
team.warning.moveUser=Warning: This will move the user from "{0}" team to "{1}" team. Are you sure?
|
||||
team.confirm.moveUser=Are you sure you want to move this user from "{0}" team to "{1}" team?
|
||||
team.userAdded=User successfully added to team
|
||||
team.back=Back to Teams
|
||||
team.internal=Internal Team
|
||||
team.internalTeamNotAccessible=The Internal team is a system team and cannot be accessed
|
||||
team.cannotMoveInternalUsers=Users in the Internal team cannot be moved to other teams
|
||||
team.hidden=Hidden
|
||||
team.name=Team Name
|
||||
team.totalMembers=Total Members
|
||||
team.members=Members
|
||||
team.username=Username
|
||||
team.role=Role
|
||||
team.status=Status
|
||||
team.enabled=Enabled
|
||||
team.disabled=Disabled
|
||||
team.noMembers=This team has no members yet.
|
||||
team.addUser=Ajouter un membre à l'équipe
|
||||
team.selectUser=Sélectionner l'utilisateur
|
||||
team.warning.moveUser=Attention : L'utilisateur passera de l'équipe "{0}" à l'équipe "{1}". Êtes-vous sûr de vous ?
|
||||
team.confirm.moveUser=Êtes-vous sûr de vouloir déplacer cet utilisateur de l'équipe "{0}" vers l'équipe "{1}" ?
|
||||
team.userAdded=L'utilisateur a été ajouté avec succès à l'équipe
|
||||
team.back=Retour aux équipes
|
||||
team.internal=Équipe interne
|
||||
team.internalTeamNotAccessible=L'équipe interne est une équipe système et n'est pas accessible.
|
||||
team.cannotMoveInternalUsers=Les utilisateurs de l'équipe interne ne peuvent pas être déplacés vers d'autres équipes.
|
||||
team.hidden=Caché
|
||||
team.name=Nom de l'équipe
|
||||
team.totalMembers=Membres totaux
|
||||
team.members=Membres
|
||||
team.username=Nom d'utilisateur
|
||||
team.role=Rôle
|
||||
team.status=Statut
|
||||
team.enabled=Activé
|
||||
team.disabled=Désactivé
|
||||
team.noMembers=Cette équipe n'a pas encore de membres.
|
||||
|
||||
|
||||
|
||||
endpointStatistics.title=Endpoint Statistics
|
||||
endpointStatistics.header=Endpoint Statistics
|
||||
endpointStatistics.title=Statistiques des points de terminaison
|
||||
endpointStatistics.header=Statistiques des points de terminaison
|
||||
endpointStatistics.top10=Top 10
|
||||
endpointStatistics.top20=Top 20
|
||||
endpointStatistics.all=All
|
||||
endpointStatistics.refresh=Refresh
|
||||
endpointStatistics.includeHomepage=Include Homepage ('/')
|
||||
endpointStatistics.includeLoginPage=Include Login Page ('/login')
|
||||
endpointStatistics.totalEndpoints=Total Endpoints
|
||||
endpointStatistics.totalVisits=Total Visits
|
||||
endpointStatistics.showing=Showing
|
||||
endpointStatistics.selectedVisits=Selected Visits
|
||||
endpointStatistics.endpoint=Endpoint
|
||||
endpointStatistics.visits=Visits
|
||||
endpointStatistics.percentage=Percentage
|
||||
endpointStatistics.loading=Loading...
|
||||
endpointStatistics.failedToLoad=Failed to load endpoint data. Please try refreshing.
|
||||
endpointStatistics.home=Home
|
||||
endpointStatistics.login=Login
|
||||
endpointStatistics.all=Tout
|
||||
endpointStatistics.refresh=Rafraîchir
|
||||
endpointStatistics.includeHomepage=Inclure la page d'accueil ('/')
|
||||
endpointStatistics.includeLoginPage=Inclure la page de connexion ('/login')
|
||||
endpointStatistics.totalEndpoints=Nombre total de points de terminaison
|
||||
endpointStatistics.totalVisits=Nombre total de visites
|
||||
endpointStatistics.showing=Affichage
|
||||
endpointStatistics.selectedVisits=Visites sélectionnées
|
||||
endpointStatistics.endpoint=Point de terminaison
|
||||
endpointStatistics.visits=Visites
|
||||
endpointStatistics.percentage=Pourcentage
|
||||
endpointStatistics.loading=Chargement...
|
||||
endpointStatistics.failedToLoad=Échec du chargement des données des points de terminaisons. Veuillez réessayer.
|
||||
endpointStatistics.home=Accueil
|
||||
endpointStatistics.login=Connexion
|
||||
endpointStatistics.top=Top
|
||||
endpointStatistics.numberOfVisits=Number of Visits
|
||||
endpointStatistics.visitsTooltip=Visits: {0} ({1}% of total)
|
||||
endpointStatistics.retry=Retry
|
||||
endpointStatistics.numberOfVisits=Nombre de visites
|
||||
endpointStatistics.visitsTooltip=Visites : {0} ({1}% du total)
|
||||
endpointStatistics.retry=Réessayer
|
||||
|
||||
database.title=Import/Export de la Base de Données
|
||||
database.header=Import/Export de la Base de Données
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Ajouter une image
|
||||
home.addImage.desc=Ajoutez une image à un emplacement défini sur un PDF.
|
||||
addImage.tags=img,jpg,image,photo
|
||||
|
||||
home.attachments.title=Ajouter des pièces jointes
|
||||
home.attachments.desc=Ajouter ou supprimer des fichiers intégrés (pièces jointes) dans un PDF
|
||||
attachments.tags=intégrer,joindre,fichier,pièce,jointe,embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Ajouter un filigrane
|
||||
home.watermark.desc=Ajoutez un filigrane personnalisé à votre PDF.
|
||||
watermark.tags=texte,filigrane,label,propriété,droit d'auteur,marque déposée,img,jpg,image,photo,copyright,trademark
|
||||
@@ -550,9 +614,9 @@ home.compressPdfs.title=Compresser
|
||||
home.compressPdfs.desc=Compressez les PDF pour réduire leur tailles.
|
||||
compressPdfs.tags=compresser,réduire,taille,squish,small,tiny
|
||||
|
||||
home.unlockPDFForms.title=Unlock PDF Forms
|
||||
home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document.
|
||||
unlockPDFForms.tags=remove,delete,form,field,readonly
|
||||
home.unlockPDFForms.title=Déverrouiller les formulaires PDF
|
||||
home.unlockPDFForms.desc=Supprimer la propriété lecture seule des champs de formulaire dans un document PDF
|
||||
unlockPDFForms.tags=supprimer,propriété,déverrouiller,formulaire,champs,lecture,remove,delete,form,field,readonly
|
||||
|
||||
home.changeMetadata.title=Modifier les métadonnées
|
||||
home.changeMetadata.desc=Modifiez, supprimez ou ajoutez des métadonnées à un PDF.
|
||||
@@ -676,21 +740,21 @@ home.HTMLToPDF.desc=Convertissez n'importe quel fichier HTML ou ZIP en PDF.
|
||||
HTMLToPDF.tags=html,markup,contenu Web,transformation,convert
|
||||
|
||||
#eml-to-pdf
|
||||
home.EMLToPDF.title=Email to PDF
|
||||
home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images
|
||||
EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail
|
||||
home.EMLToPDF.title=Email en PDF
|
||||
home.EMLToPDF.desc=Convertit les fichiers email (EML) en PDF, y compris les en-têtes, le corps et les images intégrées
|
||||
EMLToPDF.tags=email,conversion,courrier,conversion,eml,message,transformation,convert,mail
|
||||
|
||||
EMLToPDF.title=Email To PDF
|
||||
EMLToPDF.header=Email To PDF
|
||||
EMLToPDF.submit=Convert
|
||||
EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF
|
||||
EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues
|
||||
EMLToPDF.includeAttachments=Include attachments in PDF
|
||||
EMLToPDF.maxAttachmentSize=Maximum attachment size (MB)
|
||||
EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images
|
||||
EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both
|
||||
EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code.
|
||||
EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs
|
||||
EMLToPDF.title=Email en PDF
|
||||
EMLToPDF.header=Email en PDF
|
||||
EMLToPDF.submit=Convertir
|
||||
EMLToPDF.downloadHtml=Télécharger le fichier HTML intermédiaire au lieu du PDF
|
||||
EMLToPDF.downloadHtmlHelp=Cela vous permet de voir la version HTML avant la conversion en PDF et peut aider à corriger les problèmes de mise en forme
|
||||
EMLToPDF.includeAttachments=Inclure les pièces jointes dans le PDF
|
||||
EMLToPDF.maxAttachmentSize=Taille maximale des pièces jointes (Mo)
|
||||
EMLToPDF.help=Convertit les fichiers email (EML) en PDF, y compris les en-têtes, le corps et les images intégrées
|
||||
EMLToPDF.troubleshootingTip1=La conversion Email vers HTML est plus fiable, il est donc recommandé de sauvegarder les deux lors d'un traitement par lot
|
||||
EMLToPDF.troubleshootingTip2=Avec un petit nombre d'emails, si le PDF est mal formé, vous pouvez télécharger le HTML et corriger manuellement le code HTML/CSS problématique
|
||||
EMLToPDF.troubleshootingTip3=Les éléments intégrés ne fonctionnent cependant pas avec les fichiers HTML
|
||||
|
||||
home.MarkdownToPDF.title=Markdown en PDF
|
||||
home.MarkdownToPDF.desc=Convertissez n'importe quel fichier Markdown en PDF.
|
||||
@@ -806,12 +870,12 @@ login.oauth2invalidRequest=Requête invalide
|
||||
login.oauth2AccessDenied=Accès refusé
|
||||
login.oauth2InvalidTokenResponse=Réponse contenant le jeton est invalide
|
||||
login.oauth2InvalidIdToken=Jeton d'identification invalide
|
||||
login.relyingPartyRegistrationNotFound=No relying party registration found
|
||||
login.relyingPartyRegistrationNotFound=Aucun enregistrement de partie de confiance trouvé
|
||||
login.userIsDisabled=L'utilisateur est désactivé, la connexion est actuellement bloquée avec ce nom d'utilisateur. Veuillez contacter l'administrateur.
|
||||
login.alreadyLoggedIn=Vous êtes déjà connecté sur
|
||||
login.alreadyLoggedIn2=appareils. Veuillez vous déconnecter des appareils et réessayer.
|
||||
login.toManySessions=Vous avez trop de sessions actives.
|
||||
login.logoutMessage=You have been logged out.
|
||||
login.logoutMessage=Vous avez été déconnecté.
|
||||
|
||||
#auto-redact
|
||||
autoRedact.title=Caviarder automatiquement
|
||||
@@ -877,28 +941,28 @@ getPdfInfo.title=Récupérer les informations
|
||||
getPdfInfo.header=Récupérer les informations
|
||||
getPdfInfo.submit=Récupérer les informations
|
||||
getPdfInfo.downloadJson=Télécharger le JSON
|
||||
getPdfInfo.summary=PDF Summary
|
||||
getPdfInfo.summary.encrypted=This PDF is encrypted so may face issues with some applications
|
||||
getPdfInfo.summary.permissions=This PDF has {0} restricted permissions which may limit what you can do with it
|
||||
getPdfInfo.summary.compliance=This PDF complies with the {0} standard
|
||||
getPdfInfo.summary.basicInfo=Basic Information
|
||||
getPdfInfo.summary.docInfo=Document Information
|
||||
getPdfInfo.summary.encrypted.alert=Encrypted PDF - This document is password protected
|
||||
getPdfInfo.summary.not.encrypted.alert=Unencrypted PDF - No password protection
|
||||
getPdfInfo.summary.permissions.alert=Restricted Permissions - {0} actions are not allowed
|
||||
getPdfInfo.summary.all.permissions.alert=All Permissions Allowed
|
||||
getPdfInfo.summary.compliance.alert={0} Compliant
|
||||
getPdfInfo.summary.no.compliance.alert=No Compliance Standards
|
||||
getPdfInfo.summary.security.section=Security Status
|
||||
getPdfInfo.section.BasicInfo=Basic Information about the PDF document including file size, page count, and language
|
||||
getPdfInfo.section.Metadata=Document metadata including title, author, creation date and other document properties
|
||||
getPdfInfo.section.DocumentInfo=Technical details about the PDF document structure and version
|
||||
getPdfInfo.section.Compliancy=PDF standards compliance information (PDF/A, PDF/X, etc.)
|
||||
getPdfInfo.section.Encryption=Security and encryption details of the document
|
||||
getPdfInfo.section.Permissions=Document permission settings that control what actions can be performed
|
||||
getPdfInfo.section.Other=Additional document components like bookmarks, layers, and embedded files
|
||||
getPdfInfo.section.FormFields=Interactive form fields present in the document
|
||||
getPdfInfo.section.PerPageInfo=Detailed information about each page in the document
|
||||
getPdfInfo.summary=Résumé du PDF
|
||||
getPdfInfo.summary.encrypted=Ce PDF est chiffré et peut poser des problèmes avec certaines applications
|
||||
getPdfInfo.summary.permissions=Ce PDF a {0} permissions restreintes, ce qui peut limiter les actions possibles
|
||||
getPdfInfo.summary.compliance=Ce PDF est conforme à la norme {0}
|
||||
getPdfInfo.summary.basicInfo=Informations de base
|
||||
getPdfInfo.summary.docInfo=Informations sur le document
|
||||
getPdfInfo.summary.encrypted.alert=PDF chiffré - Ce document est protégé par mot de passe
|
||||
getPdfInfo.summary.not.encrypted.alert=PDF non chiffré - Aucune protection par mot de passe
|
||||
getPdfInfo.summary.permissions.alert=Permissions restreintes - {0} actions ne sont pas autorisées
|
||||
getPdfInfo.summary.all.permissions.alert=Toutes les permissions sont autorisées
|
||||
getPdfInfo.summary.compliance.alert=Conforme à {0}
|
||||
getPdfInfo.summary.no.compliance.alert=Non conforme à une norme
|
||||
getPdfInfo.summary.security.section=État de la sécurité
|
||||
getPdfInfo.section.BasicInfo=Informations de base sur le document PDF, y compris la taille du fichier, le nombre de pages et la langue
|
||||
getPdfInfo.section.Metadata=Métadonnées du document, y compris le titre, l'auteur, la date de création et d'autres propriétés
|
||||
getPdfInfo.section.DocumentInfo=Détails techniques sur la structure et la version du document PDF
|
||||
getPdfInfo.section.Compliancy=Informations sur la conformité aux normes PDF (PDF/A, PDF/X, etc.)
|
||||
getPdfInfo.section.Encryption=Détails sur la sécurité et le chiffrement du document
|
||||
getPdfInfo.section.Permissions=Paramètres de permissions du document qui contrôlent les actions autorisées
|
||||
getPdfInfo.section.Other=Composants supplémentaires du document comme les signets, calques et fichiers intégrés
|
||||
getPdfInfo.section.FormFields=Champs de formulaire interactifs présents dans le document
|
||||
getPdfInfo.section.PerPageInfo=Informations détaillées sur chaque page du document
|
||||
|
||||
|
||||
#markdown-to-pdf
|
||||
@@ -910,9 +974,9 @@ MarkdownToPDF.credit=Utilise WeasyPrint.
|
||||
|
||||
|
||||
#pdf-to-markdown
|
||||
PDFToMarkdown.title=PDF To Markdown
|
||||
PDFToMarkdown.header=PDF To Markdown
|
||||
PDFToMarkdown.submit=Convert
|
||||
PDFToMarkdown.title=PDF en Markdown
|
||||
PDFToMarkdown.header=PDF en Markdown
|
||||
PDFToMarkdown.submit=Convertir
|
||||
|
||||
|
||||
#url-to-pdf
|
||||
@@ -966,10 +1030,10 @@ sanitizePDF.title=Assainir
|
||||
sanitizePDF.header=Assainir
|
||||
sanitizePDF.selectText.1=Supprimer les actions JavaScript
|
||||
sanitizePDF.selectText.2=Supprimer les fichiers intégrés
|
||||
sanitizePDF.selectText.3=Remove XMP metadata
|
||||
sanitizePDF.selectText.3=Supprimer les métadonnées XMP
|
||||
sanitizePDF.selectText.4=Supprimer les liens
|
||||
sanitizePDF.selectText.5=Supprimer les polices
|
||||
sanitizePDF.selectText.6=Remove Document Info Metadata
|
||||
sanitizePDF.selectText.6=Supprimer les métadonnées d'information du document
|
||||
sanitizePDF.submit=Assainir
|
||||
|
||||
|
||||
@@ -1019,7 +1083,7 @@ autoSplitPDF.selectText.3=Téléchargez le fichier PDF numérisé et laissez Sti
|
||||
autoSplitPDF.selectText.4=Les feuilles de séparation sont automatiquement détectées et supprimées, garantissant un document final soigné.
|
||||
autoSplitPDF.formPrompt=PDF contenant des feuilles de séparation de Stirling PDF :
|
||||
autoSplitPDF.duplexMode=Mode recto-verso
|
||||
autoSplitPDF.dividerDownload2=Auto Splitter Divider (with instructions).pdf
|
||||
autoSplitPDF.dividerDownload2=Feuille de séparation automatique (avec instructions).pdf
|
||||
autoSplitPDF.submit=Séparer
|
||||
|
||||
|
||||
@@ -1190,8 +1254,8 @@ compress.title=Compresser un PDF
|
||||
compress.header=Compresser un PDF (lorsque c'est possible!)
|
||||
compress.credit=Ce service utilise qpdf pour la compression et l'optimisation des PDF.
|
||||
compress.grayscale.label=Appliquer l'échelle de gris pour la compression
|
||||
compress.selectText.1=Compression Settings
|
||||
compress.selectText.1.1=1-3 PDF compression,</br> 4-6 lite image compression,</br> 7-9 intense image compression Will dramatically reduce image quality
|
||||
compress.selectText.1=Paramètres de compression
|
||||
compress.selectText.1.1=1-3 compression PDF,</br> 4-6 compression d'image légère,</br> 7-9 compression d'image intense qui réduira considérablement la qualité de l'image
|
||||
compress.selectText.2=Niveau d'optimisation
|
||||
compress.selectText.4=Mode automatique – ajuste automatiquement la qualité pour obtenir le PDF à la taille exacte
|
||||
compress.selectText.5=Taille PDF attendue (par exemple, 25 MB, 10,8 MB, 25 KB)
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Toutes les pages ?
|
||||
addImage.upload=Télécharger une image
|
||||
addImage.submit=Ajouter une image
|
||||
|
||||
#attachments
|
||||
attachments.title=Ajouter des pièces jointes
|
||||
attachments.header=Ajouter des pièces jointes
|
||||
attachments.description=Permet d'ajouter des pièces jointes au PDF
|
||||
attachments.descriptionPlaceholder=Entrez une description pour les pièces jointes...
|
||||
attachments.addButton=Ajouter des pièces jointes
|
||||
|
||||
#merge
|
||||
merge.title=Fusionner
|
||||
@@ -1212,7 +1282,7 @@ merge.header=Fusionner plusieurs PDF
|
||||
merge.sortByName=Trier par nom
|
||||
merge.sortByDate=Trier par date
|
||||
merge.removeCertSign=Supprimer la signature numérique dans le fichier fusionné ?
|
||||
merge.generateToc=Generate table of contents in the merged file?
|
||||
merge.generateToc=Générer une table des matières dans le fichier fusionné ?
|
||||
merge.submit=Fusionner
|
||||
|
||||
|
||||
@@ -1231,7 +1301,7 @@ pdfOrganiser.mode.7=Supprimer le premier
|
||||
pdfOrganiser.mode.8=Supprimer le dernier
|
||||
pdfOrganiser.mode.9=Supprimer le premier et le dernier
|
||||
pdfOrganiser.mode.10=Méger Impair-Pair
|
||||
pdfOrganiser.mode.11=Duplicate all pages
|
||||
pdfOrganiser.mode.11=Dupliquer toutes les pages
|
||||
pdfOrganiser.placeholder=(par exemple 1,3,2 ou 4-8,2,10-12 ou 2n-1)
|
||||
|
||||
|
||||
@@ -1257,8 +1327,8 @@ multiTool.moveLeft=Déplacer vers la gauche
|
||||
multiTool.moveRight=Déplacer vers la droite
|
||||
multiTool.delete=Supprimer
|
||||
multiTool.dragDropMessage=Page(s) sélectionnées
|
||||
multiTool.undo=Undo
|
||||
multiTool.redo=Redo
|
||||
multiTool.undo=Annuler
|
||||
multiTool.redo=Refaire
|
||||
|
||||
#decrypt
|
||||
decrypt.passwordPrompt=Ce fichier est protégé par un mot de passe. Veuillez saisir le mot de passe :
|
||||
@@ -1274,7 +1344,7 @@ decrypt.success=Fichier déchiffré avec succès.
|
||||
multiTool-advert.message=Cette fonctionnalité est aussi disponible dans la <a href="{0}">page de l'outil multifonction</a>. Allez-y pour une interface page par page améliorée et des fonctionnalités additionnelles !
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=View/Edit PDF
|
||||
viewPdf.title=Afficher/modifier un PDF
|
||||
viewPdf.header=Visualiser un PDF
|
||||
|
||||
#pageRemover
|
||||
@@ -1333,7 +1403,7 @@ pdfToImage.color=Couleur
|
||||
pdfToImage.grey=Niveaux de gris
|
||||
pdfToImage.blackwhite=Noir et blanc (peut engendrer une perte de données !)
|
||||
pdfToImage.submit=Convertir
|
||||
pdfToImage.info=Python n’est pas installé. Nécessaire pour la conversion WebP.
|
||||
pdfToImage.info=Python n'est pas installé. Nécessaire pour la conversion WebP.
|
||||
pdfToImage.placeholder=(par exemple : 1,2,8 ou 4,7,12-16 ou 2n-1)
|
||||
|
||||
|
||||
@@ -1422,9 +1492,9 @@ changeMetadata.selectText.5=Ajouter une entrée de métadonnées personnalisée
|
||||
changeMetadata.submit=Modifier
|
||||
|
||||
#unlockPDFForms
|
||||
unlockPDFForms.title=Remove Read-Only from Form Fields
|
||||
unlockPDFForms.header=Unlock PDF Forms
|
||||
unlockPDFForms.submit=Remove
|
||||
unlockPDFForms.title=Supprimer la lecture seule des champs de formulaire
|
||||
unlockPDFForms.header=Déverrouiller les formulaires PDF
|
||||
unlockPDFForms.submit=Supprimer
|
||||
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF en PDF/A
|
||||
@@ -1590,10 +1660,11 @@ splitByChapters.submit=Diviser le PDF
|
||||
fileChooser.click=Cliquez
|
||||
fileChooser.or=ou
|
||||
fileChooser.dragAndDrop=Glisser & Déposer
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.dragAndDropPDF=Glisser & Déposer un PDF
|
||||
fileChooser.dragAndDropImage=Glisser & Déposer une image
|
||||
fileChooser.hoveredDragAndDrop=Glisser & Déposer le(s) fichier(s) ici
|
||||
fileChooser.extractPDF=Extraction en cours...
|
||||
fileChooser.addAttachments=Glisser & Déposer les pièces jointes ici
|
||||
|
||||
#release notes
|
||||
releases.footer=Versions
|
||||
@@ -1638,157 +1709,157 @@ validateSignature.cert.selfSigned=Auto-signé
|
||||
validateSignature.cert.bits=bits
|
||||
|
||||
# Audit Dashboard
|
||||
audit.dashboard.title=Audit Dashboard
|
||||
audit.dashboard.systemStatus=Audit System Status
|
||||
audit.dashboard.status=Status
|
||||
audit.dashboard.enabled=Enabled
|
||||
audit.dashboard.disabled=Disabled
|
||||
audit.dashboard.currentLevel=Current Level
|
||||
audit.dashboard.retentionPeriod=Retention Period
|
||||
audit.dashboard.days=days
|
||||
audit.dashboard.totalEvents=Total Events
|
||||
audit.dashboard.title=Tableau de bord d'audit
|
||||
audit.dashboard.systemStatus=État du système d'audit
|
||||
audit.dashboard.status=Statut
|
||||
audit.dashboard.enabled=Activé
|
||||
audit.dashboard.disabled=Désactivé
|
||||
audit.dashboard.currentLevel=Niveau actuel
|
||||
audit.dashboard.retentionPeriod=Période de conservation
|
||||
audit.dashboard.days=jours
|
||||
audit.dashboard.totalEvents=Nombre total d'événements
|
||||
|
||||
# Audit Dashboard Tabs
|
||||
audit.dashboard.tab.dashboard=Dashboard
|
||||
audit.dashboard.tab.events=Audit Events
|
||||
audit.dashboard.tab.export=Export
|
||||
audit.dashboard.tab.dashboard=Tableau de bord
|
||||
audit.dashboard.tab.events=Événements d'audit
|
||||
audit.dashboard.tab.export=Exportation
|
||||
# Dashboard Charts
|
||||
audit.dashboard.eventsByType=Events by Type
|
||||
audit.dashboard.eventsByUser=Events by User
|
||||
audit.dashboard.eventsOverTime=Events Over Time
|
||||
audit.dashboard.period.7days=7 Days
|
||||
audit.dashboard.period.30days=30 Days
|
||||
audit.dashboard.period.90days=90 Days
|
||||
audit.dashboard.eventsByType=Événements par type
|
||||
audit.dashboard.eventsByUser=Événements par utilisateur
|
||||
audit.dashboard.eventsOverTime=Événements dans le temps
|
||||
audit.dashboard.period.7days=7 jours
|
||||
audit.dashboard.period.30days=30 jours
|
||||
audit.dashboard.period.90days=90 jours
|
||||
|
||||
# Events Tab
|
||||
audit.dashboard.auditEvents=Audit Events
|
||||
audit.dashboard.filter.eventType=Event Type
|
||||
audit.dashboard.filter.allEventTypes=All event types
|
||||
audit.dashboard.filter.user=User
|
||||
audit.dashboard.filter.userPlaceholder=Filter by user
|
||||
audit.dashboard.filter.startDate=Start Date
|
||||
audit.dashboard.filter.endDate=End Date
|
||||
audit.dashboard.filter.apply=Apply Filters
|
||||
audit.dashboard.filter.reset=Reset Filters
|
||||
audit.dashboard.auditEvents=Événements d'audit
|
||||
audit.dashboard.filter.eventType=Type d'événement
|
||||
audit.dashboard.filter.allEventTypes=Tous les types d'événements
|
||||
audit.dashboard.filter.user=Utilisateur
|
||||
audit.dashboard.filter.userPlaceholder=Filtrer par utilisateur
|
||||
audit.dashboard.filter.startDate=Date de début
|
||||
audit.dashboard.filter.endDate=Date de fin
|
||||
audit.dashboard.filter.apply=Appliquer les filtres
|
||||
audit.dashboard.filter.reset=Réinitialiser les filtres
|
||||
|
||||
# Table Headers
|
||||
audit.dashboard.table.id=ID
|
||||
audit.dashboard.table.time=Time
|
||||
audit.dashboard.table.user=User
|
||||
audit.dashboard.table.time=Heure
|
||||
audit.dashboard.table.user=Utilisateur
|
||||
audit.dashboard.table.type=Type
|
||||
audit.dashboard.table.details=Details
|
||||
audit.dashboard.table.viewDetails=View Details
|
||||
audit.dashboard.table.details=Détails
|
||||
audit.dashboard.table.viewDetails=Voir les détails
|
||||
|
||||
# Pagination
|
||||
audit.dashboard.pagination.show=Show
|
||||
audit.dashboard.pagination.entries=entries
|
||||
audit.dashboard.pagination.show=Afficher
|
||||
audit.dashboard.pagination.entries=entrées
|
||||
audit.dashboard.pagination.pageInfo1=Page
|
||||
audit.dashboard.pagination.pageInfo2=of
|
||||
audit.dashboard.pagination.totalRecords=Total records:
|
||||
audit.dashboard.pagination.pageInfo2=de
|
||||
audit.dashboard.pagination.totalRecords=Nombre total d'enregistrements :
|
||||
|
||||
# Modal
|
||||
audit.dashboard.modal.eventDetails=Event Details
|
||||
audit.dashboard.modal.eventDetails=Détails de l'événement
|
||||
audit.dashboard.modal.id=ID
|
||||
audit.dashboard.modal.user=User
|
||||
audit.dashboard.modal.user=Utilisateur
|
||||
audit.dashboard.modal.type=Type
|
||||
audit.dashboard.modal.time=Time
|
||||
audit.dashboard.modal.data=Data
|
||||
audit.dashboard.modal.time=Heure
|
||||
audit.dashboard.modal.data=Données
|
||||
|
||||
# Export Tab
|
||||
audit.dashboard.export.title=Export Audit Data
|
||||
audit.dashboard.export.format=Export Format
|
||||
audit.dashboard.export.csv=CSV (Comma Separated Values)
|
||||
audit.dashboard.export.json=JSON (JavaScript Object Notation)
|
||||
audit.dashboard.export.button=Export Data
|
||||
audit.dashboard.export.infoTitle=Export Information
|
||||
audit.dashboard.export.infoDesc1=The export will include all audit events matching the selected filters. For large datasets, the export may take a few moments to generate.
|
||||
audit.dashboard.export.infoDesc2=Exported data will include:
|
||||
audit.dashboard.export.infoItem1=Event ID
|
||||
audit.dashboard.export.infoItem2=User
|
||||
audit.dashboard.export.infoItem3=Event Type
|
||||
audit.dashboard.export.infoItem4=Timestamp
|
||||
audit.dashboard.export.infoItem5=Event Data
|
||||
audit.dashboard.export.title=Exporter les données d'audit
|
||||
audit.dashboard.export.format=Format d'exportation
|
||||
audit.dashboard.export.csv=CSV (valeurs séparées par des virgules)
|
||||
audit.dashboard.export.json=JSON (notation objet JavaScript)
|
||||
audit.dashboard.export.button=Exporter les données
|
||||
audit.dashboard.export.infoTitle=Informations sur l'exportation
|
||||
audit.dashboard.export.infoDesc1=L'exportation inclura tous les événements d'audit correspondant aux filtres sélectionnés. Pour les grands ensembles de données, l'exportation peut prendre quelques instants.
|
||||
audit.dashboard.export.infoDesc2=Les données exportées incluront :
|
||||
audit.dashboard.export.infoItem1=ID de l'événement
|
||||
audit.dashboard.export.infoItem2=Utilisateur
|
||||
audit.dashboard.export.infoItem3=Type d'événement
|
||||
audit.dashboard.export.infoItem4=Horodatage
|
||||
audit.dashboard.export.infoItem5=Données de l'événement
|
||||
|
||||
# JavaScript i18n keys
|
||||
audit.dashboard.js.noEventsFound=No audit events found matching the current filters
|
||||
audit.dashboard.js.errorLoading=Error loading data:
|
||||
audit.dashboard.js.errorRendering=Error rendering table:
|
||||
audit.dashboard.js.loadingPage=Loading page
|
||||
audit.dashboard.js.noEventsFound=Aucun événement d'audit trouvé correspondant aux filtres actuels
|
||||
audit.dashboard.js.errorLoading=Erreur lors du chargement des données :
|
||||
audit.dashboard.js.errorRendering=Erreur lors de l'affichage du tableau :
|
||||
audit.dashboard.js.loadingPage=Chargement de la page
|
||||
|
||||
####################
|
||||
# Cookie banner #
|
||||
####################
|
||||
cookieBanner.popUp.title=How we use Cookies
|
||||
cookieBanner.popUp.description.1=We use cookies and other technologies to make Stirling PDF work better for you—helping us improve our tools and keep building features you'll love.
|
||||
cookieBanner.popUp.description.2=If you’d rather not, clicking 'No Thanks' will only enable the essential cookies needed to keep things running smoothly.
|
||||
cookieBanner.popUp.acceptAllBtn=Okay
|
||||
cookieBanner.popUp.acceptNecessaryBtn=No Thanks
|
||||
cookieBanner.popUp.showPreferencesBtn=Manage preferences
|
||||
cookieBanner.preferencesModal.title=Consent Preferences Center
|
||||
cookieBanner.preferencesModal.acceptAllBtn=Accept all
|
||||
cookieBanner.preferencesModal.acceptNecessaryBtn=Reject all
|
||||
cookieBanner.preferencesModal.savePreferencesBtn=Save preferences
|
||||
cookieBanner.preferencesModal.closeIconLabel=Close modal
|
||||
cookieBanner.popUp.title=Comment nous utilisons les cookies
|
||||
cookieBanner.popUp.description.1=Nous utilisons des cookies et d'autres technologies pour améliorer Stirling PDF pour vous — cela nous aide à perfectionner nos outils et à créer des fonctionnalités que vous allez adorer.
|
||||
cookieBanner.popUp.description.2=Si vous préférez ne pas les utiliser, cliquer sur « Non merci » n'activera que les cookies essentiels nécessaires au bon fonctionnement du site.
|
||||
cookieBanner.popUp.acceptAllBtn=D'accord
|
||||
cookieBanner.popUp.acceptNecessaryBtn=Non merci
|
||||
cookieBanner.popUp.showPreferencesBtn=Gérer les préférences
|
||||
cookieBanner.preferencesModal.title=Centre de préférences de consentement
|
||||
cookieBanner.preferencesModal.acceptAllBtn=Tout accepter
|
||||
cookieBanner.preferencesModal.acceptNecessaryBtn=Tout refuser
|
||||
cookieBanner.preferencesModal.savePreferencesBtn=Enregistrer les préférences
|
||||
cookieBanner.preferencesModal.closeIconLabel=Fermer la fenêtre
|
||||
cookieBanner.preferencesModal.serviceCounterLabel=Service|Services
|
||||
cookieBanner.preferencesModal.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.
|
||||
cookieBanner.preferencesModal.description.2=Stirling PDF cannot—and will never—track or access the content of the documents you use.
|
||||
cookieBanner.preferencesModal.description.3=Your privacy and trust are at the core of what we do.
|
||||
cookieBanner.preferencesModal.necessary.title.1=Strictly Necessary Cookies
|
||||
cookieBanner.preferencesModal.necessary.title.2=Always Enabled
|
||||
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.analytics.title=Analytics
|
||||
cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with.
|
||||
cookieBanner.preferencesModal.subtitle=Utilisation des cookies
|
||||
cookieBanner.preferencesModal.description.1=Stirling PDF utilise des cookies et des technologies similaires pour améliorer votre expérience et comprendre comment nos outils sont utilisés. Cela nous aide à améliorer les performances, développer les fonctionnalités qui vous tiennent à cœur et offrir un support continu.
|
||||
cookieBanner.preferencesModal.description.2=Stirling PDF ne peut pas — et ne pourra jamais — suivre ou accéder au contenu des documents que vous utilisez.
|
||||
cookieBanner.preferencesModal.description.3=Votre vie privée et votre confiance sont au cœur de notre démarche.
|
||||
cookieBanner.preferencesModal.necessary.title.1=Cookies strictement nécessaires
|
||||
cookieBanner.preferencesModal.necessary.title.2=Toujours activés
|
||||
cookieBanner.preferencesModal.necessary.description=Ces cookies sont essentiels au bon fonctionnement du site. Ils permettent des fonctionnalités de base comme la gestion de vos préférences de confidentialité, la connexion et le remplissage de formulaires — c'est pourquoi ils ne peuvent pas être désactivés.
|
||||
cookieBanner.preferencesModal.analytics.title=Analyse
|
||||
cookieBanner.preferencesModal.analytics.description=Ces cookies nous aident à comprendre comment nos outils sont utilisés, afin que nous puissions nous concentrer sur les fonctionnalités les plus appréciées par notre communauté. Soyez rassuré — Stirling PDF ne peut pas et ne suivra jamais le contenu des documents que vous utilisez.
|
||||
|
||||
#fakeScan
|
||||
fakeScan.title=Fake Scan
|
||||
fakeScan.header=Fake Scan
|
||||
fakeScan.description=Create a PDF that looks like it was scanned
|
||||
fakeScan.selectPDF=Select PDF:
|
||||
fakeScan.quality=Scan Quality
|
||||
fakeScan.quality.low=Low
|
||||
fakeScan.quality.medium=Medium
|
||||
fakeScan.quality.high=High
|
||||
fakeScan.rotation=Rotation Angle
|
||||
fakeScan.rotation.none=None
|
||||
fakeScan.rotation.slight=Slight
|
||||
fakeScan.rotation.moderate=Moderate
|
||||
fakeScan.rotation.severe=Severe
|
||||
fakeScan.submit=Create Fake Scan
|
||||
fakeScan.title=Fausse numérisation
|
||||
fakeScan.header=Fausse numérisation
|
||||
fakeScan.description=Créer un PDF qui ressemble à une numérisation
|
||||
fakeScan.selectPDF=Sélectionner un PDF :
|
||||
fakeScan.quality=Qualité de numérisation
|
||||
fakeScan.quality.low=Faible
|
||||
fakeScan.quality.medium=Moyenne
|
||||
fakeScan.quality.high=Élevée
|
||||
fakeScan.rotation=Angle de rotation
|
||||
fakeScan.rotation.none=Aucun
|
||||
fakeScan.rotation.slight=Léger
|
||||
fakeScan.rotation.moderate=Modéré
|
||||
fakeScan.rotation.severe=Sévère
|
||||
fakeScan.submit=Créer une fausse numérisation
|
||||
|
||||
#home.fakeScan
|
||||
home.fakeScan.title=Fake Scan
|
||||
home.fakeScan.desc=Create a PDF that looks like it was scanned
|
||||
fakeScan.tags=scan,simulate,realistic,convert
|
||||
home.fakeScan.title=Fausse numérisation
|
||||
home.fakeScan.desc=Créer un PDF qui ressemble à une numérisation
|
||||
fakeScan.tags=numérisation,simuler,réaliste,convertir,scan,simulate,realistic,convert
|
||||
|
||||
# FakeScan advanced settings (frontend)
|
||||
fakeScan.advancedSettings=Enable Advanced Scan Settings
|
||||
fakeScan.colorspace=Colorspace
|
||||
fakeScan.colorspace.grayscale=Grayscale
|
||||
fakeScan.colorspace.color=Color
|
||||
fakeScan.border=Border (px)
|
||||
fakeScan.rotate=Base Rotation (degrees)
|
||||
fakeScan.rotateVariance=Rotation Variance (degrees)
|
||||
fakeScan.brightness=Brightness
|
||||
fakeScan.contrast=Contrast
|
||||
fakeScan.blur=Blur
|
||||
fakeScan.noise=Noise
|
||||
fakeScan.yellowish=Yellowish (simulate old paper)
|
||||
fakeScan.resolution=Resolution (DPI)
|
||||
fakeScan.advancedSettings=Activer les paramètres de numérisation avancés
|
||||
fakeScan.colorspace=Espace colorimétrique
|
||||
fakeScan.colorspace.grayscale=Niveaux de gris
|
||||
fakeScan.colorspace.color=Couleur
|
||||
fakeScan.border=Bordure (px)
|
||||
fakeScan.rotate=Rotation de base (degrés)
|
||||
fakeScan.rotateVariance=Variance de rotation (degrés)
|
||||
fakeScan.brightness=Luminosité
|
||||
fakeScan.contrast=Contraste
|
||||
fakeScan.blur=Flou
|
||||
fakeScan.noise=Bruit
|
||||
fakeScan.yellowish=Jaunâtre (simuler du vieux papier)
|
||||
fakeScan.resolution=Résolution (DPI)
|
||||
|
||||
|
||||
# Table of Contents Feature
|
||||
home.editTableOfContents.title=Edit Table of Contents
|
||||
home.editTableOfContents.desc=Add or edit bookmarks and table of contents in PDF documents
|
||||
home.editTableOfContents.title=Modifier la table des matières
|
||||
home.editTableOfContents.desc=Ajouter ou modifier les signets et la table des matières dans les documents PDF
|
||||
|
||||
editTableOfContents.tags=bookmarks,toc,navigation,index,table of contents,chapters,sections,outline
|
||||
editTableOfContents.title=Edit Table of Contents
|
||||
editTableOfContents.header=Add or Edit PDF Table of Contents
|
||||
editTableOfContents.replaceExisting=Replace existing bookmarks (uncheck to append to existing)
|
||||
editTableOfContents.editorTitle=Bookmark Editor
|
||||
editTableOfContents.editorDesc=Add and arrange bookmarks below. Click + to add child bookmarks.
|
||||
editTableOfContents.addBookmark=Add New Bookmark
|
||||
editTableOfContents.desc.1=This tool allows you to add or edit the table of contents (bookmarks) in a PDF document.
|
||||
editTableOfContents.desc.2=You can create a hierarchical structure by adding child bookmarks to parent bookmarks.
|
||||
editTableOfContents.desc.3=Each bookmark requires a title and target page number.
|
||||
editTableOfContents.submit=Apply Table of Contents
|
||||
editTableOfContents.tags=signets,tdm,table des matières,chapitres,sections,plan,bookmarks,toc,navigation,index,table of contents,chapters,sections,outline
|
||||
editTableOfContents.title=Modifier la table des matières
|
||||
editTableOfContents.header=Ajouter ou modifier la table des matières PDF
|
||||
editTableOfContents.replaceExisting=Remplacer les signets existants (décocher pour ajouter aux existants)
|
||||
editTableOfContents.editorTitle=Éditeur de signets
|
||||
editTableOfContents.editorDesc=Ajoutez et organisez les signets ci-dessous. Cliquez sur + pour ajouter des signets enfants.
|
||||
editTableOfContents.addBookmark=Ajouter un nouveau signet
|
||||
editTableOfContents.desc.1=Cet outil vous permet d'ajouter ou de modifier la table des matières (signets) dans un document PDF.
|
||||
editTableOfContents.desc.2=Vous pouvez créer une structure hiérarchique en ajoutant des signets enfants à des signets parents.
|
||||
editTableOfContents.desc.3=Chaque signet nécessite un titre et un numéro de page cible.
|
||||
editTableOfContents.submit=Appliquer la table des matières
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Aibítir
|
||||
downloadPdf=Íoslódáil PDF
|
||||
text=Téacs
|
||||
font=Cló
|
||||
selectFillter=-- Roghnaigh --
|
||||
selectFilter=-- Roghnaigh --
|
||||
pageNum=Uimhir an Leathanaigh
|
||||
sizes.small=Beaga
|
||||
sizes.medium=Mheán
|
||||
sizes.large=Mór
|
||||
sizes.x-large=X-Mór
|
||||
error.pdfPassword=Tá pasfhocal ar an Doiciméad PDF agus níor soláthraíodh an pasfhocal nó bhí sé mícheart
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Scrios
|
||||
username=Ainm úsáideora
|
||||
password=Pasfhocal
|
||||
@@ -181,7 +242,6 @@ red=Dearg
|
||||
green=Glas
|
||||
blue=Gorm
|
||||
custom=Saincheaptha...
|
||||
WorkInProgess=Obair idir lámha, B’fhéidir nach n-oibreoidh sí nó nach mbeidh bugaí ann, Tuairiscigh aon fhadhbanna le do thoil!
|
||||
poweredBy=Cumhachtaithe ag
|
||||
yes=Tá
|
||||
no=Níl
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Cuir íomhá leis
|
||||
home.addImage.desc=Cuireann sé íomhá ar shuíomh socraithe ar an PDF
|
||||
addImage.tags=img, jpg, pictiúr, grianghraf
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Cuir Uisce leis
|
||||
home.watermark.desc=Cuir comhartha uisce saincheaptha le do dhoiciméad PDF.
|
||||
watermark.tags=Téacs, athrá, lipéad, úinéireacht, cóipcheart, trádmharc, img, jpg, pictiúr, grianghraf
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Gach Leathanach?
|
||||
addImage.upload=Cuir íomhá leis
|
||||
addImage.submit=Cuir íomhá leis
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Cumaisc
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Tarraing & Scaoil comhad PDF
|
||||
fileChooser.dragAndDropImage=Tarraing & Scaoil comhad Íomhá
|
||||
fileChooser.hoveredDragAndDrop=Tarraing agus scaoil comhad(í) anseo
|
||||
fileChooser.extractPDF=Ag Aistriú...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Eisiúintí
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=वर्णमाला
|
||||
downloadPdf=पीडीएफ डाउनलोड करें
|
||||
text=टेक्स्ट
|
||||
font=फ़ॉन्ट
|
||||
selectFillter=-- चुनें --
|
||||
selectFilter=-- चुनें --
|
||||
pageNum=पृष्ठ संख्या
|
||||
sizes.small=छोटा
|
||||
sizes.medium=मध्यम
|
||||
sizes.large=बड़ा
|
||||
sizes.x-large=बहुत बड़ा
|
||||
error.pdfPassword=पीडीएफ दस्तावेज़ पासवर्ड से सुरक्षित है और या तो पासवर्ड नहीं दिया गया था या गलत था
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=हटाएं
|
||||
username=उपयोगकर्ता नाम
|
||||
password=पासवर्ड
|
||||
@@ -181,7 +242,6 @@ red=लाल
|
||||
green=हरा
|
||||
blue=नीला
|
||||
custom=कस्टम...
|
||||
WorkInProgess=कार्य प्रगति पर है, काम नहीं कर सकता है या बग हो सकते हैं, कृपया किसी भी समस्या की रिपोर्ट करें!
|
||||
poweredBy=द्वारा संचालित
|
||||
yes=हाँ
|
||||
no=नहीं
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=छवि जोड़ें
|
||||
home.addImage.desc=PDF पर एक निर्धारित स्थान पर छवि जोड़ें
|
||||
addImage.tags=img,jpg,चित्र,फोटो
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=वॉटरमार्क जोड़ें
|
||||
home.watermark.desc=अपने PDF दस्तावेज में कस्टम वॉटरमार्क जोड़ें।
|
||||
watermark.tags=टेक्स्ट,दोहराव,लेबल,स्वयं,कॉपीराइट,ट्रेडमार्क,img,jpg,चित्र,फोटो
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=हर पृष्ठ?
|
||||
addImage.upload=छवि जोड़ें
|
||||
addImage.submit=छवि जोड़ें
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=मर्ज करें
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=PDF फ़ाइल खींचें और छो
|
||||
fileChooser.dragAndDropImage=छवि फ़ाइल खींचें और छोड़ें
|
||||
fileChooser.hoveredDragAndDrop=फ़ाइल(ें) यहाँ खींचें और छोड़ें
|
||||
fileChooser.extractPDF=निकालना...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=रिलीज़
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Abeceda
|
||||
downloadPdf=Preuzmi PDF
|
||||
text=Tekst
|
||||
font=Pismo
|
||||
selectFillter=-- Odaberi --
|
||||
selectFilter=-- Odaberi --
|
||||
pageNum=Broj stranice
|
||||
sizes.small=Malo
|
||||
sizes.medium=Srednje
|
||||
sizes.large=Veliko
|
||||
sizes.x-large=Jako veliko
|
||||
error.pdfPassword=PDF dokument je šifriran i zaporka nije dana ili je netočna
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Izbriši
|
||||
username=Korisničko ime
|
||||
password=Zaporka
|
||||
@@ -181,7 +242,6 @@ red=Crveno
|
||||
green=Zeleno
|
||||
blue=Plavo
|
||||
custom=Prilagođeno...
|
||||
WorkInProgess=Radovi u tijeku, u slučaju grešaka molimo prijavite probleme!
|
||||
poweredBy=Pokreće
|
||||
yes=Da
|
||||
no=Ne
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Dodaj sliku
|
||||
home.addImage.desc=Dodaje sliku na zadano mjesto u PDF-u
|
||||
addImage.tags=img,jpg,slika,foto
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Dodaj vodeni žig
|
||||
home.watermark.desc=DDodajte prilagođeni vodeni žig svom PDF dokumentu.
|
||||
watermark.tags=Tekst,ponavljanje,etiketa,vlastiti,autorsko pravo,zaštita, img,jpg,slika,foto
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Na svakoj stranici?
|
||||
addImage.upload=Dodaj sliku
|
||||
addImage.submit=Dodaj sliku
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Spajanje
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
||||
@@ -142,7 +142,7 @@ multiPdfPrompt=PDF-fájlok kiválasztása (2+)
|
||||
multiPdfDropPrompt=Válassza ki (vagy húzza ide) az összes szükséges PDF-fájlt
|
||||
imgPrompt=Kép kiválasztása
|
||||
genericSubmit=Küldés
|
||||
uploadLimit=Maximum file size:
|
||||
uploadLimit=Maximális fájlméret:
|
||||
uploadLimitExceededSingular=túl nagy. A maximálisan megengedett méret
|
||||
uploadLimitExceededPlural=túl nagyok. A maximálisan megengedett méretek
|
||||
processTimeWarning=Figyelmeztetés: A folyamat akár egy percig is eltarthat a fájlmérettől függően
|
||||
@@ -163,13 +163,74 @@ alphabet=ABC
|
||||
downloadPdf=PDF letöltése
|
||||
text=Szöveg
|
||||
font=Betűtípus
|
||||
selectFillter=-- Válasszon --
|
||||
selectFilter=-- Válasszon --
|
||||
pageNum=Oldalszám
|
||||
sizes.small=Kicsi
|
||||
sizes.medium=Közepes
|
||||
sizes.large=Nagy
|
||||
sizes.x-large=Extra nagy
|
||||
error.pdfPassword=A PDF-dokumentum jelszóval védett, és vagy nem adott meg jelszót, vagy helytelen jelszót adott meg
|
||||
error.pdfCorrupted=A PDF-fájl sérültnek vagy hibásnak tűnik. Mielőtt folytatná ezt a műveletet, próbálja meg először a 'PDF javítása' funkcióval kijavítani a fájlt.
|
||||
error.pdfCorruptedMultiple=Egy vagy több PDF-fájl sérültnek vagy hibásnak tűnik. Mielőtt megpróbálná egyesíteni őket, próbálja meg először a 'PDF javítása' funkciót használni minden fájlon.
|
||||
error.pdfCorruptedDuring=Hiba {0}: A PDF-fájl sérültnek vagy hibásnak tűnik. Mielőtt folytatná ezt a műveletet, próbálja meg először a 'PDF javítása' funkcióval kijavítani a fájlt.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=A(z) "{0}" PDF-fájl sérültnek tűnik, vagy érvénytelen szerkezetű. Kérjük, a folytatás előtt próbálja meg a 'PDF javítása' funkcióval kijavítani a fájlt.
|
||||
error.tryRepair=Próbálja meg a PDF javítása funkciót a sérült fájlok javításához.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=Úgy tűnik, a PDF titkosítási adatai sérültek. Ez akkor fordulhat elő, ha a PDF-et nem kompatibilis titkosítási módszerekkel hozták létre. Kérjük, először próbálja meg a 'PDF javítása' funkciót használni, vagy kérjen új másolatot a dokumentum készítőjétől.
|
||||
error.fileProcessing=Hiba történt a fájl feldolgozása közben a(z) {0} művelet során: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled=A(z) {0} nincs telepítve
|
||||
error.toolRequired=A(z) {0} szükséges a(z) {1} művelethez
|
||||
error.conversionFailed=A(z) {0} konvertálása sikertelen
|
||||
error.commandFailed=A(z) {0} parancs végrehajtása sikertelen
|
||||
error.algorithmNotAvailable=A(z) {0} algoritmus nem érhető el
|
||||
error.optionsNotSpecified=A(z) {0} beállítások nincsenek megadva
|
||||
error.fileFormatRequired=A fájlnak {0} formátumúnak kell lennie
|
||||
error.invalidFormat=Érvénytelen {0} formátum: {1}
|
||||
error.endpointDisabled=Ezt a végpontot a rendszergazda letiltotta
|
||||
error.urlNotReachable=Az URL nem érhető el, kérjük, adjon meg érvényes URL-t
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=A(z) {0} DPI érték meghaladja a(z) {1} biztonságos maximális határértéket. A magas DPI-értékek memóriaproblémákat és összeomlásokat okozhatnak. Kérjük, használjon alacsonyabb DPI-értéket.
|
||||
error.pageTooBigForDpi=A(z) {0} PDF-oldal túl nagy a(z) {1} DPI-vel való megjelenítéshez. Kérjük, próbáljon meg alacsonyabb DPI-értéket (ajánlott: 150 vagy kevesebb).
|
||||
error.pageTooBigExceedsArray=A(z) {0} PDF-oldal túl nagy a(z) {1} DPI-vel való megjelenítéshez. Az eredményül kapott kép meghaladná a Java maximális tömbméretét. Kérjük, próbáljon meg alacsonyabb DPI-értéket (ajánlott: 150 vagy kevesebb).
|
||||
error.pageTooBigFor300Dpi=A(z) {0} PDF-oldal túl nagy a 300 DPI-vel való megjelenítéshez. Az eredményül kapott kép meghaladná a Java maximális tömbméretét. Kérjük, használjon alacsonyabb DPI-értéket a PDF-kép konverzióhoz.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=Az API-kulcs érvénytelen.
|
||||
error.userNotFound=A felhasználó nem található.
|
||||
error.passwordRequired=A jelszó nem lehet üres.
|
||||
error.accountLocked=Fiókját zároltuk a túl sok sikertelen bejelentkezési kísérlet miatt.
|
||||
error.invalidEmail=Érvénytelen e-mail címek.
|
||||
error.emailAttachmentRequired=Az e-mail küldéséhez csatolmány szükséges.
|
||||
error.signatureNotFound=Az aláírásfájl nem található.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=A fájl nem található azonosítóval: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=Nem találhatóak biztonsági mentési szkriptek.
|
||||
error.unsupportedProvider=A(z) {0} jelenleg nem támogatott.
|
||||
error.pathTraversalDetected=Útvonal-bejárási kísérlet észlelve biztonsági okokból.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Érvénytelen argumentum: {0}
|
||||
error.argumentRequired=A(z) {0} nem lehet üres
|
||||
error.operationFailed=A művelet sikertelen: {0}
|
||||
error.angleNotMultipleOf90=A szögnek 90-nel oszthatónak kell lennie
|
||||
error.pdfBookmarksNotFound=Nem található PDF-könyvjelző/vázlat a dokumentumban
|
||||
error.fontLoadingFailed=Hiba a betűtípusfájl feldolgozása közben
|
||||
error.fontDirectoryReadFailed=Nem sikerült beolvasni a betűtípus-könyvtárat
|
||||
delete=Törlés
|
||||
username=Felhasználónév
|
||||
password=Jelszó
|
||||
@@ -181,7 +242,6 @@ red=Piros
|
||||
green=Zöld
|
||||
blue=Kék
|
||||
custom=Egyéni...
|
||||
WorkInProgess=Fejlesztés alatt álló funkció, hibák előfordulhatnak. Kérjük, jelezze a problémákat!
|
||||
poweredBy=Üzemelteti:
|
||||
yes=Igen
|
||||
no=Nem
|
||||
@@ -200,7 +260,7 @@ disabledCurrentUserMessage=A jelenlegi felhasználó nem tiltható le
|
||||
downgradeCurrentUserLongMessage=A jelenlegi felhasználó jogosultsági szintje nem csökkenthető. Ezért a jelenlegi felhasználó nem jelenik meg.
|
||||
userAlreadyExistsOAuthMessage=A felhasználó már létezik OAuth2 felhasználóként.
|
||||
userAlreadyExistsWebMessage=A felhasználó már létezik webes felhasználóként.
|
||||
invalidRoleMessage=Invalid role.
|
||||
invalidRoleMessage=Érvénytelen szerepkör.
|
||||
error=Hiba
|
||||
oops=Hoppá!
|
||||
help=Súgó
|
||||
@@ -213,7 +273,7 @@ color=Szín
|
||||
sponsor=Támogató
|
||||
info=Információ
|
||||
pro=Pro
|
||||
proFeatures=Pro Features
|
||||
proFeatures=Pro Funkciók
|
||||
page=Oldal
|
||||
pages=Oldal
|
||||
loading=Betöltés...
|
||||
@@ -267,7 +327,7 @@ enterpriseEdition.button=Váltás Pro verzióra
|
||||
enterpriseEdition.warning=Ez a funkció csak Pro felhasználók számára érhető el.
|
||||
enterpriseEdition.yamlAdvert=A Stirling PDF Pro támogatja a YAML konfigurációs fájlokat és egyéb SSO funkciókat.
|
||||
enterpriseEdition.ssoAdvert=Több felhasználókezelési funkcióra van szüksége? Tekintse meg a Stirling PDF Pro verzióját!
|
||||
enterpriseEdition.proTeamFeatureDisabled=Team management features require a Pro licence or higher
|
||||
enterpriseEdition.proTeamFeatureDisabled=A csapatkezelési funkciókhoz Pro licenc vagy magasabb szintű licenc szükséges
|
||||
|
||||
|
||||
#################
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Kép hozzáadása
|
||||
home.addImage.desc=Kép hozzáadása a PDF megadott helyére
|
||||
addImage.tags=kép,jpg,fotó,fénykép
|
||||
|
||||
home.attachments.title=Csatolmányok hozzáadása a PDF-hez
|
||||
home.attachments.desc=Csatolmányok (beágyazott fájlok) hozzáadása vagy eltávolítása a PDF-ből
|
||||
attachments.tags=beágyazás,csatolás,fájl,csatolmány,csatolmányok
|
||||
|
||||
home.watermark.title=Vízjel hozzáadása
|
||||
home.watermark.desc=Egyedi vízjel hozzáadása PDF dokumentumhoz
|
||||
watermark.tags=Szöveg,ismétlődő,címke,egyedi,szerzői jog,védjegy,kép,jpg,fotó,fénykép
|
||||
@@ -676,7 +740,7 @@ home.HTMLToPDF.desc=HTML fájl vagy ZIP konvertálása PDF-be
|
||||
HTMLToPDF.tags=jelölőnyelv,webtartalom,átalakítás,konvertálás
|
||||
|
||||
#eml-to-pdf
|
||||
home.EMLToPDF.title=E-mail PDF-be
|
||||
home.EMLToPDF.title=E-mail konvertálása PDF-be
|
||||
home.EMLToPDF.desc=E-mail (EML) fájlok konvertálása PDF formátumba, beleértve a fejléceket, törzset és beágyazott képeket
|
||||
EMLToPDF.tags=e-mail,konverzió,eml,üzenet,átalakítás,konvertálás,levél
|
||||
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Minden oldalra?
|
||||
addImage.upload=Kép hozzáadása
|
||||
addImage.submit=Kép hozzáadása
|
||||
|
||||
#attachments
|
||||
attachments.title=Mellékletek hozzáadása
|
||||
attachments.header=Mellékletek hozzáadása
|
||||
attachments.description=Lehetővé teszi mellékletek hozzáadását a PDF-hez
|
||||
attachments.descriptionPlaceholder=Adjon meg egy leírást a mellékletekhez...
|
||||
attachments.addButton=Mellékletek hozzáadása
|
||||
|
||||
#merge
|
||||
merge.title=Egyesítés
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Húzza ide a PDF fájlt
|
||||
fileChooser.dragAndDropImage=Húzza ide a képfájlt
|
||||
fileChooser.hoveredDragAndDrop=Húzza ide a fájl(oka)t
|
||||
fileChooser.extractPDF=Kinyerés...
|
||||
fileChooser.addAttachments=Húzza ide a csatolmányokat
|
||||
|
||||
#release notes
|
||||
releases.footer=Kiadási jegyzék
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Abjad
|
||||
downloadPdf=Unduh PDF
|
||||
text=Teks
|
||||
font=Jenis huruf
|
||||
selectFillter=-- Pilih --
|
||||
selectFilter=-- Pilih --
|
||||
pageNum=Nomor Halaman
|
||||
sizes.small=Kecil
|
||||
sizes.medium=Sedang
|
||||
sizes.large=Besar
|
||||
sizes.x-large=Sangat Besar
|
||||
error.pdfPassword=Dokumen PDF disandikan dan kata sandi tidak diberikan atau kata sandi salah
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Hapus
|
||||
username=Nama pengguna
|
||||
password=Kata sandi
|
||||
@@ -181,7 +242,6 @@ red=Merah
|
||||
green=Hijau
|
||||
blue=Biru
|
||||
custom=Kustom...
|
||||
WorkInProgess=Pekerjaan sedang diproses, Mungkin tidak berfungsi atau terdapat kutu, Silakan laporkan masalah apa pun!
|
||||
poweredBy=Ditenagai oleh
|
||||
yes=Ya
|
||||
no=Tidak
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Tambahkan gambar
|
||||
home.addImage.desc=Menambahkan gambar ke lokasi yang ditentukan pada PDF
|
||||
addImage.tags=img,jpg,gambar,foto
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Tambahkan watermark
|
||||
home.watermark.desc=Menambahkan watermark khusus ke dokumen PDF Anda.
|
||||
watermark.tags=Teks,berulang,label,sendiri,hak cipta,watermark,img,jpg,picture,photo
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Setiap Halaman?
|
||||
addImage.upload=Tambahkan Gambar
|
||||
addImage.submit=Tambahkan Gambar
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Gabungkan
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Alfabeto
|
||||
downloadPdf=Scarica PDF
|
||||
text=Testo
|
||||
font=Font
|
||||
selectFillter=-- Seleziona --
|
||||
selectFilter=-- Seleziona --
|
||||
pageNum=Numero pagina
|
||||
sizes.small=Piccolo
|
||||
sizes.medium=Medio
|
||||
sizes.large=Grande
|
||||
sizes.x-large=Extra-Large
|
||||
error.pdfPassword=Il documento PDF è protetto da password e la password non è stata fornita oppure non era corretta
|
||||
error.pdfCorrupted=Il file PDF sembra corrotto o danneggiato. Prova a utilizzare la funzione "Ripara PDF" per riparare il file prima di procedere con questa operazione.
|
||||
error.pdfCorruptedMultiple=Uno o più file PDF sembrano corrotti o danneggiati. Prova a utilizzare la funzione 'Ripara PDF' su ciascun file prima di tentare di unirli.
|
||||
error.pdfCorruptedDuring=Errore {0}: il file PDF sembra essere corrotto o danneggiato. Provare a utilizzare la funzione 'Ripara PDF' per riparare il file prima di procedere con questa operazione.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=Il file PDF "{0}" sembra essere danneggiato o ha una struttura non valida. Prova a utilizzare la funzione 'Ripara PDF' per correggere il file prima di procedere.
|
||||
error.tryRepair=Prova a utilizzare la funzionalità Ripara PDF per riparare i file danneggiati.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=Il PDF sembra contenere dati di crittografia danneggiati. Questo può accadere quando il PDF è stato creato con metodi di crittografia incompatibili. Prova prima a utilizzare la funzione 'Ripara PDF' o contatta l'autore del documento per ottenere una nuova copia.
|
||||
error.fileProcessing=Si è verificato un errore durante l'elaborazione del file durante l'operazione {0}: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} non è installato
|
||||
error.toolRequired={0} è richiesto per {1}
|
||||
error.conversionFailed={0} conversione fallita
|
||||
error.commandFailed={0} comando fallito
|
||||
error.algorithmNotAvailable={0} algoritmo non disponibile
|
||||
error.optionsNotSpecified={0} le opzioni non sono specificate
|
||||
error.fileFormatRequired=Il file deve essere nel formato {0}
|
||||
error.invalidFormat=Formato {0} non valido:{1}
|
||||
error.endpointDisabled=Questo endpoint è stato disabilitato dall'amministratore
|
||||
error.urlNotReachable=L'URL non è raggiungibile, inserisci un URL valido
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=Il valore DPI {0} supera il limite massimo di sicurezza di {1}. Valori DPI elevati possono causare problemi di memoria e arresti anomali. Utilizzare un valore DPI inferiore.
|
||||
error.pageTooBigForDpi=La pagina PDF {0} è troppo grande per essere visualizzata a {1} DPI. Prova un valore DPI inferiore (consigliato: 150 o inferiore).
|
||||
error.pageTooBigExceedsArray=La pagina PDF {0} è troppo grande per essere visualizzata a {1} DPI. L'immagine risultante supererebbe la dimensione massima dell'array Java. Prova un valore DPI inferiore (consigliato: 150 o inferiore).
|
||||
error.pageTooBigFor300Dpi=La pagina PDF {0} è troppo grande per essere renderizzata a 300 DPI. L'immagine risultante supererebbe la dimensione massima dell'array Java. Utilizzare un valore DPI inferiore per la conversione da PDF a immagine.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=La chiave API non è valida.
|
||||
error.userNotFound=Utente non trovato.
|
||||
error.passwordRequired=La password non deve essere nulla.
|
||||
error.accountLocked=Il tuo account è stato bloccato a causa di troppi tentativi di accesso non riusciti.
|
||||
error.invalidEmail=Indirizzi email non validi forniti.
|
||||
error.emailAttachmentRequired=Per inviare l'email è necessario un allegato.
|
||||
error.signatureNotFound=File della firma non trovato.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File non trovato con ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=Non sono stati trovati script di backup.
|
||||
error.unsupportedProvider={0} non è attualmente supportato.
|
||||
error.pathTraversalDetected=Per motivi di sicurezza è stato rilevato un attraversamento del percorso.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Argomento non valido: {0}
|
||||
error.argumentRequired={0} non deve essere nullo
|
||||
error.operationFailed=Operazione fallita: {0}
|
||||
error.angleNotMultipleOf90=L'angolo deve essere un multiplo di 90
|
||||
error.pdfBookmarksNotFound=Nessun segnalibro/schema PDF trovato nel documento
|
||||
error.fontLoadingFailed=Errore durante l'elaborazione del font file
|
||||
error.fontDirectoryReadFailed=Impossibile leggere la directory dei font
|
||||
delete=Elimina
|
||||
username=Nome utente
|
||||
password=Password
|
||||
@@ -181,7 +242,6 @@ red=Rosso
|
||||
green=Verde
|
||||
blue=Blu
|
||||
custom=Personalizzato
|
||||
WorkInProgess=Lavori in corso, potrebbe non funzionare o essere difettoso, segnalare eventuali problemi!
|
||||
poweredBy=Alimentato da
|
||||
yes=Si
|
||||
no=No
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Aggiungi Immagine
|
||||
home.addImage.desc=Aggiungi un'immagine in un punto specifico del PDF (Lavori in corso)
|
||||
addImage.tags=img,jpg,immagine,foto
|
||||
|
||||
home.attachments.title=Aggiungi allegati
|
||||
home.attachments.desc=Aggiungere o rimuovere file incorporati (allegati) da/a un PDF
|
||||
attachments.tags=incorporare,allegare,file,allegato,allegati
|
||||
|
||||
home.watermark.title=Aggiungi Filigrana
|
||||
home.watermark.desc=Aggiungi una filigrana al tuo PDF.
|
||||
watermark.tags=Testo,ripetizione,etichetta,proprio,copyright,marchio,img,jpg,immagine,foto
|
||||
@@ -1199,12 +1263,18 @@ compress.submit=Comprimi
|
||||
|
||||
|
||||
#Add image
|
||||
addImage.title=Aggiungi Immagine
|
||||
addImage.title=Aggiungere Immagine
|
||||
addImage.header=Aggiungi un'immagine ad un PDF
|
||||
addImage.everyPage=Ogni pagina?
|
||||
addImage.upload=Aggiungi immagine
|
||||
addImage.submit=Aggiungi immagine
|
||||
|
||||
#attachments
|
||||
attachments.title=Aggiungere allegati
|
||||
attachments.header=Aggiungi allegati
|
||||
attachments.description=Consente di aggiungere allegati al PDF
|
||||
attachments.descriptionPlaceholder=Inserisci una descrizione per gli allegati...
|
||||
attachments.addButton=Aggiungi allegati
|
||||
|
||||
#merge
|
||||
merge.title=Unisci
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Trascina & rilascia il file PDF
|
||||
fileChooser.dragAndDropImage=Trascina & rilascia il file immagine
|
||||
fileChooser.hoveredDragAndDrop=Trascina & rilascia i file qui
|
||||
fileChooser.extractPDF=Estraendo...
|
||||
fileChooser.addAttachments=trascina & rilascia gli allegati qui
|
||||
|
||||
#release notes
|
||||
releases.footer=Rilasci
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -163,13 +163,74 @@ alphabet=알파벳
|
||||
downloadPdf=PDF 다운로드
|
||||
text=텍스트
|
||||
font=글꼴
|
||||
selectFillter=-- 선택 --
|
||||
selectFilter=-- 선택 --
|
||||
pageNum=페이지 번호
|
||||
sizes.small=작게
|
||||
sizes.medium=중간
|
||||
sizes.large=크게
|
||||
sizes.x-large=매우 크게
|
||||
error.pdfPassword=PDF 문서가 비밀번호로 보호되어 있으며, 비밀번호가 제공되지 않았거나 올바르지 않습니다
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=삭제
|
||||
username=사용자 이름
|
||||
password=비밀번호
|
||||
@@ -181,7 +242,6 @@ red=빨강
|
||||
green=초록
|
||||
blue=파랑
|
||||
custom=사용자 지정...
|
||||
WorkInProgess=작업 진행 중, 작동하지 않거나 버그가 있을 수 있습니다. 문제가 있으면 신고해 주세요!
|
||||
poweredBy=제공
|
||||
yes=예
|
||||
no=아니오
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=이미지 추가
|
||||
home.addImage.desc=PDF의 지정된 위치에 이미지 추가
|
||||
addImage.tags=이미지,jpg,사진
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=워터마크 추가
|
||||
home.watermark.desc=PDF 문서에 사용자 지정 워터마크를 추가합니다.
|
||||
watermark.tags=텍스트,반복,레이블,소유,저작권,상표,이미지,jpg,사진
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=모든 페이지?
|
||||
addImage.upload=이미지 추가
|
||||
addImage.submit=이미지 추가
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=병합
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=PDF 파일을 드래그 앤 드롭
|
||||
fileChooser.dragAndDropImage=이미지 파일을 드래그 앤 드롭
|
||||
fileChooser.hoveredDragAndDrop=여기에 파일을 드래그 앤 드롭하세요
|
||||
fileChooser.extractPDF=추출 중...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=릴리스
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=അക്ഷരമാല
|
||||
downloadPdf=PDF ഡൗൺലോഡ് ചെയ്യുക
|
||||
text=ടെക്സ്റ്റ്
|
||||
font=അക്ഷരം
|
||||
selectFillter=-- തിരഞ്ഞെടുക്കുക --
|
||||
selectFilter=-- തിരഞ്ഞെടുക്കുക --
|
||||
pageNum=പേജ് നമ്പർ
|
||||
sizes.small=ചെറുത്
|
||||
sizes.medium=ഇടത്തരം
|
||||
sizes.large=വലുത്
|
||||
sizes.x-large=കൂടുതൽ വലുത്
|
||||
error.pdfPassword=PDF ഡോക്യുമെന്റ് പാസ്വേഡ് ഉപയോഗിച്ച് സംരക്ഷിച്ചിരിക്കുന്നു, പാസ്വേഡ് നൽകിയിട്ടില്ല അല്ലെങ്കിൽ തെറ്റായിരുന്നു
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=മായ്ക്കുക
|
||||
username=ഉപയോക്തൃനാമം
|
||||
password=പാസ്വേഡ്
|
||||
@@ -181,7 +242,6 @@ red=ചുവപ്പ്
|
||||
green=പച്ച
|
||||
blue=നീല
|
||||
custom=ഇഷ്ടാനുസൃതം...
|
||||
WorkInProgess=നിർമ്മാണത്തിലിരിക്കുന്നു, ശരിയായി പ്രവർത്തിച്ചേക്കില്ല അല്ലെങ്കിൽ ബഗ്ഗുകൾ ഉണ്ടാകാം, ദയവായി പ്രശ്നങ്ങൾ അറിയിക്കുക!
|
||||
poweredBy=സഹായത്തോടെ
|
||||
yes=അതെ
|
||||
no=ഇല്ല
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=ചിത്രം ചേർക്കുക
|
||||
home.addImage.desc=PDF-ൽ ഒരു നിശ്ചിത സ്ഥാനത്ത് ഒരു ചിത്രം ചേർക്കുന്നു
|
||||
addImage.tags=img,jpg,ചിത്രം,ഫോട്ടോ
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=വാട്ടർമാർക്ക് ചേർക്കുക
|
||||
home.watermark.desc=നിങ്ങളുടെ PDF പ്രമാണത്തിലേക്ക് ഒരു ഇഷ്ടാനുസൃത വാട്ടർമാർക്ക് ചേർക്കുക.
|
||||
watermark.tags=ടെക്സ്റ്റ്,ആവർത്തിക്കുന്ന,ലേബൽ,സ്വന്തം,പകർപ്പവകാശം,വ്യാപാരമുദ്ര,img,jpg,ചിത്രം,ഫോട്ടോ
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=എല്ലാ പേജിലും?
|
||||
addImage.upload=ചിത്രം ചേർക്കുക
|
||||
addImage.submit=ചിത്രം ചേർക്കുക
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=ലയിപ്പിക്കുക
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=PDF ഫയൽ വലിച്ചിടുക
|
||||
fileChooser.dragAndDropImage=ചിത്ര ഫയൽ വലിച്ചിടുക
|
||||
fileChooser.hoveredDragAndDrop=ഫയൽ(കൾ) ഇവിടെ വലിച്ചിടുക
|
||||
fileChooser.extractPDF=വേർതിരിച്ചെടുക്കുന്നു...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=റിലീസുകൾ
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Alfabet
|
||||
downloadPdf=PDF downloaden
|
||||
text=Tekst
|
||||
font=Lettertype
|
||||
selectFillter=-- Selecteer --
|
||||
selectFilter=-- Selecteer --
|
||||
pageNum=Paginanummer
|
||||
sizes.small=Klein
|
||||
sizes.medium=Gemiddeld
|
||||
sizes.large=Groot
|
||||
sizes.x-large=Extra groot
|
||||
error.pdfPassword=Het PDF document is beveiligd met een wachtwoord en het wachtwoord is niet ingevoerd of is onjuist
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Verwijderen
|
||||
username=Gebruikersnaam
|
||||
password=Wachtwoord
|
||||
@@ -181,7 +242,6 @@ red=Rood
|
||||
green=Groen
|
||||
blue=Blauw
|
||||
custom=Aangepast...
|
||||
WorkInProgess=Werk in uitvoering. Werkt mogelijk niet of bevat fouten. Meld eventuele problemen!
|
||||
poweredBy=Mogelijk gemaakt door
|
||||
yes=Ja
|
||||
no=Nee
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Afbeelding toevoegen
|
||||
home.addImage.desc=Voegt een afbeelding toe op een specifieke locatie in de PDF
|
||||
addImage.tags=img,jpg,foto
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Watermerk toevoegen
|
||||
home.watermark.desc=Voeg een aangepast watermerk toe aan je PDF-document.
|
||||
watermark.tags=Tekst,herhalend,label,eigen,copyright,handelsmerk,img,jpg,foto
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Elke pagina?
|
||||
addImage.upload=Afbeelding toevoegen
|
||||
addImage.submit=Afbeelding toevoegen
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Samenvoegen
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Alfabet
|
||||
downloadPdf=Last ned PDF
|
||||
text=Tekst
|
||||
font=Skrifttype
|
||||
selectFillter=-- Velg --
|
||||
selectFilter=-- Velg --
|
||||
pageNum=Sidenummer
|
||||
sizes.small=Liten
|
||||
sizes.medium=Middels
|
||||
sizes.large=Stor
|
||||
sizes.x-large=Ekstra Stor
|
||||
error.pdfPassword=PDF-dokumentet er passordbeskyttet og enten ble passordet ikke oppgitt eller var feil
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Slett
|
||||
username=Brukernavn
|
||||
password=Passord
|
||||
@@ -181,7 +242,6 @@ red=Rød
|
||||
green=Grønn
|
||||
blue=Blå
|
||||
custom=Tilpasset...
|
||||
WorkInProgess=Arbeid pågår, Kan være feil eller buggy, Vennligst rapporter eventuelle problemer!
|
||||
poweredBy=Drevet av
|
||||
yes=Ja
|
||||
no=Nei
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Legg til bilde
|
||||
home.addImage.desc=Legger til et bilde på en angitt plassering i PDF-en
|
||||
addImage.tags=bilde,jpg,foto
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Legg til Vannmerke
|
||||
home.watermark.desc=Legg til et tilpasset vannmerke i din PDF-dokument.
|
||||
watermark.tags=tekst,gjentakende,etikett,egen,opphavsrett,varemerke,bilde,jpg,foto
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=På hver side?
|
||||
addImage.upload=Legg til bilde
|
||||
addImage.submit=Legg til bilde
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Slå sammen
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Versjoner
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Alfabet
|
||||
downloadPdf=Pobierz PDF
|
||||
text=Tekst
|
||||
font=Czcionka
|
||||
selectFillter=-- Wybierz --
|
||||
selectFilter=-- Wybierz --
|
||||
pageNum=Numer strony
|
||||
sizes.small=mniejszy
|
||||
sizes.medium=średni
|
||||
sizes.large=duży
|
||||
sizes.x-large=bardzo duży
|
||||
error.pdfPassword=Dokument PDF jest zabezpieczony hasłem, musisz podać prawidłowe hasło.
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=usuń
|
||||
username=nazwa użytkownika
|
||||
password=hasło
|
||||
@@ -181,7 +242,6 @@ red=czerwony
|
||||
green=zielony
|
||||
blue=niebieski
|
||||
custom=Własny...
|
||||
WorkInProgess=Praca w toku, proszę zgłaszać błędy!
|
||||
poweredBy=Zasilany
|
||||
yes=tak
|
||||
no=nie
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Dodaj obraz
|
||||
home.addImage.desc=Dodaje obraz w wybranym miejscu w dokumencie PDF
|
||||
addImage.tags=img,jpg,obraz,zdjęcie
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Dodaj znak wodny
|
||||
home.watermark.desc=Dodaj niestandardowy znak wodny do dokumentu PDF.
|
||||
watermark.tags=Tekst,powtarzanie,etykieta,własne,prawa autorskie,znak wodny,img,jpg,obraz,zdjęcie
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Każda strona?
|
||||
addImage.upload=Dodaj obraz
|
||||
addImage.submit=Dodaj obraz
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Połącz
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Przeciągnij i upuść plik PDF
|
||||
fileChooser.dragAndDropImage=Przeciągnij i upuść plik obrazu
|
||||
fileChooser.hoveredDragAndDrop=Przeciągnij i upuść plik(i) tutaj
|
||||
fileChooser.extractPDF=Trwa wyodrębnianie...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Wydania
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Alfabeto
|
||||
downloadPdf=Baixar PDF
|
||||
text=Texto
|
||||
font=Fonte
|
||||
selectFillter=-- Selecione --
|
||||
selectFilter=-- Selecione --
|
||||
pageNum=Número da Página
|
||||
sizes.small=Pequeno
|
||||
sizes.medium=Médio
|
||||
sizes.large=Grande
|
||||
sizes.x-large=Extra grande
|
||||
error.pdfPassword=O PDF está protegido por senha e a senha não foi fornecida ou está incorreta
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Apagar
|
||||
username=Usuário
|
||||
password=Senha
|
||||
@@ -181,7 +242,6 @@ red=Vermelho
|
||||
green=Verde
|
||||
blue=Azul
|
||||
custom=Personalizado...
|
||||
WorkInProgess=Trabalho em progresso, talvez não funcione ou apresente erros, Por favor, reporte qualquer problema!
|
||||
poweredBy=Distribuído por
|
||||
yes=Sim
|
||||
no=Não
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Adicionar Imagem
|
||||
home.addImage.desc=Adicionar imagens em um local definido no PDF.
|
||||
addImage.tags=img,jpg,imagem,foto
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Adicionar Marca d'água
|
||||
home.watermark.desc=Adicionar uma marca d'água personalizada ao seu PDF.
|
||||
watermark.tags=Texto,repetindo,rótulo,próprio,direitos autorais,marca registrada,img,jpg,imagem,foto
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Para cada página?
|
||||
addImage.upload=Carregar imagem
|
||||
addImage.submit=Adicionar imagem
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Mesclar
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Arraste & Solte PDF(s)
|
||||
fileChooser.dragAndDropImage=Arraste & Solte Imagem(ns)
|
||||
fileChooser.hoveredDragAndDrop=Arraste & Solte arquivo(s) aqui
|
||||
fileChooser.extractPDF=Extraindo...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Versões
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Alfabeto
|
||||
downloadPdf=Transferir PDF
|
||||
text=Texto
|
||||
font=Tipo de letra
|
||||
selectFillter=-- Selecionar --
|
||||
selectFilter=-- Selecionar --
|
||||
pageNum=Número da Página
|
||||
sizes.small=Pequeno
|
||||
sizes.medium=Médio
|
||||
sizes.large=Grande
|
||||
sizes.x-large=Extra Grande
|
||||
error.pdfPassword=O documento PDF está protegido por palavra-passe e ou não foi fornecida ou está incorreta
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Eliminar
|
||||
username=Nome de utilizador
|
||||
password=Palavra-passe
|
||||
@@ -181,7 +242,6 @@ red=Vermelho
|
||||
green=Verde
|
||||
blue=Azul
|
||||
custom=Personalizar...
|
||||
WorkInProgess=Trabalho em progresso, pode não funcionar ou ter erros, Por favor reporte quaisquer problemas!
|
||||
poweredBy=Desenvolvido por
|
||||
yes=Sim
|
||||
no=Não
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Adicionar imagem
|
||||
home.addImage.desc=Adiciona uma imagem numa localização definida no PDF
|
||||
addImage.tags=img,jpg,imagem,foto
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Adicionar Marca de Água
|
||||
home.watermark.desc=Adicionar uma marca de água personalizada ao seu documento PDF.
|
||||
watermark.tags=Texto,repetindo,etiqueta,próprio,copyright,marca registada,img,jpg,imagem,foto
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Todas as Páginas?
|
||||
addImage.upload=Adicionar imagem
|
||||
addImage.submit=Adicionar imagem
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Juntar
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Arrastar e Largar ficheiro PDF
|
||||
fileChooser.dragAndDropImage=Arrastar e Largar ficheiro de Imagem
|
||||
fileChooser.hoveredDragAndDrop=Arrastar e Largar ficheiro(s) aqui
|
||||
fileChooser.extractPDF=Extraindo...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Lançamentos
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Alfabet
|
||||
downloadPdf=Descarcă PDF
|
||||
text=Text
|
||||
font=Font
|
||||
selectFillter=-- Selectează --
|
||||
selectFilter=-- Selectează --
|
||||
pageNum=Numărul paginii
|
||||
sizes.small=Mic
|
||||
sizes.medium=Mediu
|
||||
sizes.large=Mare
|
||||
sizes.x-large=Foarte Mare
|
||||
error.pdfPassword=Documentul PDF este protejat cu parolă și fie parola nu a fost furnizată, fie a fost incorectă
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Șterge
|
||||
username=Nume de utilizator
|
||||
password=Parolă
|
||||
@@ -181,7 +242,6 @@ red=Roșu
|
||||
green=Verde
|
||||
blue=Albastru
|
||||
custom=Personalizat...
|
||||
WorkInProgess=Lucru în curs, S-ar putea să nu funcționeze sau să aibă erori, Vă rugăm să raportați orice probleme!
|
||||
poweredBy=Propulsat de
|
||||
yes=Da
|
||||
no=Nu
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Adaugă imagine
|
||||
home.addImage.desc=Adaugă o imagine într-o locație specifică pe PDF (în curs de dezvoltare)
|
||||
addImage.tags=img,jpg,poză,fotografie
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Adaugă Filigran
|
||||
home.watermark.desc=Adaugă un filigran personalizat la documentul PDF.
|
||||
watermark.tags=Text,repetitiv,etichetă,propriu,drepturi de autor,marcă comercială,img,jpg,poză,fotografie
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Pe fiecare pagină?
|
||||
addImage.upload=Adăugare imagine
|
||||
addImage.submit=Adăugare imagine
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Unire
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Алфавит
|
||||
downloadPdf=Скачать PDF
|
||||
text=Текст
|
||||
font=Шрифт
|
||||
selectFillter=-- Выбрать --
|
||||
selectFilter=-- Выбрать --
|
||||
pageNum=Номер страницы
|
||||
sizes.small=Малый
|
||||
sizes.medium=Средний
|
||||
sizes.large=Большой
|
||||
sizes.x-large=Очень большой
|
||||
error.pdfPassword=PDF-документ защищен паролем, и пароль не был предоставлен или был неверным
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Удалить
|
||||
username=Имя пользователя
|
||||
password=Пароль
|
||||
@@ -181,7 +242,6 @@ red=Красный
|
||||
green=Зеленый
|
||||
blue=Синий
|
||||
custom=Пользовательский...
|
||||
WorkInProgess=В разработке, возможны ошибки и сбои, пожалуйста, сообщайте о любых проблемах!
|
||||
poweredBy=Работает на
|
||||
yes=Да
|
||||
no=Нет
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Добавить изображение
|
||||
home.addImage.desc=Добавляет изображение в указанное место PDF
|
||||
addImage.tags=изображение,jpg,картинка,фото
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Добавить водяной знак
|
||||
home.watermark.desc=Добавьте собственный водяной знак в ваш PDF-документ.
|
||||
watermark.tags=текст,повторяющийся,метка,собственный,авторское право,торговая марка,изображение,jpg,картинка,фото
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Каждая страница?
|
||||
addImage.upload=Добавить изображение
|
||||
addImage.submit=Добавить изображение
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Объединить
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Перетащите PDF-файл
|
||||
fileChooser.dragAndDropImage=Перетащите файл изображения
|
||||
fileChooser.hoveredDragAndDrop=Перетащите файл(ы) сюда
|
||||
fileChooser.extractPDF=Извлечение...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Релизы
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Abeceda
|
||||
downloadPdf=Stiahnuť PDF
|
||||
text=Text
|
||||
font=Font
|
||||
selectFillter=-- Vyberte --
|
||||
selectFilter=-- Vyberte --
|
||||
pageNum=Číslo stránky
|
||||
sizes.small=Malé
|
||||
sizes.medium=Stredné
|
||||
sizes.large=Veľké
|
||||
sizes.x-large=Veľmi veľké
|
||||
error.pdfPassword=PDF dokument je chránený heslom a buď heslo nebolo zadané, alebo bolo nesprávne
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Vymazať
|
||||
username=Používateľské meno
|
||||
password=Heslo
|
||||
@@ -181,7 +242,6 @@ red=Červená
|
||||
green=Zelená
|
||||
blue=Modrá
|
||||
custom=Vlastné...
|
||||
WorkInProgess=Práca prebieha, nemusí fungovať alebo môže byť chybová, prosím nahláste akékoľvek problémy!
|
||||
poweredBy=Poskytované
|
||||
yes=Áno
|
||||
no=Nie
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Pridať obrázok
|
||||
home.addImage.desc=Pridať obrázok na zadané miesto v PDF
|
||||
addImage.tags=img,jpg,obrázok,fotografia
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Pridať vodotlač
|
||||
home.watermark.desc=Pridať vlastnú vodotlač do vášho PDF dokumentu.
|
||||
watermark.tags=Text,opakujúci sa,označenie,vlastné,autorské práva,ochranná známka,img,jpg,obrázok,fotografia
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Každá stránka?
|
||||
addImage.upload=Pridať obrázok
|
||||
addImage.submit=Pridať obrázok
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Zlúčiť
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Abeceda
|
||||
downloadPdf=Prenesi PDF
|
||||
text=Besedilo
|
||||
font=Pisava
|
||||
selectFillter=-- Izberite --
|
||||
selectFilter=-- Izberite --
|
||||
pageNum=Številka strani
|
||||
sizes.small=Majhen
|
||||
sizes.medium=Srednje
|
||||
sizes.large=Veliko
|
||||
sizes.x-large=X-Velik
|
||||
error.pdfPassword=Dokument PDF je zaščiten z geslom in geslo ni bilo vneseno ali pa je bilo napačno
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Izbriši
|
||||
username=Uporabniško ime
|
||||
password=Geslo
|
||||
@@ -181,7 +242,6 @@ red=rdeča
|
||||
green=zelena
|
||||
blue=modra
|
||||
custom=Po meri...
|
||||
WorkInProgess=Delo je v teku, morda ne bo delovalo ali bo hroščalo, prosimo, prijavite morebitne težave!
|
||||
poweredBy=Poganja
|
||||
yes=Da
|
||||
no=Ne
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Dodaj sliko
|
||||
home.addImage.desc=Doda sliko na določeno mesto v PDF-ju
|
||||
addImage.tags=img,jpg,slika,fotografija
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Dodaj vodni žig
|
||||
home.watermark.desc=V dokument PDF dodajte vodni žig po meri.
|
||||
watermark.tags=Besedilo, ponavljajoče se, oznaka, lastno, avtorske pravice, blagovna znamka, img, jpg, slika, fotografija
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Vsaka stran?
|
||||
addImage.upload=Dodaj sliko
|
||||
addImage.submit=Dodaj sliko
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Združi
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Povleci in spusti datoteko PDF
|
||||
fileChooser.dragAndDropImage=Povleci in spusti slikovno datoteko
|
||||
fileChooser.hoveredDragAndDrop=Povleci in spusti datoteko(e) sem
|
||||
fileChooser.extractPDF=Izvlečenje...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Izdaje
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -163,13 +163,74 @@ alphabet=Alfabet
|
||||
downloadPdf=Ladda ner PDF
|
||||
text=Text
|
||||
font=Teckensnitt
|
||||
selectFillter=-- Välj --
|
||||
selectFilter=-- Välj --
|
||||
pageNum=Sidnummer
|
||||
sizes.small=Liten
|
||||
sizes.medium=Mellan
|
||||
sizes.large=Stor
|
||||
sizes.x-large=Extra stor
|
||||
error.pdfPassword=PDF-dokumentet är lösenordsskyddat och antingen har lösenordet inte angetts eller är felaktigt
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Radera
|
||||
username=Användarnamn
|
||||
password=Lösenord
|
||||
@@ -181,7 +242,6 @@ red=Röd
|
||||
green=Grön
|
||||
blue=Blå
|
||||
custom=Anpassad...
|
||||
WorkInProgess=Pågående arbete, kan vara icke fungerande eller buggigt. Rapportera eventuella problem!
|
||||
poweredBy=Drivs av
|
||||
yes=Ja
|
||||
no=Nej
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Lägg till bild
|
||||
home.addImage.desc=Lägger till en bild på en angiven plats i PDF:en (pågår arbete)
|
||||
addImage.tags=img,jpg,bild,foto
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Lägg till vattenstämpel
|
||||
home.watermark.desc=Lägg till en anpassad vattenstämpel till ditt PDF-dokument.
|
||||
watermark.tags=Text,upprepande,etikett,egen,upphovsrätt,varumärke,img,jpg,bild,foto
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Varje sida?
|
||||
addImage.upload=Lägg till bild
|
||||
addImage.submit=Lägg till bild
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Sammanfoga
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Dra & Släpp PDF fil
|
||||
fileChooser.dragAndDropImage=Dra & Släpp bildfil
|
||||
fileChooser.hoveredDragAndDrop=Dra & Släpp fil(er) här
|
||||
fileChooser.extractPDF=Extraherar...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Utgåvor
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=ตัวอักษร
|
||||
downloadPdf=ดาวน์โหลด PDF
|
||||
text=ข้อความ
|
||||
font=ฟอนต์
|
||||
selectFillter=-- เลือก --
|
||||
selectFilter=-- เลือก --
|
||||
pageNum=หมายเลขหน้า
|
||||
sizes.small=เล็ก
|
||||
sizes.medium=กลาง
|
||||
sizes.large=ใหญ่
|
||||
sizes.x-large=ใหญ่มาก
|
||||
error.pdfPassword=เอกสาร PDF มีรหัสผ่าน และไม่ได้ระบุรหัสผ่านหรือรหัสผ่านไม่ถูกต้อง
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=ลบ
|
||||
username=ชื่อผู้ใช้
|
||||
password=รหัสผ่าน
|
||||
@@ -181,7 +242,6 @@ red=แดง
|
||||
green=เขียว
|
||||
blue=น้ำเงิน
|
||||
custom=ปรับแต่ง...
|
||||
WorkInProgess=กำลังดำเนินการ อาจไม่ทำงานหรือมีบั๊ก โปรดรายงานปัญหาใด ๆ!
|
||||
poweredBy=ขับเคลื่อนโดย
|
||||
yes=ใช่
|
||||
no=ไม่
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=เพิ่มรูปภาพ
|
||||
home.addImage.desc=เพิ่มรูปภาพไปยังตำแหน่งที่กำหนดใน PDF
|
||||
addImage.tags=รูปภาพ, JPG, ภาพ, รูปถ่าย
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=เพิ่มลายน้ำ
|
||||
home.watermark.desc=เพิ่มลายน้ำที่กำหนดเองลงในเอกสาร PDF ของคุณ
|
||||
watermark.tags=ข้อความ, ซ้ำ, ป้าย, ของคุณเอง, ลิขสิทธิ์, เครื่องหมายการค้า, รูปภาพ, JPG, ภาพ, รูปถ่าย
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=ทุกหน้า?
|
||||
addImage.upload=เพิ่มรูปภาพ
|
||||
addImage.submit=เพิ่มรูปภาพ
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=รวม
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Alfabe
|
||||
downloadPdf=PDF İndir
|
||||
text=Metin
|
||||
font=Yazı tipi
|
||||
selectFillter=-- Seçiniz --
|
||||
selectFilter=-- Seçiniz --
|
||||
pageNum=Sayfa Numarası
|
||||
sizes.small=Küçük
|
||||
sizes.medium=Orta
|
||||
sizes.large=Büyük
|
||||
sizes.x-large=Çok Büyük
|
||||
error.pdfPassword=PDF belgesi şifreli ve şifre ya sağlanmadı ya da yanlış.
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Sil
|
||||
username=Kullanıcı Adı
|
||||
password=Parola
|
||||
@@ -181,7 +242,6 @@ red=Kırmızı
|
||||
green=Yeşil
|
||||
blue=Mavi
|
||||
custom=Özel
|
||||
WorkInProgess=Çalışmalar devam ediyor, Çalışmayabilir veya hatalı olabilir, Lütfen herhangi bir sorunu bildirin!
|
||||
poweredBy=Tarafından desteklenmektedir
|
||||
yes=Evet
|
||||
no=Hayır
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Resim Ekle
|
||||
home.addImage.desc=PDF'e belirli bir konuma resim ekler
|
||||
addImage.tags=img,jpg,fotoğraf,resim
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Filigran Ekle
|
||||
home.watermark.desc=PDF belgenize özel bir filigran ekleyin.
|
||||
watermark.tags=Metin,tekrarlayan,etiket,kendi,telif hakkı,marka,img,jpg,fotoğraf,resim
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Her Sayfa mı?
|
||||
addImage.upload=Resim ekle
|
||||
addImage.submit=Resim ekle
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Birleştir
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=PDF dosyasını Sürükle & Bırak
|
||||
fileChooser.dragAndDropImage=Görsel dosyasını Sürükle & Bırak
|
||||
fileChooser.hoveredDragAndDrop=Dosya(lar)ı buraya sürükleyip bırakın
|
||||
fileChooser.extractPDF=PDF Çıkarılıyor...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Sürümler
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Алфавіт
|
||||
downloadPdf=Завантажити PDF
|
||||
text=Текст
|
||||
font=Шрифт
|
||||
selectFillter=-- Вибрати --
|
||||
selectFilter=-- Вибрати --
|
||||
pageNum=номер сторінки
|
||||
sizes.small=Малий
|
||||
sizes.medium=Середній
|
||||
sizes.large=Великий
|
||||
sizes.x-large=Дуже великий
|
||||
error.pdfPassword=Документ PDF захищено паролем, і пароль не був наданий або був невірним
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Видалити
|
||||
username=Ім'я користувача
|
||||
password=Пароль
|
||||
@@ -181,7 +242,6 @@ red=Червоний
|
||||
green=Зелений
|
||||
blue=Синій
|
||||
custom=Звичай...
|
||||
WorkInProgess=Робота триває, може не працювати або глючити, будь ласка, повідомляйте про будь-які проблеми!
|
||||
poweredBy=Працює на
|
||||
yes=Так
|
||||
no=Ні
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Додати зображення
|
||||
home.addImage.desc=Додає зображення у вказане місце в PDF (в розробці)
|
||||
addImage.tags=зображення,jpg,картинка,фото
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Додати водяний знак
|
||||
home.watermark.desc=Додайте свій водяний знак до документа PDF.
|
||||
watermark.tags=текст,повторний,мітка,власний,авторське право,торговельна марка,зображення,jpg,картинка,фото
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Кожна сторінка?
|
||||
addImage.upload=Додати зображення
|
||||
addImage.submit=Додати зображення
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Об'єднати
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Перетащите PDF-файл
|
||||
fileChooser.dragAndDropImage=Перетащите файл зображення
|
||||
fileChooser.hoveredDragAndDrop=Перетащите файл(и) сюда
|
||||
fileChooser.extractPDF=Видобування...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Релізи
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=Bảng chữ cái
|
||||
downloadPdf=Tải xuống PDF
|
||||
text=Văn bản
|
||||
font=Phông chữ
|
||||
selectFillter=-- Chọn --
|
||||
selectFilter=-- Chọn --
|
||||
pageNum=Số trang
|
||||
sizes.small=Nhỏ
|
||||
sizes.medium=Trung bình
|
||||
sizes.large=Lớn
|
||||
sizes.x-large=Rất lớn
|
||||
error.pdfPassword=Tài liệu PDF được bảo vệ bằng mật khẩu và mật khẩu không được cung cấp hoặc không chính xác
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=Xóa
|
||||
username=Tên người dùng
|
||||
password=Mật khẩu
|
||||
@@ -181,7 +242,6 @@ red=Đỏ
|
||||
green=Xanh lá
|
||||
blue=Xanh dương
|
||||
custom=Tùy chỉnh...
|
||||
WorkInProgess=Đang trong quá trình phát triển, Có thể không hoạt động hoặc có lỗi, Vui lòng báo cáo mọi vấn đề!
|
||||
poweredBy=Được hỗ trợ bởi
|
||||
yes=Có
|
||||
no=Không
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=Thêm hình ảnh
|
||||
home.addImage.desc=Thêm hình ảnh vào vị trí cố định trên PDF
|
||||
addImage.tags=img,jpg,hình ảnh,ảnh
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=Thêm hình mờ
|
||||
home.watermark.desc=Thêm hình mờ tùy chỉnh vào tài liệu PDF của bạn.
|
||||
watermark.tags=Văn bản,lặp lại,nhãn,riêng,bản quyền,thương hiệu,img,jpg,hình ảnh,ảnh
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=Mọi trang?
|
||||
addImage.upload=Thêm hình ảnh
|
||||
addImage.submit=Thêm hình ảnh
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=Trộn
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=字母表
|
||||
downloadPdf=下载 PDF
|
||||
text=文本
|
||||
font=字体
|
||||
selectFillter=-- 选择--
|
||||
selectFilter=-- 选择--
|
||||
pageNum=页码
|
||||
sizes.small=小型尺寸
|
||||
sizes.medium=中型尺寸
|
||||
sizes.large=大型尺寸
|
||||
sizes.x-large=超大型尺寸
|
||||
error.pdfPassword=PDF文档有密码,未提供密码或密码不正确
|
||||
error.pdfCorrupted=PDF文件似乎已损坏或损坏。在继续此操作之前,请先尝试使用“修复PDF”功能修复文件。
|
||||
error.pdfCorruptedMultiple=一个或多个PDF文件似乎已损坏或损坏。请先对单个文件使用“修复PDF”功能,然后再尝试合并它们。
|
||||
error.pdfCorruptedDuring=错误 {0} :PDF文件似乎已损坏或损坏。在继续此操作之前,请先尝试使用“修复PDF”功能修复文件。
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} 未被安装
|
||||
error.toolRequired={1} 依赖于 {0}
|
||||
error.conversionFailed={0} 转换失败
|
||||
error.commandFailed={0} 执行命令失败
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=该端点被管理员禁用
|
||||
error.urlNotReachable=URL无法访问,请提供有效的URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI值 {0} 超过 {1} 的最大安全限值。高DPI值可能导致内存溢出或崩溃。请尝试较低的DPI值。
|
||||
error.pageTooBigForDpi=PDF页面 {0} 太大,无法以 {1} DPI呈现。请尝试较低的DPI值(建议:150或更低)。
|
||||
error.pageTooBigExceedsArray=PDF页面 {0} 太大,无法以 {1} DPI呈现。生成的图像将超过Java的最大数组大小。请尝试较低的DPI值(建议:150或更低)。
|
||||
error.pageTooBigFor300Dpi=PDF页面 {0} 太大,无法以300 DPI呈现。生成的图像将超过Java的最大数组大小。请使用较低的DPI值进行pdf到图像的转换。
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API秘钥无效。
|
||||
error.userNotFound=用户未找到。
|
||||
error.passwordRequired=密码不应为空。
|
||||
error.accountLocked=由于过多的失败登录尝试,你的账户被锁定。
|
||||
error.invalidEmail=提供了无效的电子邮件地址。
|
||||
error.emailAttachmentRequired=发送该电子邮件需要附件。
|
||||
error.signatureNotFound=证书文件未找到。
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=具有此ID的文件未找到: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=未找到备份脚本。
|
||||
error.unsupportedProvider={0} 当前不被支持。
|
||||
error.pathTraversalDetected=检测到存在安全问题的路径遍历操作。
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=不合法的参数: {0}
|
||||
error.argumentRequired={0} 不应当为空
|
||||
error.operationFailed=操作失败: {0}
|
||||
error.angleNotMultipleOf90=角度应当为90°的倍数
|
||||
error.pdfBookmarksNotFound=文档中没有找到PDF书签/大纲
|
||||
error.fontLoadingFailed=处理字体文件出错
|
||||
error.fontDirectoryReadFailed=无法读取字体目录
|
||||
delete=删除
|
||||
username=用户名
|
||||
password=密码
|
||||
@@ -181,7 +242,6 @@ red=红色
|
||||
green=绿色
|
||||
blue=蓝色
|
||||
custom=自定义...
|
||||
WorkInProgess=工作正在进行中,可能无法工作或有错误,请报告任何问题!
|
||||
poweredBy=服务来源:
|
||||
yes=是
|
||||
no=否
|
||||
@@ -200,7 +260,7 @@ disabledCurrentUserMessage=无法禁用当前用户。
|
||||
downgradeCurrentUserLongMessage=无法降级当前用户的角色。因此,当前用户将不会显示。
|
||||
userAlreadyExistsOAuthMessage=该用户已作为 OAuth2 用户存在。
|
||||
userAlreadyExistsWebMessage=该用户已作为 Web 用户存在。
|
||||
invalidRoleMessage=Invalid role.
|
||||
invalidRoleMessage=无效角色。
|
||||
error=错误
|
||||
oops=哎呀!
|
||||
help=帮助
|
||||
@@ -212,8 +272,8 @@ donate=捐款
|
||||
color=颜色
|
||||
sponsor=赞助
|
||||
info=信息
|
||||
pro=专业版
|
||||
proFeatures=Pro Features
|
||||
pro=Pro版本
|
||||
proFeatures=Pro版本功能
|
||||
page=页面
|
||||
pages=页码
|
||||
loading=加载中...
|
||||
@@ -221,11 +281,11 @@ addToDoc=添加至文件
|
||||
reset=重置
|
||||
apply=应用
|
||||
noFileSelected=未选择文件,请上传一个文件。
|
||||
view=View
|
||||
cancel=Cancel
|
||||
view=预览
|
||||
cancel=取消
|
||||
|
||||
back.toSettings=Back to Settings
|
||||
back.toHome=Back to Home
|
||||
back.toSettings=回到设置
|
||||
back.toHome=回到主页
|
||||
back.toAdmin=Back to Admin
|
||||
|
||||
legal.privacy=隐私政策
|
||||
@@ -390,17 +450,17 @@ adminUserSettings.teamName=团队名称
|
||||
adminUserSettings.teamExists=该团队已存在
|
||||
adminUserSettings.teamCreated=团队成功创建
|
||||
adminUserSettings.teamChanged=用户所属团队已更新
|
||||
adminUserSettings.teamHidden=Hidden
|
||||
adminUserSettings.teamHidden=隐藏
|
||||
adminUserSettings.totalMembers=成员总数
|
||||
adminUserSettings.confirmDeleteTeam=您确定要删除此团队吗?
|
||||
|
||||
teamCreated=Team created successfully
|
||||
teamExists=A team with that name already exists
|
||||
teamNameExists=Another team with that name already exists
|
||||
teamNotFound=Team not found
|
||||
teamDeleted=Team deleted
|
||||
teamHasUsers=Cannot delete a team with users assigned
|
||||
teamRenamed=Team renamed successfully
|
||||
teamCreated=团队创建成功
|
||||
teamExists=同名称的团队已存在
|
||||
teamNameExists=同名称的团队已存在
|
||||
teamNotFound=未找到团队
|
||||
teamDeleted=团队被删除
|
||||
teamHasUsers=不能删除已经被分配用户的团队
|
||||
teamRenamed=团队重命名成功
|
||||
|
||||
# Team user management
|
||||
team.addUser=添加用户到团队
|
||||
@@ -412,16 +472,16 @@ team.back=返回团队列表
|
||||
team.internal=内部团队
|
||||
team.internalTeamNotAccessible=内部团队为系统预设,无法访问
|
||||
team.cannotMoveInternalUsers=内部团队中的用户无法转移至其他团队
|
||||
team.hidden=Hidden
|
||||
team.name=Team Name
|
||||
team.totalMembers=Total Members
|
||||
team.members=Members
|
||||
team.username=Username
|
||||
team.role=Role
|
||||
team.status=Status
|
||||
team.enabled=Enabled
|
||||
team.disabled=Disabled
|
||||
team.noMembers=This team has no members yet.
|
||||
team.hidden=隐藏
|
||||
team.name=团队名称
|
||||
team.totalMembers=总人数
|
||||
team.members=成员
|
||||
team.username=用户名
|
||||
team.role=角色
|
||||
team.status=状态
|
||||
team.enabled=启用
|
||||
team.disabled=禁用
|
||||
team.noMembers=这个团队还没有成员。
|
||||
|
||||
|
||||
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=在 PDF 中添加图片
|
||||
home.addImage.desc=将图像添加到 PDF 的指定位置。
|
||||
addImage.tags=图像、JPG、图片、照片
|
||||
|
||||
home.attachments.title=添加附件
|
||||
home.attachments.desc=在 PDF 中添加或删除嵌入文件(附件)
|
||||
attachments.tags=嵌入、附件、文件、附加
|
||||
|
||||
home.watermark.title=添加水印
|
||||
home.watermark.desc=在 PDF 中添加自定义水印。
|
||||
watermark.tags=文本、重复、标签、自定义、版权、商标、图像、JPG、图片、照片
|
||||
@@ -660,8 +724,8 @@ home.crop.desc=裁剪 PDF 以减小其文件大小(保留文本!)
|
||||
crop.tags=修剪、缩小、编辑、形状
|
||||
|
||||
home.autoSplitPDF.title=自动拆分页面
|
||||
home.autoSplitPDF.desc=使用物理扫描页面分割器 QR 代码自动拆分扫描的 PDF
|
||||
autoSplitPDF.tags=基于 QR 码、分离、扫描分割、整理
|
||||
home.autoSplitPDF.desc=使用物理扫描页面分割器二维码自动拆分扫描的 PDF
|
||||
autoSplitPDF.tags=基于二维码、分离、扫描分割、整理
|
||||
|
||||
home.sanitizePdf.title=清理
|
||||
home.sanitizePdf.desc=从 PDF 文件中删除脚本和其他元素
|
||||
@@ -767,11 +831,11 @@ validateSignature.tags=签名,验证,验证,PDF,证书,数字签名,
|
||||
replace-color.title=替换-反转-颜色
|
||||
replace-color.header=替换-反转 PDF 颜色
|
||||
home.replaceColorPdf.title=替换和反转颜色
|
||||
home.replaceColorPdf.desc=替换 PDF 中文本和背景的颜色,并将PDF全色反转以减小文件大小
|
||||
home.replaceColorPdf.desc=替换 PDF 中文本和背景的颜色,并将PDF反转颜色以减小文件大小
|
||||
replaceColorPdf.tags=更换颜色,页面操作,后端,服务器端
|
||||
replace-color.selectText.1=替换或反转颜色选项
|
||||
replace-color.selectText.2=默认(默认高对比度颜色)
|
||||
replace-color.selectText.3=定制(定制的颜色)
|
||||
replace-color.selectText.3=定制(定制的颜色)
|
||||
replace-color.selectText.4=全反转(反转所有颜色)
|
||||
replace-color.selectText.5=高对比度颜色选项
|
||||
replace-color.selectText.6=黑底白字
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=每一页?
|
||||
addImage.upload=添加图片
|
||||
addImage.submit=添加图片
|
||||
|
||||
#attachments
|
||||
attachments.title=添加附件
|
||||
attachments.header=添加附件
|
||||
attachments.description=允许您向PDF添加附件
|
||||
attachments.descriptionPlaceholder=为附件输入描述…
|
||||
attachments.addButton=添加附件
|
||||
|
||||
#merge
|
||||
merge.title=合并
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=拖放PDF文件
|
||||
fileChooser.dragAndDropImage=拖放图片文件
|
||||
fileChooser.hoveredDragAndDrop=拖放文件到此处
|
||||
fileChooser.extractPDF=处理中...
|
||||
fileChooser.addAttachments=拖放附件到此处
|
||||
|
||||
#release notes
|
||||
releases.footer=版本
|
||||
@@ -1651,14 +1722,14 @@ audit.dashboard.totalEvents=Total Events
|
||||
# Audit Dashboard Tabs
|
||||
audit.dashboard.tab.dashboard=Dashboard
|
||||
audit.dashboard.tab.events=Audit Events
|
||||
audit.dashboard.tab.export=Export
|
||||
audit.dashboard.tab.export=导出
|
||||
# Dashboard Charts
|
||||
audit.dashboard.eventsByType=Events by Type
|
||||
audit.dashboard.eventsByUser=Events by User
|
||||
audit.dashboard.eventsOverTime=Events Over Time
|
||||
audit.dashboard.period.7days=7 Days
|
||||
audit.dashboard.period.30days=30 Days
|
||||
audit.dashboard.period.90days=90 Days
|
||||
audit.dashboard.period.7days=7天
|
||||
audit.dashboard.period.30days=30天
|
||||
audit.dashboard.period.90days=90天
|
||||
|
||||
# Events Tab
|
||||
audit.dashboard.auditEvents=Audit Events
|
||||
@@ -1673,11 +1744,11 @@ audit.dashboard.filter.reset=Reset Filters
|
||||
|
||||
# Table Headers
|
||||
audit.dashboard.table.id=ID
|
||||
audit.dashboard.table.time=Time
|
||||
audit.dashboard.table.user=User
|
||||
audit.dashboard.table.type=Type
|
||||
audit.dashboard.table.details=Details
|
||||
audit.dashboard.table.viewDetails=View Details
|
||||
audit.dashboard.table.time=时间
|
||||
audit.dashboard.table.user=用户
|
||||
audit.dashboard.table.type=类型
|
||||
audit.dashboard.table.details=详情
|
||||
audit.dashboard.table.viewDetails=查看详情
|
||||
|
||||
# Pagination
|
||||
audit.dashboard.pagination.show=Show
|
||||
|
||||
@@ -163,13 +163,74 @@ alphabet=字母表
|
||||
downloadPdf=下載 PDF
|
||||
text=文字
|
||||
font=字型
|
||||
selectFillter=-- 選擇 --
|
||||
selectFilter=-- 選擇 --
|
||||
pageNum=頁碼
|
||||
sizes.small=小
|
||||
sizes.medium=中
|
||||
sizes.large=大
|
||||
sizes.x-large=特大
|
||||
error.pdfPassword=PDF 檔案已加密,但未提供密碼或密碼不正確
|
||||
error.pdfCorrupted=PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
error.pdfCorruptedMultiple=One or more PDF files appear to be corrupted or damaged. Please try using the 'Repair PDF' feature on each file first before attempting to merge them.
|
||||
error.pdfCorruptedDuring=Error {0}: PDF file appears to be corrupted or damaged. Please try using the 'Repair PDF' feature first to fix the file before proceeding with this operation.
|
||||
|
||||
# Frontend corruption error messages
|
||||
error.pdfInvalid=The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the 'Repair PDF' feature to fix the file before proceeding.
|
||||
error.tryRepair=Try using the Repair PDF feature to fix corrupted files.
|
||||
|
||||
# Additional error messages
|
||||
error.pdfEncryption=The PDF appears to have corrupted encryption data. This can happen when the PDF was created with incompatible encryption methods. Please try using the 'Repair PDF' feature first, or contact the document creator for a new copy.
|
||||
error.fileProcessing=An error occurred while processing the file during {0} operation: {1}
|
||||
|
||||
# Generic error message templates
|
||||
error.toolNotInstalled={0} is not installed
|
||||
error.toolRequired={0} is required for {1}
|
||||
error.conversionFailed={0} conversion failed
|
||||
error.commandFailed={0} command failed
|
||||
error.algorithmNotAvailable={0} algorithm not available
|
||||
error.optionsNotSpecified={0} options are not specified
|
||||
error.fileFormatRequired=File must be in {0} format
|
||||
error.invalidFormat=Invalid {0} format: {1}
|
||||
error.endpointDisabled=This endpoint has been disabled by the admin
|
||||
error.urlNotReachable=URL is not reachable, please provide a valid URL
|
||||
|
||||
# DPI and image rendering messages - used by frontend for dynamic translation
|
||||
# Backend sends: [TRANSLATE:messageKey:arg1,arg2] English message
|
||||
# Frontend parses this and replaces with localized versions using these keys
|
||||
error.dpiExceedsLimit=DPI value {0} exceeds maximum safe limit of {1}. High DPI values can cause memory issues and crashes. Please use a lower DPI value.
|
||||
error.pageTooBigForDpi=PDF page {0} is too large to render at {1} DPI. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigExceedsArray=PDF page {0} is too large to render at {1} DPI. The resulting image would exceed Java's maximum array size. Please try a lower DPI value (recommended: 150 or less).
|
||||
error.pageTooBigFor300Dpi=PDF page {0} is too large to render at 300 DPI. The resulting image would exceed Java's maximum array size. Please use a lower DPI value for PDF-to-image conversion.
|
||||
|
||||
# URL and website conversion messages
|
||||
|
||||
# System requirements messages
|
||||
|
||||
# Authentication and security messages
|
||||
error.apiKeyInvalid=API key is not valid.
|
||||
error.userNotFound=User not found.
|
||||
error.passwordRequired=Password must not be null.
|
||||
error.accountLocked=Your account has been locked due to too many failed login attempts.
|
||||
error.invalidEmail=Invalid email addresses provided.
|
||||
error.emailAttachmentRequired=An attachment is required to send the email.
|
||||
error.signatureNotFound=Signature file not found.
|
||||
|
||||
# File processing messages
|
||||
error.fileNotFound=File not found with ID: {0}
|
||||
|
||||
# Database and configuration messages
|
||||
error.noBackupScripts=No backup scripts were found.
|
||||
error.unsupportedProvider={0} is not currently supported.
|
||||
error.pathTraversalDetected=Path traversal detected for security reasons.
|
||||
|
||||
# Validation messages
|
||||
error.invalidArgument=Invalid argument: {0}
|
||||
error.argumentRequired={0} must not be null
|
||||
error.operationFailed=Operation failed: {0}
|
||||
error.angleNotMultipleOf90=Angle must be a multiple of 90
|
||||
error.pdfBookmarksNotFound=No PDF bookmarks/outline found in document
|
||||
error.fontLoadingFailed=Error processing font file
|
||||
error.fontDirectoryReadFailed=Failed to read font directory
|
||||
delete=刪除
|
||||
username=使用者名稱
|
||||
password=密碼
|
||||
@@ -181,7 +242,6 @@ red=紅色
|
||||
green=綠色
|
||||
blue=藍色
|
||||
custom=自訂...
|
||||
WorkInProgess=工作正在進行中,可能無法工作或有問題,請報告任何問題!
|
||||
poweredBy=Powered by
|
||||
yes=是
|
||||
no=否
|
||||
@@ -525,6 +585,10 @@ home.addImage.title=新增圖片
|
||||
home.addImage.desc=在 PDF 的指定位置新增圖片
|
||||
addImage.tags=img,jpg,圖片,照片
|
||||
|
||||
home.attachments.title=Add Attachments
|
||||
home.attachments.desc=Add or remove embedded files (attachments) to/from a PDF
|
||||
attachments.tags=embed,attach,file,attachment,attachments
|
||||
|
||||
home.watermark.title=新增浮水印
|
||||
home.watermark.desc=在您的 PDF 檔案中新增自訂浮水印。
|
||||
watermark.tags=文字,重複,標籤,自有,版權,商標,img,jpg,圖片,照片
|
||||
@@ -1205,6 +1269,12 @@ addImage.everyPage=每一頁?
|
||||
addImage.upload=新增圖片
|
||||
addImage.submit=新增圖片
|
||||
|
||||
#attachments
|
||||
attachments.title=Add Attachments
|
||||
attachments.header=Add attachments
|
||||
attachments.description=Allows you to add attachments to the PDF
|
||||
attachments.descriptionPlaceholder=Enter a description for the attachments...
|
||||
attachments.addButton=Add Attachments
|
||||
|
||||
#merge
|
||||
merge.title=合併
|
||||
@@ -1594,6 +1664,7 @@ fileChooser.dragAndDropPDF=拖放 PDF 檔案
|
||||
fileChooser.dragAndDropImage=拖放圖片檔案
|
||||
fileChooser.hoveredDragAndDrop=將檔案拖放至此
|
||||
fileChooser.extractPDF=處理中...
|
||||
fileChooser.addAttachments=drag & drop attachments here
|
||||
|
||||
#release notes
|
||||
releases.footer=版本資訊
|
||||
|
||||
@@ -62,7 +62,7 @@ security:
|
||||
|
||||
premium:
|
||||
key: 00000000-0000-0000-0000-000000000000
|
||||
enabled: true # Enable license key checks for pro/enterprise features
|
||||
enabled: false # Enable license key checks for pro/enterprise features
|
||||
proFeatures:
|
||||
database: true # Enable database features
|
||||
SSOAutoLogin: false
|
||||
@@ -164,6 +164,8 @@ processExecutor:
|
||||
weasyPrintSessionLimit: 16
|
||||
installAppSessionLimit: 1
|
||||
calibreSessionLimit: 1
|
||||
ghostscriptSessionLimit: 8
|
||||
ocrMyPdfSessionLimit: 2
|
||||
timeoutMinutes: # Process executor timeout in minutes
|
||||
libreOfficetimeoutMinutes: 30
|
||||
pdfToHtmltimeoutMinutes: 20
|
||||
@@ -172,3 +174,6 @@ processExecutor:
|
||||
installApptimeoutMinutes: 60
|
||||
calibretimeoutMinutes: 30
|
||||
tesseractTimeoutMinutes: 30
|
||||
qpdfTimeoutMinutes: 30
|
||||
ghostscriptTimeoutMinutes: 30
|
||||
ocrMyPdfTimeoutMinutes: 30
|
||||
|
||||
@@ -283,7 +283,7 @@
|
||||
{
|
||||
"moduleName": "com.opencsv:opencsv",
|
||||
"moduleUrl": "http://opencsv.sf.net",
|
||||
"moduleVersion": "5.11.1",
|
||||
"moduleVersion": "5.11.2",
|
||||
"moduleLicense": "Apache 2",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
@@ -649,7 +649,7 @@
|
||||
{
|
||||
"moduleName": "io.swagger.core.v3:swagger-annotations-jakarta",
|
||||
"moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-annotations",
|
||||
"moduleVersion": "2.2.33",
|
||||
"moduleVersion": "2.2.34",
|
||||
"moduleLicense": "Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||
},
|
||||
@@ -663,7 +663,7 @@
|
||||
{
|
||||
"moduleName": "io.swagger.core.v3:swagger-core-jakarta",
|
||||
"moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-core",
|
||||
"moduleVersion": "2.2.33",
|
||||
"moduleVersion": "2.2.34",
|
||||
"moduleLicense": "Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||
},
|
||||
@@ -677,7 +677,7 @@
|
||||
{
|
||||
"moduleName": "io.swagger.core.v3:swagger-models-jakarta",
|
||||
"moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-models",
|
||||
"moduleVersion": "2.2.33",
|
||||
"moduleVersion": "2.2.34",
|
||||
"moduleLicense": "Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||
},
|
||||
@@ -800,13 +800,6 @@
|
||||
"moduleLicense": "GPL2 w/ CPE",
|
||||
"moduleLicenseUrl": "https://oss.oracle.com/licenses/CDDL+GPL-1.1"
|
||||
},
|
||||
{
|
||||
"moduleName": "junit:junit",
|
||||
"moduleUrl": "http://junit.org",
|
||||
"moduleVersion": "4.13.2",
|
||||
"moduleLicense": "Eclipse Public License 1.0",
|
||||
"moduleLicenseUrl": "http://www.eclipse.org/legal/epl-v10.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "me.friwi:gluegen-rt",
|
||||
"moduleUrl": "http://jogamp.org/gluegen/www/",
|
||||
@@ -1069,13 +1062,13 @@
|
||||
},
|
||||
{
|
||||
"moduleName": "org.commonmark:commonmark",
|
||||
"moduleVersion": "0.24.0",
|
||||
"moduleVersion": "0.25.0",
|
||||
"moduleLicense": "BSD-2-Clause",
|
||||
"moduleLicenseUrl": "https://opensource.org/licenses/BSD-2-Clause"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.commonmark:commonmark-ext-gfm-tables",
|
||||
"moduleVersion": "0.24.0",
|
||||
"moduleVersion": "0.25.0",
|
||||
"moduleLicense": "BSD-2-Clause",
|
||||
"moduleLicenseUrl": "https://opensource.org/licenses/BSD-2-Clause"
|
||||
},
|
||||
@@ -1093,6 +1086,13 @@
|
||||
"moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.eclipse.angus:angus-mail",
|
||||
"moduleUrl": "https://www.eclipse.org",
|
||||
"moduleVersion": "2.0.3",
|
||||
"moduleLicense": "GPL2 w/ CPE",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.eclipse.angus:jakarta.mail",
|
||||
"moduleUrl": "https://www.eclipse.org",
|
||||
@@ -1303,20 +1303,6 @@
|
||||
"moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception",
|
||||
"moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.hamcrest:hamcrest",
|
||||
"moduleUrl": "http://hamcrest.org/JavaHamcrest/",
|
||||
"moduleVersion": "3.0",
|
||||
"moduleLicense": "BSD-3-Clause",
|
||||
"moduleLicenseUrl": "https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.hamcrest:hamcrest-core",
|
||||
"moduleUrl": "http://hamcrest.org/JavaHamcrest/",
|
||||
"moduleVersion": "3.0",
|
||||
"moduleLicense": "BSD-3-Clause",
|
||||
"moduleLicenseUrl": "https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.hdrhistogram:HdrHistogram",
|
||||
"moduleUrl": "http://hdrhistogram.github.io/HdrHistogram/",
|
||||
@@ -1372,34 +1358,6 @@
|
||||
"moduleLicense": "The Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.junit.platform:junit-platform-commons",
|
||||
"moduleUrl": "https://junit.org/junit5/",
|
||||
"moduleVersion": "1.12.2",
|
||||
"moduleLicense": "Eclipse Public License v2.0",
|
||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.junit.platform:junit-platform-engine",
|
||||
"moduleUrl": "https://junit.org/junit5/",
|
||||
"moduleVersion": "1.12.2",
|
||||
"moduleLicense": "Eclipse Public License v2.0",
|
||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.junit.vintage:junit-vintage-engine",
|
||||
"moduleUrl": "https://junit.org/junit5/",
|
||||
"moduleVersion": "5.12.2",
|
||||
"moduleLicense": "Eclipse Public License v2.0",
|
||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.junit:junit-bom",
|
||||
"moduleUrl": "https://junit.org/junit5/",
|
||||
"moduleVersion": "5.12.2",
|
||||
"moduleLicense": "Eclipse Public License v2.0",
|
||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.latencyutils:LatencyUtils",
|
||||
"moduleUrl": "http://latencyutils.github.io/LatencyUtils/",
|
||||
@@ -1509,13 +1467,6 @@
|
||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.opentest4j:opentest4j",
|
||||
"moduleUrl": "https://github.com/ota4j-team/opentest4j",
|
||||
"moduleVersion": "1.3.0",
|
||||
"moduleLicense": "The Apache License, Version 2.0",
|
||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||
},
|
||||
{
|
||||
"moduleName": "org.ow2.asm:asm",
|
||||
"moduleUrl": "http://asm.ow2.org",
|
||||
|
||||
@@ -98,6 +98,61 @@
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Responsive text sizing for drag & drop area */
|
||||
#fileInputText {
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
color: var(--md-sys-color-on-surface);
|
||||
max-width: 100%;
|
||||
padding: 0 10px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
/* Progressive font size reduction for high zoom levels */
|
||||
@media only screen and (max-width: 1280px) {
|
||||
#fileInputText {
|
||||
font-size: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 960px) {
|
||||
#fileInputText {
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 768px) {
|
||||
#fileInputText {
|
||||
font-size: 13px;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 640px) {
|
||||
#fileInputText {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 480px) {
|
||||
#fileInputText {
|
||||
font-size: 11px;
|
||||
line-height: 1.3;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 384px) {
|
||||
#fileInputText {
|
||||
font-size: 10px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
/* Also scale the container at ultra-high zoom */
|
||||
.input-container {
|
||||
height: 130px;
|
||||
padding: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.file-input-btn {
|
||||
display: inline-block;
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
align-items: center; /* Center children horizontally */
|
||||
flex-grow: 1;
|
||||
flex-direction: column;
|
||||
margin-top: 1rem;;
|
||||
}
|
||||
|
||||
.footer-powered-by {
|
||||
@@ -57,4 +58,4 @@
|
||||
.footer-link-list{
|
||||
flex-direction: column; /* Stack links vertically on smaller screens */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,9 +16,8 @@
|
||||
|
||||
.navbar {
|
||||
height: auto;
|
||||
/* Adjusts height automatically based on content */
|
||||
white-space: nowrap;
|
||||
/* Prevents wrapping of navbar contents */
|
||||
width: 100vw;
|
||||
}
|
||||
|
||||
/* TODO enable later
|
||||
@@ -30,6 +29,7 @@
|
||||
margin-right: auto;
|
||||
}*/
|
||||
|
||||
|
||||
html[dir="ltr"] * {
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
background-color: var(--md-sys-color-surface-container-low);
|
||||
width: 100%;
|
||||
font-size: 16px;
|
||||
margin-bottom: 2rem;
|
||||
margin-bottom: 0.5rem;
|
||||
padding: 0.75rem 3.5rem;
|
||||
border: 1px solid var(--md-sys-color-outline-variant);
|
||||
border-radius: 3rem;
|
||||
|
||||
@@ -91,7 +91,8 @@
|
||||
}
|
||||
|
||||
.newfeature{
|
||||
min-width:12rem;
|
||||
display: flex;
|
||||
width:fit-content
|
||||
}
|
||||
.recent-features{
|
||||
display: flex;
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
/* Base Container Styles */
|
||||
.multi-tool-container {
|
||||
max-width: 95vw;
|
||||
margin: 0 auto;
|
||||
max-width: 100vw;
|
||||
margin: 0;
|
||||
padding: 0 20px;
|
||||
}
|
||||
|
||||
/* Form Elements */
|
||||
label {
|
||||
text-align: left;
|
||||
display: block;
|
||||
@@ -17,6 +20,7 @@ label {
|
||||
flex-grow: 5;
|
||||
}
|
||||
|
||||
/* Action Bar Styles */
|
||||
.mt-action-bar {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
@@ -28,16 +32,17 @@ label {
|
||||
padding: 1.25rem;
|
||||
border-radius: 2rem;
|
||||
margin: 0px 25px;
|
||||
justify-content:center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
|
||||
.mt-action-bar>* {
|
||||
.mt-action-bar > * {
|
||||
padding-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.mt-file-uploader {
|
||||
width:100%
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.mt-action-bar svg,
|
||||
.mt-action-btn svg {
|
||||
width: 20px;
|
||||
@@ -50,20 +55,21 @@ label {
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
/* Action Button Styles */
|
||||
.mt-action-btn {
|
||||
position: sticky;
|
||||
bottom: 10%;
|
||||
margin: auto;
|
||||
margin-bottom: 25px;
|
||||
position: fixed;
|
||||
bottom: 80px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
border-radius: 2rem;
|
||||
z-index: 12;
|
||||
background-color: var(--md-sys-color-surface-container-low) ;
|
||||
background-color: var(--md-sys-color-surface-container-low);
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
padding: 12px 0px 0px;
|
||||
width: fit-content;
|
||||
justify-content: center;
|
||||
padding: 10px 20px
|
||||
padding: 10px 20px;
|
||||
transition: all 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
.mt-action-btn .btn {
|
||||
@@ -71,68 +77,132 @@ label {
|
||||
height: 3.5rem;
|
||||
border-radius: 20px;
|
||||
padding: 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* Card and Container Styles */
|
||||
.bg-card {
|
||||
background-color: var(--md-sys-color-surface-5);
|
||||
border-radius: 3rem;
|
||||
padding: 25px 0;
|
||||
padding: 15px 0;
|
||||
margin-left: 55px;
|
||||
margin-right: 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
#pages-container-wrapper {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 1rem;
|
||||
justify-content: center;
|
||||
padding: 0.75rem;
|
||||
border-radius: 25px;
|
||||
min-height: 275px;
|
||||
margin: 0 0 30px 0;
|
||||
margin: 0 0 20px 0;
|
||||
}
|
||||
|
||||
#pages-container {
|
||||
margin: 0 auto;
|
||||
width: 95%;
|
||||
font-size: 0;
|
||||
display: inline-flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 20px;
|
||||
justify-content: flex-start;
|
||||
width: fit-content;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
/* width */
|
||||
/* Scrollbar Styles */
|
||||
#pages-container-wrapper::-webkit-scrollbar {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
/* Track */
|
||||
#pages-container-wrapper::-webkit-scrollbar-track {
|
||||
background: var(--scroll-bar-color);
|
||||
}
|
||||
|
||||
/* Handle */
|
||||
#pages-container-wrapper::-webkit-scrollbar-thumb {
|
||||
border-radius: 10px;
|
||||
background: var(--scroll-bar-thumb);
|
||||
}
|
||||
|
||||
/* Handle on hover */
|
||||
#pages-container-wrapper::-webkit-scrollbar-thumb:hover {
|
||||
background: var(--scroll-bar-thumb-hover);
|
||||
}
|
||||
|
||||
|
||||
/* Page Container Base Styles */
|
||||
.page-container {
|
||||
display: inline-block;
|
||||
list-style-type: none;
|
||||
width: 250px;
|
||||
height: 250px;
|
||||
width: 260px;
|
||||
height: 260px;
|
||||
line-height: 50px;
|
||||
margin: 15px 25px;
|
||||
margin-top: 15px;
|
||||
box-sizing: border-box;
|
||||
text-align: center;
|
||||
aspect-ratio: 1;
|
||||
position: relative;
|
||||
user-select: none;
|
||||
transition: width 1s linear;
|
||||
transition: width 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
/* Responsive Page Container Sizes */
|
||||
@media only screen and (max-width: 480px) {
|
||||
.page-container {
|
||||
width: calc(100vw - 90px);
|
||||
height: calc(100vw - 90px);
|
||||
max-width: 300px;
|
||||
max-height: 300px;
|
||||
margin: 5px auto;
|
||||
}
|
||||
#pages-container { gap: 10px; }
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 481px) and (max-width: 768px) {
|
||||
.page-container {
|
||||
width: calc((100vw - 120px - 12px) / 2);
|
||||
height: calc((100vw - 120px - 12px) / 2);
|
||||
max-width: 250px;
|
||||
max-height: 250px;
|
||||
margin: 6px;
|
||||
}
|
||||
#pages-container { gap: 12px; }
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 769px) and (max-width: 1199px) {
|
||||
.page-container {
|
||||
width: calc((100vw - 140px - 45px) / 3);
|
||||
height: calc((100vw - 140px - 45px) / 3);
|
||||
max-width: 220px;
|
||||
max-height: 220px;
|
||||
margin: 7px;
|
||||
}
|
||||
#pages-container { gap: 15px; }
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 1200px) and (max-width: 1280px) {
|
||||
.page-container {
|
||||
width: calc((100vw - 160px - 60px) / 4);
|
||||
height: calc((100vw - 160px - 60px) / 4);
|
||||
max-width: 200px;
|
||||
max-height: 200px;
|
||||
margin: 8px;
|
||||
}
|
||||
#pages-container { gap: 17px; }
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 1281px) {
|
||||
.page-container {
|
||||
width: calc((100vw - 180px - 80px) / 5);
|
||||
height: calc((100vw - 180px - 80px) / 5);
|
||||
max-width: 190px;
|
||||
max-height: 190px;
|
||||
margin: 10px;
|
||||
}
|
||||
#pages-container { gap: 20px; }
|
||||
}
|
||||
|
||||
/* Split Page Styles */
|
||||
.page-container.split-before {
|
||||
border-left: 1px dashed var(--md-sys-color-on-surface);
|
||||
padding-left: -1px;
|
||||
@@ -146,56 +216,35 @@ label {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
/* RTL Language Support */
|
||||
.page-container:last-child:lang(ar),
|
||||
/* Arabic */
|
||||
.page-container:last-child:lang(he),
|
||||
/* Hebrew */
|
||||
.page-container:last-child:lang(fa),
|
||||
/* Persian */
|
||||
.page-container:last-child:lang(ur),
|
||||
/* Urdu */
|
||||
.page-container:last-child:lang(ckb),
|
||||
/* Sorani Kurdish */
|
||||
.page-container:last-child:lang(ks),
|
||||
/* Kashmiri */
|
||||
.page-container:last-child:lang(kk),
|
||||
/* Kazakh */
|
||||
.page-container:last-child:lang(uz),
|
||||
/* Uzbek */
|
||||
.page-container:last-child:lang(ky),
|
||||
/* Kyrgyz */
|
||||
.page-container:last-child:lang(bal),
|
||||
/* Baluchi */
|
||||
.page-container:last-child:lang(dv),
|
||||
/* Divehi */
|
||||
.page-container:last-child:lang(ps),
|
||||
/* Pashto */
|
||||
.page-container:last-child:lang(sdg),
|
||||
/* Southern Kurdish */
|
||||
.page-container:last-child:lang(syr),
|
||||
/* Syriac */
|
||||
.page-container:last-child:lang(mzn),
|
||||
/* Mazanderani */
|
||||
.page-container:last-child:lang(tgl),
|
||||
/* Tagalog */
|
||||
.page-container:last-child:lang(pnb),
|
||||
/* Western Punjabi */
|
||||
.page-container:last-child:lang(ug),
|
||||
/* Uyghur */
|
||||
.page-container:last-child:lang(nqo),
|
||||
/* N'Ko */
|
||||
.page-container:last-child:lang(bqi)
|
||||
|
||||
/* Bakhtiari */
|
||||
{
|
||||
.page-container:last-child:lang(bqi) {
|
||||
margin-left: auto !important;
|
||||
margin-right: 0 !important;
|
||||
}
|
||||
|
||||
/* Page Image Styles */
|
||||
.page-container img {
|
||||
max-width: calc(100% - 15px);
|
||||
max-height: calc(100% - 15px);
|
||||
max-width: calc(100% - 8px);
|
||||
max-height: calc(100% - 8px);
|
||||
display: block;
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
@@ -206,10 +255,7 @@ label {
|
||||
transition: rotate 0.3s;
|
||||
}
|
||||
|
||||
#add-pdf-button {
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
/* Page Number Styles */
|
||||
.page-number {
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
@@ -224,14 +270,20 @@ label {
|
||||
font-weight: 450;
|
||||
}
|
||||
|
||||
/* Tool Header and Button Styles */
|
||||
.tool-header {
|
||||
margin: 0.5rem 1rem 2rem;
|
||||
margin: 0.5rem 1rem 1rem;
|
||||
}
|
||||
|
||||
#select-pages-button {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
#add-pdf-button {
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
/* Selected Pages Container Styles */
|
||||
.selected-pages-container {
|
||||
background-color: var(--md-sys-color-surface);
|
||||
border-radius: 16px;
|
||||
@@ -247,12 +299,42 @@ label {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.selected-pages-header {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.selected-pages-header h5 {
|
||||
margin: 0 0 8px 0 !important;
|
||||
font-size: 1.1rem;
|
||||
font-weight: 600;
|
||||
color: var(--md-sys-color-on-surface);
|
||||
}
|
||||
|
||||
.selected-pages-header #csv-input {
|
||||
width: 100%;
|
||||
height: 2.5rem;
|
||||
border-radius: 8px;
|
||||
border: 1px solid var(--md-sys-color-outline);
|
||||
background-color: var(--md-sys-color-surface);
|
||||
color: var(--md-sys-color-on-surface);
|
||||
padding: 0 12px;
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
.selected-pages-header #csv-input:focus {
|
||||
outline: none;
|
||||
border-color: var(--md-sys-color-primary);
|
||||
box-shadow: 0 0 0 2px rgba(var(--md-sys-color-primary-rgb), 0.2);
|
||||
}
|
||||
|
||||
/* Pages List Styles */
|
||||
.pages-list {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 10px;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
min-height: 0;
|
||||
max-height: 10rem;
|
||||
overflow: auto;
|
||||
}
|
||||
@@ -293,12 +375,251 @@ label {
|
||||
font-size: medium;
|
||||
}
|
||||
|
||||
.btn {
|
||||
position: relative;
|
||||
/* Zoom Level Responsive Styles */
|
||||
@media only screen and (min-width: 2000px) {
|
||||
.mt-action-btn {
|
||||
gap: 12px;
|
||||
padding: 12px 24px;
|
||||
border-radius: 2.5rem;
|
||||
}
|
||||
.mt-action-btn .btn {
|
||||
width: 4rem;
|
||||
height: 4rem;
|
||||
border-radius: 22px;
|
||||
}
|
||||
.mt-action-btn .btn .material-symbols-rounded {
|
||||
font-size: 1.7rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 767px) { #pages-container { width:300px; } }
|
||||
@media only screen and (min-width: 768px) and (max-width: 991px) { #pages-container { width: 600px; } }
|
||||
@media only screen and (min-width: 992px) and (max-width: 1199px) { #pages-container { width: 900px; } }
|
||||
@media only screen and (min-width: 1200px) and (max-width: 1399px) { #pages-container { width: 900px; } }
|
||||
@media only screen and (min-width: 1399px) { #pages-container { width: 1200px; } }
|
||||
@media only screen and (min-width: 2560px) {
|
||||
.mt-action-btn {
|
||||
gap: 15px;
|
||||
padding: 15px 30px;
|
||||
border-radius: 3rem;
|
||||
}
|
||||
.mt-action-btn .btn {
|
||||
width: 5rem;
|
||||
height: 5rem;
|
||||
border-radius: 28px;
|
||||
}
|
||||
.mt-action-btn .btn .material-symbols-rounded {
|
||||
font-size: 2.1rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 3840px) {
|
||||
.mt-action-btn {
|
||||
gap: 20px;
|
||||
padding: 20px 40px;
|
||||
border-radius: 4rem;
|
||||
}
|
||||
.mt-action-btn .btn {
|
||||
width: 7rem;
|
||||
height: 7rem;
|
||||
border-radius: 40px;
|
||||
}
|
||||
.mt-action-btn .btn .material-symbols-rounded {
|
||||
font-size: 3rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 7680px) {
|
||||
.mt-action-btn {
|
||||
gap: 40px;
|
||||
padding: 40px 80px;
|
||||
border-radius: 8rem;
|
||||
}
|
||||
.mt-action-btn .btn {
|
||||
width: 14rem;
|
||||
height: 14rem;
|
||||
border-radius: 80px;
|
||||
}
|
||||
.mt-action-btn .btn .material-symbols-rounded {
|
||||
font-size: 6rem;
|
||||
}
|
||||
}
|
||||
|
||||
/* Zoom-responsive Sidebar Styles */
|
||||
@media only screen and (max-width: 1280px) {
|
||||
.container {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.mt-action-btn {
|
||||
position: fixed !important;
|
||||
left: 10px !important;
|
||||
top: 80px !important;
|
||||
bottom: 20px !important;
|
||||
margin: 0 !important;
|
||||
transform: none !important;
|
||||
border-radius: 16px !important;
|
||||
background-color: var(--md-sys-color-surface-container-low);
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
||||
backdrop-filter: blur(8px);
|
||||
display: flex !important;
|
||||
flex-direction: column !important;
|
||||
align-items: center !important;
|
||||
justify-content: center !important;
|
||||
height: calc(100vh - 100px) !important;
|
||||
overflow-y: auto !important;
|
||||
scrollbar-width: none !important;
|
||||
-ms-overflow-style: none !important;
|
||||
z-index: 12;
|
||||
width: 70px !important;
|
||||
gap: 8px !important;
|
||||
padding: 12px 8px !important;
|
||||
box-sizing: border-box !important;
|
||||
}
|
||||
|
||||
.mt-action-btn:has(.btn:nth-last-child(n+7)) {
|
||||
justify-content: flex-start !important;
|
||||
}
|
||||
|
||||
.mt-action-btn::-webkit-scrollbar {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.mt-action-btn .btn {
|
||||
width: 48px !important;
|
||||
height: 48px !important;
|
||||
border-radius: 12px !important;
|
||||
padding: 0 !important;
|
||||
margin: 0 !important;
|
||||
flex-shrink: 0;
|
||||
font-size: 16px !important;
|
||||
box-sizing: border-box !important;
|
||||
}
|
||||
|
||||
.mt-action-btn .btn .material-symbols-rounded {
|
||||
font-size: 20px !important;
|
||||
line-height: 1 !important;
|
||||
display: flex !important;
|
||||
align-items: center !important;
|
||||
justify-content: center !important;
|
||||
width: 100% !important;
|
||||
height: 100% !important;
|
||||
font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24 !important;
|
||||
}
|
||||
|
||||
.multi-tool-container {
|
||||
margin-left: 0 !important;
|
||||
max-width: 100% !important;
|
||||
}
|
||||
|
||||
.mt-action-bar {
|
||||
margin-left: 25px !important;
|
||||
margin-right: 25px !important;
|
||||
}
|
||||
|
||||
.mt-action-btn:not(:has(*:nth-child(6))) {
|
||||
justify-content: center !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Mobile and High Zoom Responsive Styles */
|
||||
@media only screen and (max-width: 960px) {
|
||||
.mt-action-btn {
|
||||
left: 8px !important;
|
||||
top: 75px !important;
|
||||
bottom: 15px !important;
|
||||
height: calc(100vh - 90px) !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 768px) {
|
||||
.mt-action-btn {
|
||||
left: 5px !important;
|
||||
width: 60px !important;
|
||||
top: calc(var(--navbar-height, 60px) + 10px) !important;
|
||||
bottom: 10px !important;
|
||||
height: calc(100vh - var(--navbar-height, 60px) - 20px) !important;
|
||||
}
|
||||
|
||||
.mt-action-btn .btn {
|
||||
width: 40px !important;
|
||||
height: 40px !important;
|
||||
box-sizing: border-box !important;
|
||||
}
|
||||
|
||||
.mt-action-btn .btn .material-symbols-rounded {
|
||||
font-size: 16px !important;
|
||||
}
|
||||
|
||||
#pages-container {
|
||||
margin: 0 auto !important;
|
||||
display: flex !important;
|
||||
flex-wrap: wrap !important;
|
||||
justify-content: center !important;
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.page-container {
|
||||
width: calc(100vw - 55px) !important;
|
||||
height: calc(100vw - 60px) !important;
|
||||
max-width: 350px !important;
|
||||
max-height: 350px !important;
|
||||
margin: 5px auto !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 480px) {
|
||||
.mt-action-btn {
|
||||
left: 2px !important;
|
||||
top: calc(var(--navbar-height, 60px) + 5px) !important;
|
||||
bottom: 5px !important;
|
||||
height: calc(100vh - var(--navbar-height, 60px) - 10px) !important;
|
||||
width: 50px !important;
|
||||
gap: 6px !important;
|
||||
padding: 10px 6px !important;
|
||||
}
|
||||
|
||||
.mt-action-btn .btn {
|
||||
width: 32px !important;
|
||||
height: 32px !important;
|
||||
border-radius: 10px !important;
|
||||
box-sizing: border-box !important;
|
||||
}
|
||||
|
||||
.mt-action-btn .btn .material-symbols-rounded {
|
||||
font-size: 14px !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 384px) {
|
||||
.mt-action-btn {
|
||||
left: 2px !important;
|
||||
top: calc(var(--navbar-height, 60px) + 5px) !important;
|
||||
bottom: 5px !important;
|
||||
height: calc(100vh - var(--navbar-height, 60px) - 10px) !important;
|
||||
width: 40px !important;
|
||||
gap: 4px !important;
|
||||
padding: 8px 4px !important;
|
||||
}
|
||||
|
||||
.mt-action-btn .btn {
|
||||
width: 28px !important;
|
||||
height: 28px !important;
|
||||
border-radius: 8px !important;
|
||||
box-sizing: border-box !important;
|
||||
}
|
||||
|
||||
.mt-action-btn .btn .material-symbols-rounded {
|
||||
font-size: 12px !important;
|
||||
}
|
||||
|
||||
.page-container {
|
||||
width: calc(100vw - 55px) !important;
|
||||
height: calc(100vw - 60px) !important;
|
||||
max-width: 280px !important;
|
||||
max-height: 280px !important;
|
||||
margin: 3px auto !important;
|
||||
}
|
||||
|
||||
.page-container img {
|
||||
max-width: calc(100% - 4px) !important;
|
||||
max-height: calc(100% - 4px) !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -63,6 +63,79 @@
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
/* Responsive navbar brand - prevent hamburger from wrapping */
|
||||
.navbar-brand {
|
||||
display: flex !important;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
min-width: 0; /* Allow shrinking */
|
||||
}
|
||||
|
||||
.navbar-brand .icon-text {
|
||||
font-size: 1.5rem;
|
||||
font-weight: bold;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
/* Progressive text shrinking to prevent hamburger wrap */
|
||||
@media only screen and (max-width: 480px) {
|
||||
.navbar-brand .icon-text {
|
||||
font-size: 1.3rem;
|
||||
}
|
||||
|
||||
.main-icon {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 420px) {
|
||||
.navbar-brand .icon-text {
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
.main-icon {
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 380px) {
|
||||
.navbar-brand .icon-text {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.main-icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 340px) {
|
||||
.navbar-brand .icon-text {
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.main-icon {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Ultra-small screens - hide text, keep icon */
|
||||
@media only screen and (max-width: 320px) {
|
||||
.navbar-brand .icon-text {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.main-icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
}
|
||||
|
||||
.nav-icon {
|
||||
vertical-align: middle;
|
||||
font-size: 2rem !important;
|
||||
@@ -86,7 +159,8 @@
|
||||
|
||||
.scalable-languages-container {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); /* Auto-fill columns, with a minimum width of 180px */
|
||||
/* Auto-fill columns, with a minimum width of 180px */
|
||||
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
|
||||
}
|
||||
|
||||
.scalable-languages-container:not(:has(> :nth-child(4))) .lang-dropdown-item-wrapper:last-child {
|
||||
@@ -106,15 +180,15 @@
|
||||
}
|
||||
|
||||
html[dir="ltr"] .lang-dropdown-item-wrapper {
|
||||
border-right: 2px solid var(--md-nav-color-on-seperator);
|
||||
border-right: 2px solid var(--md-nav-color-on-separator);
|
||||
}
|
||||
|
||||
html[dir="rtl"] .lang-dropdown-item-wrapper {
|
||||
border-left: 2px solid var(--md-nav-color-on-seperator);
|
||||
border-left: 2px solid var(--md-nav-color-on-separator);
|
||||
}
|
||||
|
||||
/* Responsive adjustments */
|
||||
@media (min-width: 1200px){
|
||||
@media (min-width: 1200px) {
|
||||
.lang-dropdown-item-wrapper .dropdown-item {
|
||||
min-width: 200px
|
||||
}
|
||||
@@ -124,9 +198,11 @@ html[dir="rtl"] .lang-dropdown-item-wrapper {
|
||||
.scalable-languages-container {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
.scalable-languages-container:not(:has(> :nth-child(2))){
|
||||
|
||||
.scalable-languages-container:not(:has(> :nth-child(2))) {
|
||||
grid-template-columns: repeat(var(--count), 1fr) !important;
|
||||
}
|
||||
|
||||
.scalable-languages-container .lang-dropdown-item-wrapper:nth-child(2n) {
|
||||
border: 0px
|
||||
}
|
||||
@@ -136,9 +212,11 @@ html[dir="rtl"] .lang-dropdown-item-wrapper {
|
||||
.scalable-languages-container {
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
}
|
||||
.scalable-languages-container:not(:has(> :nth-child(3))){
|
||||
|
||||
.scalable-languages-container:not(:has(> :nth-child(3))) {
|
||||
grid-template-columns: repeat(var(--count), 1fr) !important;
|
||||
}
|
||||
|
||||
.scalable-languages-container .lang-dropdown-item-wrapper:nth-child(3n) {
|
||||
border: 0px
|
||||
}
|
||||
@@ -149,12 +227,12 @@ html[dir="rtl"] .lang-dropdown-item-wrapper {
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
}
|
||||
|
||||
.scalable-languages-container:not(:has(> :nth-child(4))){
|
||||
.scalable-languages-container:not(:has(> :nth-child(4))) {
|
||||
grid-template-columns: repeat(var(--count), 1fr) !important;
|
||||
}
|
||||
|
||||
.scalable-languages-container .lang-dropdown-item-wrapper:nth-child(4n) {
|
||||
border: 0px
|
||||
border: 0px
|
||||
}
|
||||
}
|
||||
|
||||
@@ -269,7 +347,9 @@ span.icon-text::after {
|
||||
|
||||
/* Mega Menu */
|
||||
.dropdown-mega .dropdown-menu {
|
||||
width: 98%;
|
||||
width: 100%;
|
||||
left: 0 !important;
|
||||
right: auto !important;
|
||||
}
|
||||
|
||||
.dropdown-mega .title {
|
||||
@@ -382,19 +462,7 @@ html[dir="rtl"] .dropdown-menu {
|
||||
right: auto;
|
||||
}
|
||||
|
||||
html[dir="ltr"] .dropdown-menu[data-bs-popper] {
|
||||
top: auto;
|
||||
left: auto;
|
||||
right: 0;
|
||||
margin-top: 0 !important;
|
||||
}
|
||||
|
||||
html[dir="rtl"] .dropdown-menu[data-bs-popper] {
|
||||
top: auto;
|
||||
left: 0;
|
||||
right: auto;
|
||||
margin-top: 0 !important;
|
||||
}
|
||||
/* Bootstrap Popper positioning overrides removed - dropdowns now position naturally relative to their buttons */
|
||||
|
||||
.dropdown-menu-wrapper {
|
||||
padding: 1.5rem 0;
|
||||
@@ -477,9 +545,8 @@ html[dir="rtl"] .dropdown-menu[data-bs-popper] {
|
||||
display: flex;
|
||||
gap: 30px;
|
||||
justify-content: center;
|
||||
width: 140%;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
left: -20%;
|
||||
}
|
||||
|
||||
.feature-group {
|
||||
|
||||
@@ -1,79 +1,79 @@
|
||||
:root {
|
||||
/* Colors */
|
||||
--md-sys-color-primary: rgb(162 201 255);
|
||||
--md-sys-color-surface-tint: rgb(162 201 255);
|
||||
--md-sys-color-on-primary: rgb(0 49 92);
|
||||
--md-sys-color-primary-container: rgb(0 118 208);
|
||||
--md-sys-color-on-primary-container: rgb(255 255 255);
|
||||
--md-sys-color-secondary: rgb(169 201 246);
|
||||
--md-sys-color-on-secondary: rgb(12 49 87);
|
||||
--md-sys-color-secondary-container: rgb(29 62 100);
|
||||
--md-sys-color-on-secondary-container: rgb(180 210 255);
|
||||
--md-sys-color-tertiary: rgb(193 194 248);
|
||||
--md-sys-color-on-tertiary: rgb(42 44 88);
|
||||
--md-sys-color-tertiary-container: rgb(110 112 161);
|
||||
--md-sys-color-on-tertiary-container: rgb(255 255 255);
|
||||
--md-sys-color-error: rgb(255 180 171);
|
||||
--md-sys-color-on-error: rgb(105 0 5);
|
||||
--md-sys-color-error-container: rgb(147 0 10);
|
||||
--md-sys-color-on-error-container: rgb(255 218 214);
|
||||
--md-sys-color-background: rgb(15 20 26);
|
||||
--md-sys-color-on-background: rgb(223 226 235);
|
||||
--md-sys-color-surface: rgb(15 20 26);
|
||||
--md-sys-color-on-surface: rgb(223 226 235);
|
||||
--md-sys-color-surface-variant: rgb(64 71 83);
|
||||
--md-sys-color-on-surface-variant: rgb(192 199 213);
|
||||
--md-sys-color-outline: rgb(138 145 158);
|
||||
--md-sys-color-outline-variant: rgb(64 71 83);
|
||||
--md-sys-color-shadow: rgb(0 0 0);
|
||||
--md-sys-color-scrim: rgb(0 0 0);
|
||||
--md-sys-color-inverse-surface: rgb(223 226 235);
|
||||
--md-sys-color-inverse-on-surface: rgb(45 49 55);
|
||||
--md-sys-color-inverse-primary: rgb(0 96 170);
|
||||
--md-sys-color-primary-fixed: rgb(211 228 255);
|
||||
--md-sys-color-on-primary-fixed: rgb(0 28 56);
|
||||
--md-sys-color-primary-fixed-dim: rgb(162 201 255);
|
||||
--md-sys-color-on-primary-fixed-variant: rgb(0 72 130);
|
||||
--md-sys-color-secondary-fixed: rgb(211 228 255);
|
||||
--md-sys-color-on-secondary-fixed: rgb(0 28 56);
|
||||
--md-sys-color-secondary-fixed-dim: rgb(169 201 246);
|
||||
--md-sys-color-on-secondary-fixed-variant: rgb(40 72 111);
|
||||
--md-sys-color-tertiary-fixed: rgb(225 224 255);
|
||||
--md-sys-color-on-tertiary-fixed: rgb(20 22 66);
|
||||
--md-sys-color-tertiary-fixed-dim: rgb(193 194 248);
|
||||
--md-sys-color-on-tertiary-fixed-variant: rgb(64 67 112);
|
||||
--md-sys-color-surface-dim: rgb(15 20 26);
|
||||
--md-sys-color-surface-bright: rgb(53 57 64);
|
||||
--md-sys-color-surface-container-lowest: rgb(10 14 20);
|
||||
--md-sys-color-surface-container-low: rgb(24 28 34);
|
||||
--md-sys-color-surface-container: rgb(28 32 38);
|
||||
--md-sys-color-surface-container-high: rgb(38 42 49);
|
||||
--md-sys-color-surface-container-highest: rgb(49 53 60);
|
||||
/* Tools Color */
|
||||
--md-nav-section-color-opacity: 1;
|
||||
--md-nav-on-section-color-opacity: 1;
|
||||
--md-nav-section-color-sign: rgba(25, 101, 212, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-sign: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-organize: rgba(120, 130, 255, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-organize: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-convert: rgba(25, 177, 212, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-convert: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-convertto: rgba(104, 220, 149, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-convertto: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-security: rgba(255, 120, 146, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-security: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-other: rgba(72, 189, 84, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-other: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-advance: rgba(245, 84, 84, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-advance: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-image: rgba(212, 172, 25, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-image: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-word: rgba(61, 153, 245, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-word: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-ppt: rgba(255, 128, 0, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-ppt: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-color-on-seperator: rgb(24 28 34);
|
||||
--md-nav-background: rgb(15 20 26);
|
||||
--favourite-add: #9ed18c;
|
||||
--favourite-remove: palevioletred;
|
||||
}
|
||||
/* Colors */
|
||||
--md-sys-color-primary: rgb(162 201 255);
|
||||
--md-sys-color-surface-tint: rgb(162 201 255);
|
||||
--md-sys-color-on-primary: rgb(0 49 92);
|
||||
--md-sys-color-primary-container: rgb(0 118 208);
|
||||
--md-sys-color-on-primary-container: rgb(255 255 255);
|
||||
--md-sys-color-secondary: rgb(169 201 246);
|
||||
--md-sys-color-on-secondary: rgb(12 49 87);
|
||||
--md-sys-color-secondary-container: rgb(29 62 100);
|
||||
--md-sys-color-on-secondary-container: rgb(180 210 255);
|
||||
--md-sys-color-tertiary: rgb(193 194 248);
|
||||
--md-sys-color-on-tertiary: rgb(42 44 88);
|
||||
--md-sys-color-tertiary-container: rgb(110 112 161);
|
||||
--md-sys-color-on-tertiary-container: rgb(255 255 255);
|
||||
--md-sys-color-error: rgb(255 180 171);
|
||||
--md-sys-color-on-error: rgb(105 0 5);
|
||||
--md-sys-color-error-container: rgb(147 0 10);
|
||||
--md-sys-color-on-error-container: rgb(255 218 214);
|
||||
--md-sys-color-background: rgb(15 20 26);
|
||||
--md-sys-color-on-background: rgb(223 226 235);
|
||||
--md-sys-color-surface: rgb(15 20 26);
|
||||
--md-sys-color-on-surface: rgb(223 226 235);
|
||||
--md-sys-color-surface-variant: rgb(64 71 83);
|
||||
--md-sys-color-on-surface-variant: rgb(192 199 213);
|
||||
--md-sys-color-outline: rgb(138 145 158);
|
||||
--md-sys-color-outline-variant: rgb(64 71 83);
|
||||
--md-sys-color-shadow: rgb(0 0 0);
|
||||
--md-sys-color-scrim: rgb(0 0 0);
|
||||
--md-sys-color-inverse-surface: rgb(223 226 235);
|
||||
--md-sys-color-inverse-on-surface: rgb(45 49 55);
|
||||
--md-sys-color-inverse-primary: rgb(0 96 170);
|
||||
--md-sys-color-primary-fixed: rgb(211 228 255);
|
||||
--md-sys-color-on-primary-fixed: rgb(0 28 56);
|
||||
--md-sys-color-primary-fixed-dim: rgb(162 201 255);
|
||||
--md-sys-color-on-primary-fixed-variant: rgb(0 72 130);
|
||||
--md-sys-color-secondary-fixed: rgb(211 228 255);
|
||||
--md-sys-color-on-secondary-fixed: rgb(0 28 56);
|
||||
--md-sys-color-secondary-fixed-dim: rgb(169 201 246);
|
||||
--md-sys-color-on-secondary-fixed-variant: rgb(40 72 111);
|
||||
--md-sys-color-tertiary-fixed: rgb(225 224 255);
|
||||
--md-sys-color-on-tertiary-fixed: rgb(20 22 66);
|
||||
--md-sys-color-tertiary-fixed-dim: rgb(193 194 248);
|
||||
--md-sys-color-on-tertiary-fixed-variant: rgb(64 67 112);
|
||||
--md-sys-color-surface-dim: rgb(15 20 26);
|
||||
--md-sys-color-surface-bright: rgb(53 57 64);
|
||||
--md-sys-color-surface-container-lowest: rgb(10 14 20);
|
||||
--md-sys-color-surface-container-low: rgb(24 28 34);
|
||||
--md-sys-color-surface-container: rgb(28 32 38);
|
||||
--md-sys-color-surface-container-high: rgb(38 42 49);
|
||||
--md-sys-color-surface-container-highest: rgb(49 53 60);
|
||||
/* Tools Color */
|
||||
--md-nav-section-color-opacity: 1;
|
||||
--md-nav-on-section-color-opacity: 1;
|
||||
--md-nav-section-color-sign: rgba(25, 101, 212, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-sign: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-organize: rgba(120, 130, 255, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-organize: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-convert: rgba(25, 177, 212, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-convert: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-convertto: rgba(104, 220, 149, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-convertto: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-security: rgba(255, 120, 146, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-security: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-other: rgba(72, 189, 84, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-other: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-advance: rgba(245, 84, 84, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-advance: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-image: rgba(212, 172, 25, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-image: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-word: rgba(61, 153, 245, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-word: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-ppt: rgba(255, 128, 0, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-ppt: rgba(28, 27, 31, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-color-on-separator: rgb(24 28 34);
|
||||
--md-nav-background: rgb(15 20 26);
|
||||
--favourite-add: #9ed18c;
|
||||
--favourite-remove: palevioletred;
|
||||
}
|
||||
@@ -72,8 +72,8 @@
|
||||
--md-nav-on-section-color-word: rgba(255, 251, 254, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-section-color-ppt: rgba(255, 128, 0, var(--md-nav-section-color-opacity));
|
||||
--md-nav-on-section-color-ppt: rgba(255, 251, 254, var(--md-nav-on-section-color-opacity));
|
||||
--md-nav-color-on-seperator: rgb(174, 178, 179);
|
||||
--md-nav-color-on-separator: rgb(174, 178, 179);
|
||||
--md-nav-background: rgb(248 249 255);
|
||||
--favourite-add: #25ab6c;
|
||||
--favourite-remove: rgb(222, 94, 137);
|
||||
}
|
||||
}
|
||||
@@ -125,6 +125,16 @@ export class DecryptFile {
|
||||
} else if (error.code === pdfjsLib.PasswordResponses.INCORRECT_PASSWORD) {
|
||||
return {isEncrypted: true, requiresPassword: false};
|
||||
}
|
||||
} else if (error.name === 'InvalidPDFException' ||
|
||||
(error.message && error.message.includes('Invalid PDF structure'))) {
|
||||
// Handle corrupted PDF files
|
||||
console.error('Corrupted PDF detected:', error);
|
||||
this.showErrorBanner(
|
||||
`${window.stirlingPDF.pdfCorruptedMessage.replace('{0}', file.name)}`,
|
||||
error.stack || '',
|
||||
`${window.stirlingPDF.tryRepairMessage}`
|
||||
);
|
||||
throw new Error('PDF file is corrupted.');
|
||||
}
|
||||
|
||||
console.error('Error checking encryption:', error);
|
||||
|
||||
@@ -2,6 +2,13 @@
|
||||
if (window.isDownloadScriptInitialized) return; // Prevent re-execution
|
||||
window.isDownloadScriptInitialized = true;
|
||||
|
||||
// Global PDF processing count tracking for survey system
|
||||
window.incrementPdfProcessingCount = function() {
|
||||
let pdfProcessingCount = parseInt(localStorage.getItem('pdfProcessingCount') || '0');
|
||||
pdfProcessingCount++;
|
||||
localStorage.setItem('pdfProcessingCount', pdfProcessingCount.toString());
|
||||
};
|
||||
|
||||
const {
|
||||
pdfPasswordPrompt,
|
||||
multipleInputsForSingleRequest,
|
||||
@@ -193,13 +200,13 @@
|
||||
if (error.name === 'PasswordException' && error.code === 1) {
|
||||
console.log(`PDF requires password: ${file.name}`, error);
|
||||
console.log(`Attempting to remove password from PDF: ${file.name} with password.`);
|
||||
const password = prompt(`${window.translations.decrypt.passwordPrompt}`);
|
||||
const password = prompt(`${window.decrypt.passwordPrompt}`);
|
||||
|
||||
if (!password) {
|
||||
console.error(`No password provided for encrypted PDF: ${file.name}`);
|
||||
showErrorBanner(
|
||||
`${window.translations.decrypt.noPassword.replace('{0}', file.name)}`,
|
||||
`${window.translations.decrypt.unexpectedError}`
|
||||
`${window.decrypt.noPassword.replace('{0}', file.name)}`,
|
||||
`${window.decrypt.unexpectedError}`
|
||||
);
|
||||
throw error;
|
||||
}
|
||||
@@ -233,11 +240,20 @@
|
||||
} catch (decryptError) {
|
||||
console.error(`Failed to decrypt PDF: ${file.name}`, decryptError);
|
||||
showErrorBanner(
|
||||
`${window.translations.invalidPasswordHeader.replace('{0}', file.name)}`,
|
||||
`${window.translations.invalidPassword}`
|
||||
`${window.decrypt.invalidPasswordHeader.replace('{0}', file.name)}`,
|
||||
`${window.decrypt.invalidPassword}`
|
||||
);
|
||||
throw decryptError;
|
||||
}
|
||||
} else if (error.name === 'InvalidPDFException' ||
|
||||
(error.message && error.message.includes('Invalid PDF structure'))) {
|
||||
// Handle corrupted PDF files
|
||||
console.log(`Corrupted PDF detected: ${file.name}`, error);
|
||||
showErrorBanner(
|
||||
`${window.stirlingPDF.pdfCorruptedMessage.replace('{0}', file.name)}`,
|
||||
`${window.stirlingPDF.tryRepairMessage}`
|
||||
);
|
||||
throw error;
|
||||
} else {
|
||||
console.log(`Error loading PDF: ${file.name}`, error);
|
||||
throw error;
|
||||
@@ -303,6 +319,11 @@
|
||||
pdf_pages: pageCount,
|
||||
});
|
||||
}
|
||||
|
||||
// Increment PDF processing count for survey tracking
|
||||
if (success && typeof window.incrementPdfProcessingCount === 'function') {
|
||||
window.incrementPdfProcessingCount();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -226,7 +226,8 @@ function setupFileInput(chooser) {
|
||||
|
||||
try {
|
||||
const { isEncrypted, requiresPassword } = await decryptFile.checkFileEncrypted(file);
|
||||
if (file.type === 'application/pdf' && isEncrypted) {
|
||||
if (file.type === 'application/pdf' && isEncrypted &&
|
||||
!window.location.pathname.includes('remove-password')) {
|
||||
decryptedFile = await decryptFile.decryptFile(file, requiresPassword);
|
||||
if (!decryptedFile) throw new Error('File decryption failed.');
|
||||
}
|
||||
@@ -235,6 +236,13 @@ function setupFileInput(chooser) {
|
||||
|
||||
} catch (error) {
|
||||
console.error(`Error decrypting file: ${file.name}`, error);
|
||||
|
||||
// Check if this is a PDF corruption error
|
||||
if (error.message && error.message.includes('PDF file is corrupted')) {
|
||||
// The error banner is already shown by DecryptFiles.js, just continue with the file
|
||||
console.warn(`Continuing with corrupted PDF file: ${file.name}`);
|
||||
}
|
||||
|
||||
if (!file.uniqueId) file.uniqueId = UUID.uuidv4();
|
||||
return file;
|
||||
}
|
||||
|
||||
@@ -271,6 +271,11 @@ class PdfContainer {
|
||||
pdf_pages: pageCount,
|
||||
});
|
||||
}
|
||||
|
||||
// Increment PDF processing count for survey tracking
|
||||
if (success && typeof window.incrementPdfProcessingCount === 'function') {
|
||||
window.incrementPdfProcessingCount();
|
||||
}
|
||||
} catch { }
|
||||
}
|
||||
|
||||
|
||||
@@ -66,19 +66,16 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
const dontShowAgain = document.getElementById('dontShowAgain');
|
||||
const takeSurveyButton = document.getElementById('takeSurvey');
|
||||
|
||||
const viewThresholds = [5, 10, 15, 22, 30, 50, 75, 100, 150, 200];
|
||||
const pdfProcessingThresholds = [8, 15, 22, 35, 50, 75, 100, 150];
|
||||
|
||||
// Check if survey version changed and reset page views if it did
|
||||
// Check if survey version changed and reset PDF processing count if it did
|
||||
const storedVersion = localStorage.getItem('surveyVersion');
|
||||
if (storedVersion && storedVersion !== surveyVersion) {
|
||||
localStorage.setItem('pageViews', '0');
|
||||
localStorage.setItem('pdfProcessingCount', '0');
|
||||
localStorage.setItem('surveyVersion', surveyVersion);
|
||||
}
|
||||
|
||||
let pageViews = parseInt(localStorage.getItem('pageViews') || '0');
|
||||
|
||||
pageViews++;
|
||||
localStorage.setItem('pageViews', pageViews.toString());
|
||||
let pdfProcessingCount = parseInt(localStorage.getItem('pdfProcessingCount') || '0');
|
||||
|
||||
function shouldShowSurvey() {
|
||||
if(!window.showSurvey) {
|
||||
@@ -90,11 +87,11 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
}
|
||||
|
||||
// If survey version changed and we hit a threshold, show the survey
|
||||
if (localStorage.getItem('surveyVersion') !== surveyVersion && viewThresholds.includes(pageViews)) {
|
||||
if (localStorage.getItem('surveyVersion') !== surveyVersion && pdfProcessingThresholds.includes(pdfProcessingCount)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return viewThresholds.includes(pageViews);
|
||||
return pdfProcessingThresholds.includes(pdfProcessingCount);
|
||||
}
|
||||
|
||||
if (shouldShowSurvey()) {
|
||||
|
||||
@@ -1838,7 +1838,7 @@
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.annotationEditorLayer freeTextEditor .overlay.enabled {
|
||||
.annotationEditorLayer .freeTextEditor .overlay.enabled {
|
||||
display: block;
|
||||
}
|
||||
|
||||
|
||||
@@ -1852,7 +1852,7 @@
|
||||
height:100%;
|
||||
}
|
||||
|
||||
.annotationEditorLayer freeTextEditor .overlay.enabled{
|
||||
.annotationEditorLayer .freeTextEditor .overlay.enabled{
|
||||
display:block;
|
||||
}
|
||||
|
||||
|
||||
@@ -206,7 +206,7 @@
|
||||
<div class="data-form-group">
|
||||
<label for="username" class="data-form-label" th:text="#{username}">Username</label>
|
||||
<select name="username" id="username" class="data-form-control" required>
|
||||
<option value="" disabled selected th:text="#{selectFillter}">-- Select --</option>
|
||||
<option value="" disabled selected th:text="#{selectFilter}">-- Select --</option>
|
||||
<option th:each="user : ${users}" th:if="${user.username != currentUsername}" th:value="${user.username}" th:text="${user.username}">Username</option>
|
||||
</select>
|
||||
</div>
|
||||
@@ -214,7 +214,7 @@
|
||||
<div class="data-form-group">
|
||||
<label for="role" class="data-form-label" th:text="#{adminUserSettings.role}">Role</label>
|
||||
<select name="role" id="role" class="data-form-control" required>
|
||||
<option value="" disabled selected th:text="#{selectFillter}">-- Select --</option>
|
||||
<option value="" disabled selected th:text="#{selectFilter}">-- Select --</option>
|
||||
<option th:each="roleDetail : ${roleDetails}" th:value="${roleDetail.key}" th:text="#{${roleDetail.value}}">Role</option>
|
||||
</select>
|
||||
</div>
|
||||
@@ -222,7 +222,7 @@
|
||||
<div class="data-form-group">
|
||||
<label for="team" class="data-form-label" th:text="#{adminUserSettings.team}">Team</label>
|
||||
<select name="teamId" id="team" class="data-form-control" required>
|
||||
<option value="" th:text="#{selectFillter}">-- Select --</option>
|
||||
<option value="" th:text="#{selectFilter}">-- Select --</option>
|
||||
<option th:each="team : ${teams}" th:value="${team.id}" th:text="${team.name}"></option>
|
||||
</select>
|
||||
</div>
|
||||
@@ -279,7 +279,7 @@
|
||||
<div class="data-form-group">
|
||||
<label for="role" class="data-form-label" th:text="#{adminUserSettings.role}">Role</label>
|
||||
<select name="role" class="data-form-control" id="role" required>
|
||||
<option value="" disabled selected th:text="#{selectFillter}">-- Select --</option>
|
||||
<option value="" disabled selected th:text="#{selectFilter}">-- Select --</option>
|
||||
<option th:each="roleDetail : ${roleDetails}" th:value="${roleDetail.key}" th:text="#{${roleDetail.value}}">Role</option>
|
||||
</select>
|
||||
</div>
|
||||
@@ -287,7 +287,7 @@
|
||||
<div class="data-form-group">
|
||||
<label for="team" class="data-form-label" th:text="#{adminUserSettings.team}">Team</label>
|
||||
<select name="teamId" class="data-form-control" required>
|
||||
<option value="" th:text="#{selectFillter}">-- Select --</option>
|
||||
<option value="" th:text="#{selectFilter}">-- Select --</option>
|
||||
<option th:each="team : ${teams}" th:value="${team.id}" th:text="${team.name}"></option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@@ -23,6 +23,102 @@
|
||||
|
||||
<script>
|
||||
window.stirlingPDF = window.stirlingPDF || {};
|
||||
|
||||
// Capture true system DPI at page load (before any zoom interactions)
|
||||
const systemDPR = window.devicePixelRatio || 1;
|
||||
|
||||
// Determine if this is actually a high DPI screen at page load
|
||||
const isHighDPI = systemDPR > 1.4;
|
||||
|
||||
function scaleNav() {
|
||||
const currentDPR = window.devicePixelRatio || 1;
|
||||
const browserZoom = currentDPR / systemDPR;
|
||||
|
||||
// Counter-scale to maintain same visual size
|
||||
const isMobile = window.innerWidth <= 768 && /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
||||
let baseScale = isMobile ? 3 : (isHighDPI ? 2.2 : 1.1); // Prioritize mobile scaling over high DPI
|
||||
const navScale = baseScale / currentDPR;
|
||||
// Dropdowns at 80% (20% smaller)
|
||||
const dropdownScale = 0.8;
|
||||
|
||||
|
||||
const navbar = document.querySelector('.navbar');
|
||||
|
||||
if (navbar) {
|
||||
// RTL support - check document direction
|
||||
const isRTL = document.documentElement.dir === 'rtl' || document.documentElement.getAttribute('dir') === 'rtl';
|
||||
|
||||
const translateX = isRTL ? '50%' : '-50%';
|
||||
navbar.style.transform = `translateX(${translateX}) scale(${navScale})`;
|
||||
navbar.style.transformOrigin = 'top center';
|
||||
navbar.style.width = `${100 / navScale}%`;
|
||||
|
||||
if (isRTL) {
|
||||
navbar.style.right = '50%';
|
||||
navbar.style.left = 'auto';
|
||||
} else {
|
||||
navbar.style.left = '50%';
|
||||
navbar.style.right = 'auto';
|
||||
}
|
||||
|
||||
// Adjust bottom margin based on scale to prevent overlap/gaps
|
||||
const baseHeight = 60; // Assume base navbar height
|
||||
const scaledHeight = baseHeight * navScale;
|
||||
const marginAdjustment = scaledHeight - baseHeight;
|
||||
navbar.style.marginBottom = `${marginAdjustment}px`;
|
||||
|
||||
// Adjust responsive breakpoint based on effective width after scaling
|
||||
const effectiveWidth = window.innerWidth / navScale;
|
||||
if (effectiveWidth >= 1200) {
|
||||
navbar.classList.add('navbar-expand-lg');
|
||||
navbar.classList.remove('navbar-expand-xl');
|
||||
} else {
|
||||
navbar.classList.add('navbar-expand-xl');
|
||||
navbar.classList.remove('navbar-expand-lg');
|
||||
}
|
||||
|
||||
|
||||
console.log('DPR:', currentDPR, 'isHighDPI:', isHighDPI, 'baseScale:', baseScale, 'navScale:', navScale, 'effective width:', effectiveWidth);
|
||||
}
|
||||
|
||||
// Set CSS custom property for mobile navbar scaling (for sidebar positioning)
|
||||
// Use the ACTUAL scaled height, not a fixed assumption
|
||||
const baseHeight = 60;
|
||||
const actualScaledHeight = baseHeight * navScale;
|
||||
document.documentElement.style.setProperty('--navbar-height', `${actualScaledHeight}px`);
|
||||
|
||||
setTimeout(() => {
|
||||
const dropdowns = document.querySelectorAll('.dropdown-menu');
|
||||
dropdowns.forEach(dropdown => {
|
||||
dropdown.style.transform = `scale(${dropdownScale})`;
|
||||
|
||||
// Use different transform origins based on dropdown position
|
||||
const parentItem = dropdown.closest('.nav-item');
|
||||
const navbar = dropdown.closest('.navbar-nav');
|
||||
|
||||
// Check if this is a right-aligned dropdown (language, favorites, search, etc.)
|
||||
const isRightAligned = navbar && navbar.classList.contains('flex-nowrap') &&
|
||||
!parentItem?.closest('.dropdown-mega');
|
||||
|
||||
dropdown.style.transformOrigin = isRightAligned ? 'top right' : 'top left';
|
||||
});
|
||||
|
||||
console.log('Applied dropdown scale:', dropdownScale);
|
||||
}, 100);
|
||||
}
|
||||
|
||||
let lastDPR = window.devicePixelRatio;
|
||||
|
||||
document.addEventListener('DOMContentLoaded', scaleNav);
|
||||
window.addEventListener('resize', scaleNav);
|
||||
|
||||
setInterval(() => {
|
||||
const currentDPR = window.devicePixelRatio;
|
||||
if (Math.abs(currentDPR - lastDPR) > 0.01) {
|
||||
lastDPR = currentDPR;
|
||||
scaleNav();
|
||||
}
|
||||
}, 100);
|
||||
</script>
|
||||
<script th:src="@{'/js/thirdParty/pdf-lib.min.js'}"></script>
|
||||
<script th:src="@{'/js/fetch-utils.js'}"></script>
|
||||
@@ -250,6 +346,8 @@
|
||||
window.stirlingPDF.uploadLimit = /*[[${@uploadLimitService.getUploadLimit()}]]*/ 0;
|
||||
window.stirlingPDF.uploadLimitExceededSingular = /*[[#{uploadLimitExceededSingular}]]*/ 'is too large. Maximum allowed size is';
|
||||
window.stirlingPDF.uploadLimitExceededPlural = /*[[#{uploadLimitExceededPlural}]]*/ 'are too large. Maximum allowed size is';
|
||||
window.stirlingPDF.pdfCorruptedMessage = /*[[#{error.pdfInvalid}]]*/ 'The PDF file "{0}" appears to be corrupted or has an invalid structure. Please try using the \'Repair PDF\' feature to fix the file before proceeding.';
|
||||
window.stirlingPDF.tryRepairMessage = /*[[#{error.tryRepair}]]*/ 'Try using the Repair PDF feature to fix corrupted files.';
|
||||
})();
|
||||
</script>
|
||||
<script type="module" th:src="@{'/pdfjs-legacy/pdf.mjs'}"></script>
|
||||
@@ -287,10 +385,10 @@
|
||||
Browse
|
||||
</label>
|
||||
<div class="d-flex flex-column align-items-center">
|
||||
<div class="d-flex justify-content-start align-items-center" id="fileInputText">
|
||||
<div th:text="#{fileChooser.click}" style="margin-right: 5px"></div>
|
||||
<div th:text="#{fileChooser.or}" style="margin-right: 5px"></div>
|
||||
<div th:text="#{fileChooser.dragAndDrop}" id="dragAndDrop"></div>
|
||||
<div class="text-center" id="fileInputText" style="word-wrap: break-word; hyphens: auto; line-height: 1.2;">
|
||||
<span th:text="#{fileChooser.click}"></span>
|
||||
<span th:text="#{fileChooser.or}" style="margin: 0 5px;"></span>
|
||||
<span th:text="#{fileChooser.dragAndDrop}" id="dragAndDrop"></span>
|
||||
</div>
|
||||
<hr th:if="${@GoogleDriveEnabled == true}" class="horizontal-divider" >
|
||||
</div>
|
||||
@@ -325,4 +423,4 @@
|
||||
window.stirlingPDF.GoogleDriveAppId = /*[[${@GoogleDriveConfig.getAppId()}]]*/ null;
|
||||
</script>
|
||||
</div>
|
||||
</th:block>
|
||||
</th:block>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<footer th:fragment="footer" id="footer" class="text-center pt-5">
|
||||
<footer th:fragment="footer" id="footer" class="text-center">
|
||||
|
||||
<script type="module" th:src="@{'/js/thirdParty/cookieconsent-config.js'}"></script>
|
||||
<div class="footer-center pb-4">
|
||||
<div class="footer-center">
|
||||
<!-- Links section -->
|
||||
<div class="d-flex justify-content-center">
|
||||
<ul class="list-unstyled footer-link-list">
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
background: var(--md-nav-background);
|
||||
border-bottom-style: solid;
|
||||
border-bottom-width: 1px;
|
||||
border-color: var(--md-nav-color-on-seperator)">
|
||||
<div class="container ">
|
||||
border-color: var(--md-nav-color-on-separator)">
|
||||
<div class="container " style="max-width: 100%;">
|
||||
<a class="navbar-brand" th:href="${@contextPath}" style="display: flex;">
|
||||
<img class="main-icon" th:src="@{'/favicon.svg'}" alt="icon">
|
||||
<span class="icon-text" th:text="${@navBarText}"></span>
|
||||
|
||||
@@ -7,10 +7,9 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="page-container">
|
||||
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
||||
<div style="transform-origin: top;"
|
||||
id="scale-wrap">
|
||||
<div class="page-container" style="max-height:100vh;">
|
||||
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
||||
<div style="transform-origin: center top; flex:0 1 auto; display:flex; flex-direction:column; align-items:center; justify-content:flex-start;" id="scale-wrap">
|
||||
<br class="d-md-none">
|
||||
<!-- Features -->
|
||||
<script th:src="@{'/js/homecard.js'}"></script>
|
||||
@@ -27,9 +26,9 @@
|
||||
<div
|
||||
style="display:flex; flex-direction: column; justify-content: center; width:100%; margin-bottom:1rem">
|
||||
<div style="width:fit-content; margin: 0 auto; padding: 0 3rem">
|
||||
<p class="lead fs-4"
|
||||
<div class="lead fs-4"
|
||||
th:text="${@homeText != 'null' and @homeText != null and @homeText != ''} ? ${@homeText} : #{home.desc}">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="groupRecent" style="width: fit-content; margin: 0 auto">
|
||||
<div
|
||||
@@ -37,10 +36,10 @@
|
||||
</div>
|
||||
<div class="recent-features">
|
||||
<div class="newfeature"
|
||||
th:insert="~{fragments/navbarEntryCustom :: navbarEntry('redact', '/images/redact-manual.svg#icon-redact-manual', 'home.redact.title', 'home.redact.desc', 'redact.tags', 'security')}">
|
||||
th:insert="~{fragments/navbarEntry :: navbarEntry('add-attachments', 'attachment', 'home.attachments.title', 'home.attachments.desc', 'attachments.tags', 'other')}">
|
||||
</div>
|
||||
<div class="newfeature"
|
||||
th:insert="~{fragments/navbarEntry :: navbarEntry ('multi-tool', 'construction', 'home.multiTool.title', 'home.multiTool.desc', 'multiTool.tags', 'organize')}">
|
||||
th:insert="~{fragments/navbarEntry :: navbarEntry('fake-scan', 'scanner', 'fakeScan.title', 'fakeScan.description', 'fakeScan.tags', 'advance')}">
|
||||
</div>
|
||||
<div class="newfeature"
|
||||
th:insert="~{fragments/navbarEntry :: navbarEntry('compress-pdf', 'zoom_in_map', 'home.compressPdfs.title', 'home.compressPdfs.desc', 'compressPDFs.tags', 'advance')}">
|
||||
@@ -53,10 +52,9 @@
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<span class="material-symbols-rounded search-icon">
|
||||
search
|
||||
</span>
|
||||
<input type="text" id="searchBar" onkeyup="filterCards()" th:placeholder="#{home.searchBar}" autofocus>
|
||||
<div style="display: flex; align-items: center; gap: 0.5rem;">
|
||||
<input type="text" id="searchBar" onkeyup="filterCards()" th:placeholder="#{home.searchBar}" autofocus>
|
||||
</div>
|
||||
|
||||
<div style="display: flex; column-gap: 3rem; flex-wrap: wrap; margin-left:1rem">
|
||||
<div
|
||||
@@ -70,7 +68,7 @@
|
||||
</select>
|
||||
</div>
|
||||
<div
|
||||
style="display: flex; align-items: center; flex-wrap: wrap; align-content: flex-start; width: fit-content; max-width: 100%; gap:2rem; justify-content: center;">
|
||||
style="display: flex; align-items: center; flex-wrap: wrap; align-content: flex-start; width: fit-content; max-width: 100%; gap:2rem; justify-content: center;" >
|
||||
<div th:title="#{home.setFavorites}" style="display: flex; align-items: center; cursor: pointer;"
|
||||
onclick="toggleFavoritesMode()">
|
||||
<span class="material-symbols-rounded toggle-favourites"
|
||||
@@ -101,9 +99,10 @@
|
||||
</div>
|
||||
<div>
|
||||
</div>
|
||||
<div style="width:100%; overflow-x:visible;">
|
||||
<div class="features-container" style=" border-top: 1px;
|
||||
border-top-style: solid;
|
||||
border-color: var(--md-nav-color-on-seperator);
|
||||
border-color: var(--md-nav-color-on-separator);
|
||||
margin-top: 1rem;
|
||||
">
|
||||
<div class="feature-rows">
|
||||
@@ -117,9 +116,10 @@
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -218,21 +218,77 @@
|
||||
</script>
|
||||
<script th:src="@{'/js/pages/home.js'}" th:inline="javascript"></script>
|
||||
<script>
|
||||
function applyScale() {
|
||||
const baseWidth = 1440;
|
||||
const baseHeight = 1000;
|
||||
const scaleX = window.innerWidth / baseWidth;
|
||||
const scaleY = window.innerHeight / baseHeight;
|
||||
const scale = Math.max(0.9, Math.min(scaleX, scaleY)); // keep aspect ratio, honor minScale
|
||||
const ui = document.getElementById('scale-wrap');
|
||||
ui.style.transform = `scale(${scale*0.75})`;
|
||||
function scaleStuff() {
|
||||
const w = 1440;
|
||||
const h = 1000;
|
||||
|
||||
const sx = window.innerWidth / w;
|
||||
const sy = window.innerHeight / h;
|
||||
const s = Math.max(0.9, Math.min(sx, sy));
|
||||
const el = document.getElementById('scale-wrap');
|
||||
const container = document.querySelector('.page-container');
|
||||
|
||||
const nav = document.querySelector('.navbar, nav');
|
||||
const navH = nav ? nav.offsetHeight : 0;
|
||||
const space = container.offsetHeight - navH;
|
||||
const origH = el.scrollHeight;
|
||||
|
||||
// Progressive bonus based on how tall the screen is
|
||||
const aspectRatio = window.innerWidth / window.innerHeight;
|
||||
const tallScreenBonus = Math.max(0, (1.8 - aspectRatio) * 0.15); // More bonus for taller screens
|
||||
|
||||
let finalS = Math.min(s * 0.75, (space * (0.98 + tallScreenBonus)) / origH);
|
||||
finalS = Math.max(0.7, Math.min(1.0, finalS)); // Never scale above 100%
|
||||
|
||||
el.style.transform = `scale(${finalS})`;
|
||||
el.style.transformOrigin = 'top center';
|
||||
el.style.height = `${origH * finalS}px`;
|
||||
|
||||
// Dynamically adjust features container width based on scale
|
||||
const featuresContainer = document.querySelector('.features-container');
|
||||
if (featuresContainer) {
|
||||
const isRTL = document.documentElement.dir === 'rtl' || document.documentElement.getAttribute('dir') === 'rtl';
|
||||
const dynamicWidth = Math.min(120, 100 / finalS);
|
||||
const offset = (dynamicWidth - 100) / 2;
|
||||
|
||||
featuresContainer.style.width = `${dynamicWidth}%`;
|
||||
|
||||
if (isRTL) {
|
||||
featuresContainer.style.right = `-${offset}%`;
|
||||
featuresContainer.style.left = 'auto';
|
||||
} else {
|
||||
featuresContainer.style.left = `-${offset}%`;
|
||||
featuresContainer.style.right = 'auto';
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
window.addEventListener('resize', applyScale);
|
||||
window.addEventListener('load', applyScale);
|
||||
let prevW = window.innerWidth;
|
||||
let prevH = window.innerHeight;
|
||||
let prevDPR = window.devicePixelRatio;
|
||||
|
||||
function onResize() {
|
||||
const w = window.innerWidth;
|
||||
const h = window.innerHeight;
|
||||
const dpr = window.devicePixelRatio;
|
||||
|
||||
if (w !== prevW || h !== prevH) {
|
||||
if (dpr === prevDPR) {
|
||||
scaleStuff();
|
||||
}
|
||||
}
|
||||
|
||||
prevW = w;
|
||||
prevH = h;
|
||||
prevDPR = dpr;
|
||||
}
|
||||
|
||||
window.addEventListener('load', () => {
|
||||
setTimeout(scaleStuff, 100);
|
||||
});
|
||||
|
||||
window.addEventListener('resize', onResize);
|
||||
</script>
|
||||
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
<label th:text="#{ocr.selectText.10}"></label>
|
||||
<select class="form-control" name="ocrType">
|
||||
<option value="skip-text" th:text="#{ocr.selectText.6}"></option>
|
||||
<option value="force-ocr" th:text="#{ocr.selectText.7}"></option>
|
||||
<option selected value="force-ocr" th:text="#{ocr.selectText.7}"></option>
|
||||
<option value="Normal" th:text="#{ocr.selectText.8}"></option>
|
||||
</select>
|
||||
</div>
|
||||
@@ -79,6 +79,30 @@
|
||||
</select>
|
||||
</div>
|
||||
<br>
|
||||
<div class="mb-3" th:if="${@endpointConfiguration.isGroupEnabled('OCRmyPDF')}">
|
||||
<label class="form-label">OCR Options</label>
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="sidecar" name="sidecar" value="true">
|
||||
<label class="form-check-label" for="sidecar">Include OCR text in sidecar text file</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="deskew" name="deskew" value="true">
|
||||
<label class="form-check-label" for="deskew">Deskew input file</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="clean" name="clean" value="true">
|
||||
<label class="form-check-label" for="clean">Clean input file</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="cleanFinal" name="cleanFinal" value="true">
|
||||
<label class="form-check-label" for="cleanFinal">Clean final output</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="removeImagesAfter" name="removeImagesAfter" value="true">
|
||||
<label class="form-check-label" for="removeImagesAfter">Remove images from output PDF</label>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{ocr.submit}"></button>
|
||||
</form>
|
||||
<script th:inline="javascript">
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user